我已经编写了一个带有自定义二进制websocket协议的Go服务器和一个Dart客户端。服务器上的用户身份验证使用scrypt,建议parameters N = 16384,r = 8,p = 1(盐长度为16,生成密钥长度为64),我的i7桌面可能需要在服务器端进行身份验证的第二个或第二个。这与SHA-512身份验证几乎是即时的相比。
我很难找到Dart的scrypt实现,而this one工作时,在浏览器(Firefox)中使用相同的参数生成相同的哈希需要太长时间才能完成。我可以使用N = 1024和r <= 8在相同的机器上将其降低到几秒钟但是如果我为了兼容性而坚持这一点,那么在服务器端,验证时间实际上是即时的。
Scrypt在服务器端很棒,但我想知道它对于浏览器客户端是否实用。不可否认,我还没有看到任何人使用scrypt进行浏览器身份验证的例子。我应该坚持并解决性能问题(例如,可能使用来自dart的其他javascript库),或者这是目前的基本限制?在您使用更广泛可用,优化的加密哈希算法(例如SHA)之前,您可以降低scrypt参数的范围有多低?
答案 0 :(得分:1)
@ maaartinus ...
我从没想过不使用HTTPS。我很好奇是否将基于密码的密钥派生开销卸载到客户端是有道理的。
如果可以的话,我可以从非Web方向解决这个问题并回到浏览器用例。回过头来,我使用EFT * POS安全标准并处理金融交易的安全通信。例如;超市里的信用卡机器。建立我对这个主题的基础。也就是说,我认为原始问题已全面涵盖。我决定添加一条评论来丰富这个领域的对话(非常热门)。
程序是关于终端(iPhone,智能手机,浏览器等)之间的对话。前提:您自然不希望任何人嗅探您的用户名/密码配对。假设您的典型网页或登录屏幕正常工作。通过Intranet,LAN,WAN和VPN,您键入的内容将从键盘发送到主机。这些天这些链接可能已加密。 Internet上的WWW Web有两个主要选项:HTTP(明文)和HTTPS(加密)通过浏览器。如果我们坚持使用(用户名,密码)对。
您的终端(例如浏览器或移动设备)需要被信任&#34;由主持人(服务器,电话公司等)。
你可以(应该)先做很多标准的东西;并从那里获得创意。把它想象成金字塔。在底部是您可以在PC上执行的操作。这是金字塔的基础。并且有很多关于此的信息(例如Electronic Frontier Foundation,EFF),它是关于保护自己,您的数据(无形财产)和您的权利。
这里说的有几点需要考虑:
HTTPS发送 Everything-as-a-hash 。此外,使用的散列协商对于会话是唯一的,并且在会话完成时同意。这是一个稍微 更好 -er &#39;散列整个消息。
首先让它变得更好的主要因素是谈判。总体而言,消息哈希值基于只有两个端点都知道的 键 。
如果你有足够的时间等,那么可以再次破解。制造这一挑战的主要方面是为谈判建立往复。
让我们稍微备份并考虑cryptography。这个概念是以允许消息显示的方式隐藏消息。可以将其视为 lock 和 key ,其中门是过程/ 算法,您的消息是内容房间里。
HTTPS致力于以务实的方式,时间和流程将锁与密钥分开。
无论在HTTPS 会议室中做什么,都要留在HTTPS会议室。你必须有钥匙进入,戳和做不需要的东西。 Imho,任何额外的安全性都应该在HTTPS空间中仅进行考虑。
有一些方法可以在此基础上进行改进。我认为安全就像金字塔一样。比transport protocol等基本考虑大约4或5层。
这些选项包括......
总之,如果您需要说安全;有很多事情可以完成。如果您无法使用HTTPS,则需要非常谨慎地管理本地哈希密码。哈希有漏洞。当你不使用HTTPS时,你在浏览器中可以做的任何事情都像湿米纸试图避开一把剑。
答案 1 :(得分:0)
使用HTTPS。如果您在浏览器中对密码进行哈希处理,然后将哈希发送到服务器进行比较,那么是什么阻止攻击者通过自己发送相同的哈希来嗅探哈希密码并劫持会话?
即使你想出一个加密方案来阻止这种情况,攻击者也可以通过MITM攻击向键盘注入一个额外的<script>
标签,以便在加密之前窃取密码。
基本上无论你如何削减它,你都必须使用HTTPS来确保你的通信不被嗅探并且没有发生MITM攻击。一旦您的连接已通过HTTPS保护,该连接使用(最小)128位密钥加密,并且需要比已知的Universe年龄更长的时间才能破解,您可以使用HTTPS连接来发送密码和可能没有必要对密码客户端进行额外的加密。