我应该如何设计一个更安全的登录协议,就像我现在拥有的那样
- 客户端连接并发送他的用户名
- 服务器为用户发送盐(总是相同的)
- 客户端将盐添加到密码哈希中并将其发送到服务器
这样密码一直被隐藏,但它并不能阻止黑客复制哈希,如果他可以过来并在他收到密码后发送它......
将安全性留给更高级别的协议(SSH、SSL)并保持简单。
如果服务器只接受最初用该盐挑战的连接上的盐渍密码,那么黑客将不得不继续连接,直到他得到与他看到的哈希相同的盐。我并不是说这是理想的(并且 Diffie-Hellman 密钥交换和完全加密的身份验证可能更安全,尽管除非你小心,否则仍然容易受到中间人攻击)但我认为简单的调整至少是有益的。
再说一次,我不是安全专家,可以说你不应该听取任何非专家的安全建议。
第 2 步似乎是更大的弱点。如果您可以确保服务器发送“足够大”的盐并且永远不会发送相同的盐,两次(我怀疑一小部分像样的随机数,加上一个递增的计数器,那么散列可能就足够了,但我无法证明它是),这可能就足够了。或者,按照 ssg 的指导,将整个事情封装在 SSL 会话中。