Hash 这是一个合理的密码使用方案吗?

Hash 这是一个合理的密码使用方案吗?,hash,passwords,Hash,Passwords,根据一些阅读资料,这里有一个简单的想法 服务器存储(明文+salt)的哈希版本。这可以避免看到密码,只要哈希值难以反转 当客户端尝试登录时,服务器发送它(salt,random),即一个常量salt和一个新生成的随机字符串 客户端发回散列(散列(明文+盐)+随机),即客户端追加盐,散列,然后追加随机数,然后再次散列 服务器检查散列值是否与它自己的H(H(pwd+salt)+rnd)相同 我在这方面没有太多经验,所以我可以问一下潜在的问题是什么吗?还有,人们通常用盐做什么?你真的能用同样的方法逃过

根据一些阅读资料,这里有一个简单的想法

服务器存储(明文+salt)的哈希版本。这可以避免看到密码,只要哈希值难以反转

当客户端尝试登录时,服务器发送它(salt,random),即一个常量salt和一个新生成的随机字符串

客户端发回散列(散列(明文+盐)+随机),即客户端追加盐,散列,然后追加随机数,然后再次散列

服务器检查散列值是否与它自己的H(H(pwd+salt)+rnd)相同


我在这方面没有太多经验,所以我可以问一下潜在的问题是什么吗?还有,人们通常用盐做什么?你真的能用同样的方法逃过一劫吗?

你所建议的方案并没有为检查密码增加任何安全性,只是增加了使用SSL登录所不具备的复杂性。使用SSL,您可以安全地将明文密码从浏览器传输到服务器,使用salt对其进行哈希,然后对照存储的哈希进行检查。这样就不需要复杂的方案。目前,只有国家政府才有可能系统性地中断SSL连接,尽管一些真正有进取心的黑客发现了一些有趣的漏洞

您描述的方案听起来非常像Diffie-Helman零知识密钥交换,它比ssl安全得多,因为它在最初与服务器设置密码后从未实际传输密码。目前这种密钥交换的问题在于,它必须在客户端用Javascript编写,因此,它会将实际的工作方式暴露给每一个想要查看的攻击者。然后,攻击者可以将您的Javascript替换为其他内容,或者如果您不使用SSL,则只需点击它来收集初始密码,因此您再次只需降低从客户端到服务器的SSL连接的安全性,只需增加一些复杂性和故障点。有很多方法可以使用ActiveX、Java或其他项目来创建浏览器插件来处理所有密钥交换内容,但这又为用户添加了一个不明显的故障点,为用户添加了其他站点不需要的额外步骤(安装附加组件或bookmarklet),让你在发展中停留更长的时间,并不是为了真正的利益


Firefox一直在致力于在浏览器级别实现Diffie-Helman密码密钥交换,如果这项技术成功的话,它将增加很多安全性,并使这种密码方案成为可能。

这个问题可能更适合我们的姐妹网站。不幸的是,它似乎太老了,不能迁移到那里。老实说,我甚至不记得写过它。是我一个人,还是交通量减少了很多?“我有许多未回答的问题,以前是不会发生的。”卡洛斯,没有摔倒。更有趣的是主动提问者与问题答案的比例,但这更难挖掘。我主要是想知道我是否误解了阅读中的某些内容。这确实是基于卫生署。我不太明白一个黑客怎么能仅仅通过修改客户端就进入。这个想法是,你知道它是如何工作的并不重要。我可以想象这种类型的系统有一些漏洞,但我不知道是什么。关于SSL,这不是从某种密钥交换开始的吗?或者,您只是建议协议已经有了这一点,并为众所周知的漏洞提供了解决方案(出于实际目的,我不妨使用它)?@Carlos:通过不安全连接提供客户端代码的身份验证方案的问题在于,MITM攻击者只需修改代码以保存密码,然后对密码进行散列并将其副本发送给自己。(当然,任何通过HTTP发送而不使用SSL的登录表单本质上都存在相同的漏洞,这就是为什么您应该使用SSL。但一旦您使用SSL,您就拥有了一个安全通道,这意味着您可以简单地发送密码。)@IlmariKaronen:但唯一没有散列密码的地方是在客户端计算机上。我没有看到任何不经过哈希处理的东西?@Carlos:对密码进行哈希处理的JS代码正在从服务器到客户端的未加密的线路上进行。能够拦截请求的攻击者可以将其更改为执行他们想要的任何操作。(这都是假设您希望在网站上执行此操作。如果您有一个带有专用客户端程序的自定义协议,您的建议将变得更加可行。不过,在这种情况下,您可能需要查看SRP。)@Carlos: