Как мне использовать TextEncoder в IE11?
Я пытаюсь хэшировать строку. Но какова альтернатива для функции TextEncoder в IE11 и Safari?
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
1 ответ
Изменить: я только что закончил с использованием подпрограммы SHA256 из http://www.movable-type.co.uk/scripts/sha256.html потому что мне не нужна высокая производительность, и код короткий и приятный и тот же код путь используется везде. В API crypto.subtle оказалось слишком много угловых случаев, когда он мне не удался (у меня были проблемы на некоторых мобильных устройствах, кроме проблемы 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 нет обещаний, и msCrypto.subtle.digest()
синхронно Следующее может работать для вас, хотя вы должны исправить взломы (необходимо сделать работу, чтобы сделать ее надежной и использовать полифилл Promise):
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));
}
}
}
}
Также знайте об этой проблеме Chrome, которую вы можете использовать регулярное выражение /^https:|^file:|^http:\/\/localhost|^http:\/\/127.0.0.1/.test(location.protocol)
проверить.