目前认为MD5是部分不安全的。考虑到这一点,我想知道使用哪种机制来保护密码。
这个问题,“双重哈希”密码是否比只哈希一次更不安全?
建议哈希多次可能是一个好主意,而如何实现个别文件的密码保护?建议使用盐。
我用的是PHP。我想要一个安全快捷的密码加密系统。对一个密码进行一百万次哈希运算可能更安全,但也更慢。如何在速度和安全之间取得良好的平衡?此外,我更希望结果具有恒定数量的字符。
哈希机制必须在PHP中可用
必须是安全的
它可以使用盐(在这种情况下,所有的盐都一样好吗?有没有办法生产出好的盐?)
另外,我是否应该在数据库中存储两个字段(例如,一个使用MD5,另一个使用SHA)?这会让它更安全还是更不安全?
以防我不够清楚,我想知道要使用哪个哈希函数,以及如何选择一个好的盐,以便拥有一个安全和快速的密码保护机制。
没有完全涵盖我的问题的相关问题:
PHP中的SHA和MD5有什么区别
简单密码加密
为asp.net存储密钥和密码的安全方法
如何在Tomcat 5.5中实现加盐密码
一个更简短、更安全的答案是:完全不要编写自己的密码机制,使用经过验证和测试的机制。
PHP 5.5或更高版本:password_hash()质量很好,是PHP核心的一部分。
PHP 4。x(过时):OpenWall的phpass库比大多数自定义代码(用于WordPress、Drupal等)要好得多。
大多数程序员只是不具备在不引入漏洞的情况下安全地编写加密相关代码的专业知识。
快速自测:什么是密码拉伸,应该使用多少次迭代?如果你不知道答案,你应该使用password_hash(),因为密码扩展现在是密码机制的一个关键特性,这是由于更快的cpu和gpu和fpga的使用,以每秒数十亿次的猜测速度破解密码(gpu)。
截至2012年,你可以在5台台式电脑上安装25个图形处理器,在6小时内破解所有8个字符的Windows密码。这是强制的,即枚举和检查每个8个字符的Windows密码,包括特殊字符,而不是字典攻击。有了现代gpu,你当然可以破解更多的密码,或者使用更少的gpu——或者以合理的价格在云中租用gpu几个小时。
还有很多针对Windows密码的彩虹表攻击,它们运行在普通cpu上,速度非常快。
这一切都是因为,即使在Windows 10中,Windows也没有对密码进行腌制或拉伸。2021年依然如此。不要犯和微软一样的错误!
参见:
很好的回答,更多关于为什么password_hash()或phpass是最好的方法。
一篇很好的博客文章,给出了主要算法的推荐“工作因子”(迭代次数),包括bcrypt, scrypt和PBKDF2。
我通常使用SHA1和salt和用户ID(或其他特定于用户的信息),有时我还使用常数salt(因此我有2部分salt)。
SHA1 is now also considered somewhat compromised, but to a far lesser degree than MD5. By using a salt (any salt), you're preventing the use of a generic rainbow table to attack your hashes (some people have even had success using Google as a sort of rainbow table by searching for the hash). An attacker could conceivably generate a rainbow table using your salt, so that's why you should include a user-specific salt. That way, they will have to generate a rainbow table for each and every record in your system, not just one for your entire system! With that type of salting, even MD5 is decently secure.
我只想指出,PHP 5.5包含一个密码哈希API,它提供了crypt()的包装器。这个API极大地简化了哈希、验证和重哈希密码哈希的任务。作者还发布了一个兼容性包(以您只需要使用的单个password.php文件的形式),供那些使用PHP 5.3.7及以后版本并希望立即使用它的用户使用。
它目前只支持BCRYPT,但它的目标是轻松扩展到包括其他密码哈希技术,因为技术和成本存储为哈希的一部分,对您首选的哈希技术/成本的更改不会使当前哈希失效,框架将自动地在验证时使用正确的技术/成本。如果您没有显式地定义自己的盐,它还可以处理生成“安全”盐。
API公开了四个函数:
Password_get_info() -返回关于给定散列的信息
Password_hash()—创建密码散列
Password_needs_rehash()—检查给定的散列是否与给定的选项匹配。有用的检查散列是否符合您当前的技术/成本方案,允许您在必要时重新散列
Password_verify()—验证密码是否与散列匹配
目前,这些函数接受PASSWORD_BCRYPT和PASSWORD_DEFAULT密码常量,它们目前是同义词,区别在于PASSWORD_DEFAULT“在支持更新、更强的散列算法的新PHP版本中可能会改变”。在登录时使用PASSWORD_DEFAULT和password_needs_rehash()(并在必要时重新进行散列)应该确保您的散列对暴力攻击具有合理的弹性,几乎不需要做任何工作。
编辑:我刚刚意识到罗伯特·K的回答中简单提到了这一点。我将把这个答案留在这里,因为我认为它提供了更多关于它如何工作的信息,以及它为那些不了解安全性的人提供的易用性。
我使用的是Phpass,这是一个简单的单文件PHP类,可以在几乎每个PHP项目中非常容易地实现。参见The H。
默认情况下,它使用在Phpass中实现的最强可用加密,即bcrypt,并回落到其他加密,直到MD5,以提供向后兼容的框架,如Wordpress。
返回的散列可以按原样存储在数据库中。生成哈希的示例使用如下:
$t_hasher = new PasswordHash(8, FALSE);
$hash = $t_hasher->HashPassword($password);
要验证密码,可以使用:
$t_hasher = new PasswordHash(8, FALSE);
$check = $t_hasher->CheckPassword($password, $hash);