是否有任何SHA-256 javascript实现通常被认为是值得信赖的?[已关闭]

2022-08-30 02:40:20

我正在为论坛编写登录名,并且需要在javascript中散列密码客户端,然后再将其发送到服务器。我无法确定我可以实际信任哪个SHA-256实现。我本来以为会有某种权威的脚本,每个人都使用,但我发现很多不同的项目都有自己的实现。

我意识到使用其他人的加密货币总是一个信仰的飞跃,除非你有资格自己审查它,并且没有“值得信赖”的通用定义,但这似乎是一些常见且重要的东西,应该对使用什么有某种共识。我只是天真吗?

编辑,因为它在评论中出现了很多:是的,我们在服务器端再次进行更严格的哈希。客户端哈希不是我们保存在数据库中的最终结果。客户端哈希是因为人工客户端请求它。他们没有给出具体的原因,可能他们只是喜欢过度杀戮。


答案 1

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.subtlehttpslocalhostpython3 -m http.server/etc/hosts0.0.0.0 localhost

重新启动 - 您可以使用 工作 打开 。localhost:8000crypto.subtle


答案 2

过时的:许多现代浏览器现在对加密操作具有一流的支持。请参阅下面的Vitaly Zdanevich的答案


斯坦福JS加密库包含SHA-256的实现。虽然JS中的加密并不像其他实现平台那样经过充分审查,但这个至少部分是由Dan Boneh开发的,并且在某种程度上由Dan Boneh赞助,Dan Boneh是密码学中一个成熟且值得信赖的名字,这意味着该项目有一些监督,他们实际上知道他在做什么。该项目也得到了NSF的支持

然而,值得指出的是...
...如果您在提交密码之前对密码客户端进行哈希处理,则哈希就是密码,而原始密码将变得无关紧要。攻击者只需拦截哈希值即可模拟用户,如果该哈希值未修改地存储在服务器上,则服务器将以纯文本形式存储真正的密码(哈希值)。

因此,您的安全性现在更差,因为您决定将自己改进添加到以前受信任的方案中。