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)。我可以就这个问题提供一些建议吗?谢谢。
问题似乎更多是从字符串到 的输入转换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)
| 归档时间: |
|
| 查看次数: |
4489 次 |
| 最近记录: |