如何使用 Web Crypto API 创建哈希?

Mr.*_*eer 6 javascript cryptography ecmascript-6 webcrypto-api

我正在尝试在客户端创建 SHA-1 哈希。我正在尝试使用 Web Crypto API 来做到这一点,但是当我将输出与各种在线工具给我的输出进行比较时,结果完全不同。我认为问题在于 ArrayBuffer 到 Hex 的转换。这是我的代码:

function generateHash() {
            var value = "mypassword";
            var crypto = window.crypto;
            var buffer = new ArrayBuffer(value);
            var hash_bytes = crypto.subtle.digest("SHA-1", buffer);
            hash_bytes.then(value => document.write([...new Uint8Array(value)].map(x => x.toString(16).padStart(2, '0')).join('')));
        }
Run Code Online (Sandbox Code Playgroud)

的输出document.write应该是:

91dfd9ddb4198affc5c194cd8ce6d338fde470e2
Run Code Online (Sandbox Code Playgroud)

但事实并非如此,我得到了不同长度的完全不同的哈希值(应该是 40)。我可以就这个问题提供一些建议吗?谢谢。

Top*_*aco 2

问题似乎更多是从字符串到 的输入转换ArrayBuffer。例如,str2ab()代码有效:

generateHash();

function generateHash() {
    var value = "mypassword";
    var crypto = window.crypto;
    var buffer = str2ab(value); // Fix
    var hash_bytes = crypto.subtle.digest("SHA-1", buffer);
    hash_bytes.then(value => document.write([...new Uint8Array(value)].map(x => x.toString(16).padStart(2, '0')).join('')));
}

// https://stackoverflow.com/a/11058858
function str2ab(str) {
    const buf = new ArrayBuffer(str.length);
    const bufView = new Uint8Array(buf);
    for (let i = 0, strLen = str.length; i < strLen; i++) {
        bufView[i] = str.charCodeAt(i);
    }
    return buf;
}
Run Code Online (Sandbox Code Playgroud)

与预期输出:

91dfd9ddb4198affc5c194cd8ce6d338fde470e2
Run Code Online (Sandbox Code Playgroud)