可能重复:
PHP 密码的安全哈希和盐
我正在制作一个在 MySQL 数据库中存储用户凭据(电子邮件、用户名和密码)的系统,并且在使用加密、加盐和加密类型方面看到了冲突的观点。
你会推荐什么最好的方法?用 MD5 还是 SHA1 编码?加盐还是不加盐?仅加密密码或所有 3 个元素?
可能重复:
PHP 密码的安全哈希和盐
我正在制作一个在 MySQL 数据库中存储用户凭据(电子邮件、用户名和密码)的系统,并且在使用加密、加盐和加密类型方面看到了冲突的观点。
你会推荐什么最好的方法?用 MD5 还是 SHA1 编码?加盐还是不加盐?仅加密密码或所有 3 个元素?
IMO 的最佳做法是:
使用散列算法,例如 SHA256 或 SHA512。MD5 现在是不安全的,因为您可以反转哈希/执行彩虹攻击。
使用强盐来确保攻击者无法猜出常用的散列密码,如果他们获得了访问您的数据库的权限。
不要使用加密。
只有散列密码、用户名和电子邮件才可以作为纯文本。
这只是您需要加密的密码。实际上,您应该同时使用至少Hashing
SHA-256的算法(我很确定 MD5 和 SHA1 是可破解的?)并且您的密码更加安全。 Salting
这是关于存储它们的首选方法的答案:在数据库中存储密码的首选方法
用户名和电子邮件不应该被加密,你需要它们是纯文本的,那样它们会更有用。
至于密码:它们绝对应该被加密或散列,最好也用盐。到目前为止,我使用了一种有趣的技术来做到这一点:AES,其密钥就是密码本身。因此,如果用户将他的密码设置为“blabla123”,那么我将通过调用将其存储在 MySQL 中AES_ENCRYPT('blabla123', 'blabla123')
。这样做有两个好处:
然后通过加密用户键入的内容并比较两个值来完成有效性。
密码应使用强盐(MD5 或 SHA1 都可以)进行哈希保护,以防止使用彩虹表进行攻击。
您不应该对电子邮件地址进行哈希处理 - 一旦您对其进行哈希处理,除了检查用户输入的内容之外,您无法将其用于任何其他用途,因此对其进行哈希处理会阻止您向该人发送电子邮件。同样,用户名最好以纯文本形式存储,以便您识别该人。