javascript - 如何在 IE11 中使用 TextEncoder?

标签 javascript buffer window.crypto

我正在尝试散列一个字符串。但是在 IE11 和 Safari 中,函数 TextEncoder 的替代方案是什么?

var string = "foobar";

window.crypto.subtle.digest(

    { "name": "SHA-256" },

    new TextEncoder("utf-8").encode(string)).then(function (hash)
    {
        console.log(hex(hash)); // 'c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2'
    }
);

var string = "foobar";

var buffer = new TextEncoder("utf-8").encode(string); // Uint8Array (ArrayBuffer)
var string = new TextDecoder("utf-8").decode(buffer); // string

console.log("buffer", buffer);
console.log("string '" + string + "'");

hex 是我从 mozilla 得到的函数

https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest

最佳答案

编辑:我刚刚结束使用来自 http://www.movable-type.co.uk/scripts/sha256.html 的 SHA256 例程因为我不需要高性能,代码又短又甜,到处都使用相同的代码路径。 crypto.subtle API 原来有太多对我来说失败的 Angular 落案例(我在一些移动设备上遇到问题,除了下面链接的 Chrome 问题让我很伤心,我也需要支持旧浏览器)。

我为 IE11 编写了这个对我有用的函数(虽然几乎没有测试过):

    function textEncode(str) {
        if (window.TextEncoder) {
            return new TextEncoder('utf-8').encode(str);
        }
        var utf8 = unescape(encodeURIComponent(str));
        var result = new Uint8Array(utf8.length);
        for (var i = 0; i < utf8.length; i++) {
            result[i] = utf8.charCodeAt(i);
        }
        return result;
    }

请注意还有其他问题,因为 IE11 没有 promise ,并且 msCrypto.subtle.digest() 是同步的。以下可能对您有用,但您应该修复这些黑客(它需要努力使其健壮并使用 Promise polyfill):

function sha256(str) {
    function hex(buffer) {
        var hexCodes = [];
        var view = new DataView(buffer);
        for (var i = 0; i < view.byteLength; i += 4) {
            var value = view.getUint32(i);
            var stringValue = value.toString(16);
            var padding = '00000000';
            var paddedValue = (padding + stringValue).slice(-padding.length);
            hexCodes.push(paddedValue);
        }
        return hexCodes.join('');
    }
    var buffer = textEncode(str);
    var res = crypto.subtle.digest('SHA-256', buffer);
    if (res.then) {
        return res.then(function (hash) {
            return hex(hash);
        });
    } else if (res.result) {    // IE11
        return {
            then: function(resolver) {
                resolver(hex(res.result));
            }
        }
    }
}

还要注意 this Chrome issue您可以使用正则表达式 /^https:|^file:|^http:\/\/localhost|^http:\/\/127.0.0.1/.test(location.protocol) 来测试。

关于javascript - 如何在 IE11 中使用 TextEncoder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35419421/

相关文章:

javascript - 在 JavaScript 中合并两个图像

javascript - 使用概率选择数组值

javascript - 正则表达式不转义特殊字符

Javascript - 如何将缓冲区转换为字符串?

image - kivy:可以使用缓冲区作为图像源吗?

javascript - Internet Explorer 11 中的 crypto.getRandomValues 有什么问题?

javascript - AngularJS-Toaster toastr 容器中的 toast 数量

swift - 音频流格式和数据类型与 Core Audio 的混淆

javascript - window.crypto 返回 352 位 key 而不是 256?