<分区>
我正在为论坛编写登录名,需要在将密码发送到服务器之前在 javascript 中对客户端进行哈希处理。我无法确定我真正可以信任的 SHA-256 实现。我原以为会有某种权威脚本供所有人使用,但我发现大量不同的项目都有自己的实现。
我意识到使用别人的加密货币总是一种信仰的飞跃,除非你有资格自己审查它,并且没有“值得信赖”的通用定义,但这似乎是一种常见且重要的东西,应该就使用什么达成某种共识。我只是天真吗?
编辑,因为它在评论中出现了很多:是的,我们在服务器端再次进行更严格的散列。客户端散列不是我们保存在数据库中的最终结果。客户端散列是因为人类客户端请求它。他们没有给出具体原因,可能他们只是喜欢矫枉过正。
关于 https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest我发现这个使用内部 js 模块的片段:
async function sha256(message) {
// encode as UTF-8
const msgBuffer = new TextEncoder().encode(message);
// hash the message
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
// convert ArrayBuffer to Array
const hashArray = Array.from(new Uint8Array(hashBuffer));
// convert bytes to hex string
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
return hashHex;
}
请注意,crypto.subtle
仅在 https
或 localhost
上可用 - 例如使用 python3 -m 进行本地开发http.server
您需要将此行添加到您的 /etc/hosts
:
0.0.0.0 本地主机
重新启动 - 您可以使用有效的 crypto.subtle
打开 localhost:8000
。