我想知道对于像
这样的密码加盐和哈希是否是一种常见做法E(填充||哈希(盐||密码))
其中||是串联,E使用RSA。我主要是要问这个问题来传输密码数据库(而不是在线存储,其中服务器将始终使用私钥来解密加密密码)。
我知道加密哈希应该是不可逆转的,但对弱密码的离线强力攻击很容易泄露密码。为了最终解密此数据库中的记录,服务器将知道填充的长度,并简单地删除填充以显示哈希(salt ||密码)。
这不是一个典型的问题,但我无法找到有关正确传输密码数据库并防御离线攻击的人的参考。
答案 0 :(得分:4)
使用强大的东西加密密码文件,然后密码如何存储在文件中无关紧要。
IE中。使用像PGP这样的东西来运输。
我注意到这个答案已被贬低一次,在其他人投票之前,只是想我会澄清它,因为我怀疑那个贬低我答案的人实际上没有读过这个问题。另一方面,对于提出问题的人来说,也许不可能对整个文件进行完全加密。如果是这种情况,这将是一个方便的澄清。
无论如何,问题明确指出这是关于传输数据(基础)。它还明确指出这不是关于在线存储和使用。
因此,对整个文件使用安全可靠的加密方法确实是最好的方法,因为那时您不必操纵文件内容来尝试屏蔽每个密码。
相反,整个文件将毫无意义,如果要传输的不仅仅是密码文件,它将与更多数据集中在一起,从而加密,从而使识别密码的过程成为可能。几乎不可能。
如果你选择一个声誉良好的加密算法和实现(PGP,GPG等),而不是自己发明一些东西,或者至少让它变得容易,那么对这些加密文件的攻击成功的可能性要大得多。攻击者以小块的形式找到个人密码。
答案 1 :(得分:2)
或者只是加密密码数据库本身。如果您无法传输解密密钥,则可以使用公钥加密来加密解密密钥。
答案 2 :(得分:1)
关键在于,当您在记录用户时以及在存储密码时进行比较时,您将以相同的方式对密码进行加密。有一个好的盐会阻止某人进行标准查找,它也会加强对字典攻击的哈希。如果将盐和密码组合在一个哈希中,它将大大减少离线攻击的使用,您不需要采取任何特殊的保护措施。
答案 3 :(得分:1)
防止暴力攻击的唯一方法是使用慢速哈希算法。现在bcrypt或PBKDF2是可行的方法,因为它可以配置为需要大量的CPU时间和大量的RAM。随着CPU变得更快,内存更便宜,您只需要增加设置并减慢散列。
如果你能猜出每秒数百万的哈希值或只有少数几个值,那真的会有所不同。
CodingHorror有一篇关于此主题的精彩文章:http://www.codinghorror.com/blog/2012/04/speed-hashing.html
答案 4 :(得分:-1)
所有其他回复都很好,但我补充说:
定期强制更改密码。
这是破坏线下暴力攻击的可靠方法。击中移动目标更难。
答案 5 :(得分:-2)
如果您控制尝试解密数据库的函数,请在重试之间放置1秒的计时器?
这肯定会减慢蛮力