在存储密码之前对密码进行两次哈希比只进行一次哈希更安全还是更不安全?
我说的是这样做:
$hashed_password = hash(hash($plaintext_password));
而不是这样:
$hashed_password = hash($plaintext_password);
如果它不太安全,你能提供一个好的解释(或一个链接)吗?
另外,使用哈希函数有区别吗?如果混合使用md5和sha1(例如),而不是重复相同的哈希函数,会有任何区别吗?
注1:当我说“双重哈希”时,我指的是对密码进行两次哈希,以使其更加模糊。我说的不是解决碰撞的技术。
注2:我知道我需要添加一个随机的盐,以真正使它安全。问题是用同一个算法进行两次哈希运算对哈希是有利还是有害。
只有当我在客户端对密码进行哈希,然后将该哈希(使用不同的盐)保存在服务器上时,双哈希才有意义。
这样,即使有人黑进了服务器(从而忽略了SSL提供的安全),他仍然无法获得清晰的密码。
是的,他将拥有入侵系统所需的数据,但他不能使用这些数据来破坏用户拥有的外部帐户。众所周知,人们几乎在任何事情上都使用相同的密码。
他获得清晰密码的唯一方法是在客户端安装一个keygen——这已经不是你的问题了。
简而言之:
客户端上的第一个散列可以在“服务器泄露”场景中保护您的用户。
如果有人掌握了数据库备份,那么服务器上的第二次哈希可以保护您的系统,这样他就不能使用这些密码连接到您的服务。
只有当我在客户端对密码进行哈希,然后将该哈希(使用不同的盐)保存在服务器上时,双哈希才有意义。
这样,即使有人黑进了服务器(从而忽略了SSL提供的安全),他仍然无法获得清晰的密码。
是的,他将拥有入侵系统所需的数据,但他不能使用这些数据来破坏用户拥有的外部帐户。众所周知,人们几乎在任何事情上都使用相同的密码。
他获得清晰密码的唯一方法是在客户端安装一个keygen——这已经不是你的问题了。
简而言之:
客户端上的第一个散列可以在“服务器泄露”场景中保护您的用户。
如果有人掌握了数据库备份,那么服务器上的第二次哈希可以保护您的系统,这样他就不能使用这些密码连接到您的服务。