javascript - 在使用 Dart 的浏览器中使用 scrypt 进行密码验证的适用性

标签 javascript browser cryptography dart scrypt

我编写了一个带有自定义二进制 websocket 协议(protocol)的 Go 服务器和一个 Dart 客户端。服务器上的用户身份验证使用 scrypt和推荐的parameters N=16384,r=8,p=1(salt 长度为 16,生成的 key 长度为 64),我的 i7 台式机可能需要一两秒钟才能在服务器端通过身份验证。这与几乎即时的 SHA-512 身份验证相比。

我很难找到 Dart 的 scrypt 实现,而 this one有效,在浏览器 (Firefox) 中生成具有相同参数的相同散列需要很长时间才能实际完成。我可以在同一台机器上使用 N=1024 和 r<=8 将它减少到几秒钟,但如果我为了兼容性而解决这个问题,在服务器端,身份验证时间再次用于实际目的。

Scrypt 在服务器端很棒,但我想知道它是否适用于浏览器客户端。不可否认,我还没有看到任何/很多人使用 scrypt 进行浏览器身份验证的例子。我应该坚持并解决性能问题(例如,可能使用 dart 中的其他 javascript 库),还是目前这是一个基本限制?在您可以使用更广泛使用、优化的加密哈希算法(例如 SHA)之前,您可以将 scrypt 参数降低到多低?

最佳答案

使用 HTTPS。如果您在浏览器中对密码进行哈希处理,然后将哈希发送到服务器进行比较,如何防止攻击者简单地嗅探哈希密码并通过自己发送相同的哈希来劫持 session ?

即使您提出了一种加密方案来防止这种情况发生,攻击者也可以简单地注入(inject)额外的 <script>通过 MITM 攻击使用键盘记录器标记以在密码加密之前窃取密码。

基本上不管怎么切,都得用HTTPS来保证你的通信是不可嗅探的,没有发生中间人攻击。一旦你的连接已经通过 HTTPS 得到保护,HTTPS 使用(最小)128 位 key 加密并且需要比已知的宇宙年龄更长的时间来破解,你还不如使用 HTTPS 连接来发送你的密码和可能没有必要对密码客户端进行额外的加密。

关于javascript - 在使用 Dart 的浏览器中使用 scrypt 进行密码验证的适用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22641384/

相关文章:

javascript - 通过 jQuery/Javascript 添加悬停 CSS 属性

javascript - 当我们尝试关闭窗口时鼠标悬停并弹出的弹跳

html - favicon.ico 的正确 MIME 类型?

python - CTR 中的 AES 如何与 PyCrypto 一起用于 Python?

java - 保存到文件时无法使用 AES 256 算法解密字符串

java - Bouncy CaSTLe,NoSuchMethodError(org.bouncycaSTLe.asn1.ASN1Integer)

javascript - 如何将一个很长的列变成多个较短的列?

javascript - 刷新 id_token ADAL : Angular 4

browser - PC 上同一浏览器的多个版本

Javascript Canvas Uncaught TypeError : document. getContext 不是函数