Почему crypto.subtle.digest возвращает пустой объект

У меня есть следующий простой код:

inputBytes = new TextEncoder().encode(inputString)
hashBytes = await window.crypto.subtle.digest("SHA-256", inputBytes)
console.log((typeof hashBytes) + ":  " + JSON.stringify(hashBytes))

Почему в результате получается пустой объект? Как я могу получить реальный результат?

Это так странно, любая помощь очень ценится

https://codepen.io/JhonnyJason/pen/QWNOqRJ

1 ответ

Решение

crypto.subtle.digest(algorithm, data) возвращает Promise что удовлетворяет ArrayBuffer содержащий дайджест.

JSON.stringify() ожидает объект JavaScript. ИтакArrayBufferдолжны быть соответственно преобразованы. Одна из возможностей - преобразовать содержимое буфера в шестнадцатеричную строку или строку в кодировке Base64 и использовать результат в объекте JavaScript, например

// from: https://stackru.com/a/40031979/9014097
function buf2hex(buffer) { // buffer is an ArrayBuffer
    return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}

// from https://stackru.com/a/11562550/9014097
function buf2Base64(buffer) {
    return btoa(String.fromCharCode.apply(null, new Uint8Array(buffer)));
}
     
async function test() {
    var inputString = "The quick brown fox jumps over the lazy dog";
    inputBytes = new TextEncoder().encode(inputString);
    hashBytes = await window.crypto.subtle.digest("SHA-256", inputBytes);
    console.log(JSON.stringify({hash: buf2hex(hashBytes)})); // {"hash":"d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592"}
    console.log(JSON.stringify({hash: buf2Base64(hashBytes)})); // {"hash":"16j7swfXgJRpypq8sAguT41WUeRtPNt2LQLQvzfJ5ZI="}
}

test();

Это дает правильный результат, что можно проверить, например, здесь.

Другие вопросы по тегам