Met*_*lis 18 php security encryption
我见过的所有人都在谈论将密码存储在数据库中,他们几乎总是使用MD5.
AES或SHA1有什么问题?
Dav*_*d M 36
如果您存储加密的密码,则可以对其进行解密.由于许多人在许多不同的系统中重复使用密码,这是一件坏事.因此,您使用单向函数,加密哈希函数 - 这样就可以验证密码而无需实际显示.
正如Greg评论的那样,AES是一种加密/解密算法.MD5和SHA系列是哈希函数,它们更适合使用.但现在避开MD5 - 它已经不再那么安全了.王小云在2005年发表了一次有效的碰撞攻击,其强度现在远低于其设计强度 - 因此在加密方面它被"打破".
为了获得最佳效果,标准是对密码进行加密和哈希以存储它 - 将这些条件串联起来,您会发现许多引用.
MD5(消息摘要算法5)是加密散列函数,而高级加密标准(AES)是对称密钥加密算法,因此它们用于不同目的.哈希(如MD5或SHA)用于验证密码,因为它很难反转,即从哈希字符串中获取密码.另一方面,AES加密是可逆的,如果您知道密钥,则可以获得原始消息.因此,如果使用相同的密钥加密多个消息,知道它会暴露所有消息,而如果您设法找到散列的原始字符串(彩虹表等),您只发现该特定实例的纯文本,并且你将不得不重做工作来找到另一个哈希字符串的sollution.
简而言之:AES是可逆的。哈希函数不是。
响应已接受的答案...(对不起,我是新用户,还不能发表评论...)放盐只能防止基于Rainbow Table的攻击。它不保护“弱密码”。为了保护较弱的密码,您将需要使用已被证明速度较慢的哈希函数。正确配置的bcrypt是执行此操作的最简单方法。MD5和SHA1太快,无法保证安全。(发现与MD5的冲突与我正在描述的这个问题无关)
这个家伙可以在一天内破解所有用MD5或SHA1加密的8个字符的密码(即使正确加盐)。加盐不能阻止这种攻击。将攻击“优化”为仅包含英语中的〜500k个单词,而其中10,000个最常见的变体将破解大量的密码。
BCrypt抵抗这种攻击的能力更强,因为它(可以配置为)比MD5慢几百万倍。从理论上讲,重复使用百万次MD5将达到相同的效果,但是我建议您坚持使用经过良好测试的库,而不要滚动自己的实现。BCrypt当然也使用Salting,并且在大多数编程语言中都可用。因此,没有理由不使用它。
从理论上讲,SCrypt更好,但是它太新了(因此,实现可能仍然有点漏洞)
长话短说:SHA512与河豚和Bcrypt