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

Javascript scrypt在浏览器中使用Dart进行密码验证的适用性,javascript,browser,cryptography,dart,scrypt,Javascript,Browser,Cryptography,Dart,Scrypt,我已经编写了一个带有自定义二进制websocket协议的Go服务器和一个Dart客户端。服务器上的用户身份验证采用推荐的N=16384,r=8,p=1(salt长度为16,生成的密钥长度为64),我的i7桌面可能需要一两秒钟才能在服务器端完成身份验证。这与几乎即时的SHA-512身份验证相比 我在为Dart找到scrypt实现时遇到了麻烦,而在工作时,在浏览器(Firefox)中使用相同的参数生成相同的哈希值需要很长时间才能实际完成。我可以在同一台机器上使用N=1024和r使用HTTPS将其缩短

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


我在为Dart找到scrypt实现时遇到了麻烦,而在工作时,在浏览器(Firefox)中使用相同的参数生成相同的哈希值需要很长时间才能实际完成。我可以在同一台机器上使用N=1024和r使用HTTPS将其缩短到几秒钟。如果您在浏览器中对密码进行散列,然后将散列发送到服务器进行比较,那么如何防止攻击者通过自己发送相同的散列来嗅探散列密码并劫持会话

即使您提出了一个加密方案来防止这种情况,攻击者也可以通过MITM攻击向键盘记录器注入额外的
标记,在密码加密之前窃取密码


基本上,无论您如何切断它,您都必须使用HTTPS来确保您的通信不可嗅探,并且没有发生MITM攻击。一旦您的连接已经通过HTTPS进行了安全保护,HTTPS使用(最小)128位密钥进行加密,并且需要比已知宇宙年龄更长的时间才能破解,您也可以使用HTTPS连接发送密码,而无需在客户端对密码进行额外加密。

@maaartinus

我从未想过不使用HTTPS。我很好奇,将基于密码的密钥派生开销转移给客户端是否有意义

如果可以的话,我可以从非Web的角度来解决这个问题,然后回到浏览器用例。早在那时,我就使用EFT*POS安全标准,并为金融交易使用安全通信。例如超市里的信用卡机。在这个话题上打下基础。话虽如此,我认为原来的问题已被全面涵盖。我决定添加一条评论,以丰富这方面的对话(这是相当热门的话题)

该过程涉及终端(iPhone、智能手机、浏览器等)之间的对话。前提:您自然不希望任何人嗅探您的用户名/密码配对。假设您在工作时使用典型的网页或登录屏幕。通过Intranet、LAN、WAN和VPN,您键入的每一个内容都会从键盘发送到主机。这些链接现在可能已经被加密了。Internet上的WWW web有两个主要选项:通过浏览器的HTTP(明文)和HTTPS(加密)。如果我们坚持使用(用户名密码)对

您的终端(如浏览器或手机)需要得到主机(服务器、电话公司等)的“信任”

有很多标准的东西你可以(应该)先做;从那以后就要有创造力。把它想象成一个金字塔。底部是你可以在电脑上做的事情。这是金字塔的基础。关于这一点有很多很好的信息(例如),它是关于保护你自己、你的数据(无形财产)和你的权利

也就是说,这里有几点需要考虑:

  • 通过HTTP发送的所有内容都是明文。它可以被阅读和复制。
    • 通过明文发送的散列可以解码以获取密码。这只是数学
    • 即使您使用或其他方法,哈希也是可解码的——只要有足够的时间
    • 如果你在网络上,浏览器(终端/客户端)中实现的任何哈希对任何能够加载网页和javascript代码的人都是透明的[如上所述]
另一方面,将所有内容都作为散列发送。此外,协商使用的散列是会话特有的,并在会话完成时商定。它是整个消息上稍好的-er”散列

首先,让它变得更好的主要因素是协商。总的来说,消息哈希是基于一个只有两个端点都知道的

同样,如果你有足够的时间,这一点也可以被破解,等等。使这一挑战成为挑战的主要因素是为谈判制定往返规则

让我们后退一点并考虑一下。这个概念是以一种允许消息被揭示的方式隐藏消息。把这个看作是锁和钥匙,门是程序/算法,你的信息是房间的内容。

以实用的方式、及时和通过过程将锁与钥匙分开

无论在HTTPS房间里做什么,都要呆在HTTPS房间里。你必须拥有进入、闲逛和做不需要的事情的钥匙。我的意思是,任何额外的安全都应该只在HTTPS空间内考虑

有改进方法的基础。我认为安全性就像一个金字塔。大约4或5层以上的基本考虑,如

这些选择包括

  • 手机短信认证号码
  • 类似加密狗或个性化ID密钥的东西
  • 一种物理消息,如s-mail或带有身份验证号码的电子邮件
  • 你想到什么都行

总之,如果你需要说“确保安全”,有很多事情是可以做到的。如果你不能使用,散列密码本地需要非常小心地管理。散列有漏洞。当您不使用时,您在浏览器中所能做的任何事情都像湿宣纸一样试图抵挡刀剑。

我可能不了解您的使用情况……但您为什么在浏览器中进行密码验证?您使用的是什么散列