📜  密码和密码哈希函数

📅  最后修改于: 2021-04-16 08:26:38             🧑  作者: Mango

我们已经介绍并讨论了哈希密码的重要性。要创建强哈希密码,我们必须了解与之相关的一些术语,然后将通过PHP的示例了解如何创建强盐哈希密码。

什么是加密哈希函数?
密码哈希函数是一类特殊的哈希函数,具有某些属性,使其适合用于密码学。它是一种数学算法,可将任意大小的数据映射到固定大小的位字符串(哈希函数),该字符串还被设计为单向函数,即,一种不可逆的函数(来源:Wiki )。

如果您曾经看过登录代码,则很有可能看到开发人员使用hash(’sha256’,$ password)甚至是md5($ password)来“保护”用户密码。用这种方式生成的密码哈希很容易破解。由于算法较弱,而且在某些地方也不会加盐或拉伸,因此您几乎会将密码提供给获得访问权限的攻击者。

  • MD5最初被设计为用作加密哈希函数,但发现它具有广泛的漏洞(Source Wiki)。
  • SHA-1不再被认为能对付资金雄厚的对手。在2005年,密码分析家发现了对SHA-1的攻击,这表明该算法可能不够安全,无法持续使用[来源:Wiki]。
  • SHA-2是SHA1的后继产品,目前不常用,它收集了4种哈希函数:SHA224,SHA256,SHA384和SHA512。它的工作方式与SHA1相同,但功能更强大,并生成更长的哈希。
  • BlowFish是一种对称密钥分组密码,包含在许多密码套件和加密产品中。 Blowfish在软件中提供了良好的加密率,迄今为止尚未发现对其进行有效的加密分析。

什么是盐腌?
盐是随机数据,用作“哈希”密码或密码短语的单向函数的附加输入。为了给密码加盐,我们在哈希之前向其添加一些随机字符,以便每次对同一密码进行哈希处理时,同一密码将产生唯一的字符串,从而消除了彩虹表攻击,并有必要单独破解每个密码。盐通常与哈希一起存储,并且在根据哈希检查密码时必须使用盐。

PHP函数Saltsstretch和default中的password_hash()默认选择在执行时使用的最佳哈希算法,这意味着我们不必担心选择算法,甚至不必更新代码以使用更强大的算法即可。时间在流逝–如果有更好的算法可用,该函数将开始将其用于新的哈希。

这是如何使用此函数的示例:


散列以算法信息,成本和22个字母数字的盐字符开头,其后为散列密码:

$2y$10$Ka3/TxAu3UrGX4E8suGkKO4V43dK9CcF.BTT5P8OzOO7/PRjqFn0a
$2y$10$6kf8iQDut0i7AOx2TULi1O9I5yxdSfX/T7HRy2KbMmliaYo4fLR.i
$2y$10$fPEY1vxgP15wwpfPdA22WOhkMqvmLsZtfzn9sr3rCw2V4N1tbEyle
$2y$10$878u5R1q8tP3karLHwBbAOfax8ybPt43U3F6lG9oOV5w9yfj/k1cq

这就是在PHP生成和验证合理安全的密码所需的全部工作。在撰写本文时,Blowfish是默认的最佳算法,并且会生成60个字符的哈希,但是,如PHP手册页所述(参考),创建长度为255个字符的密码数据库字段可能不是一个好主意。允许将来进行算法扩展以进行安全编码。

资料来源:
https://zh.wikipedia.org/wiki/盐_(密码学)
http:// PHP.net / manual / en /函数.password-hash.phphttp://stackoverflow.com/questions/30279321/how-to-use-password-hashhttps://en.wikipedia.org/wiki/ Cryptographic_hash_function
https://www.sitepoint.com/hashing-passwords-php-5-5-password-hashing-api/