我们已经介绍并讨论了散列密码的重要性。要创建强散列密码,我们必须了解一些与之相关的术语,然后我们将通过PHP的示例了解如何创建强散列密码。
什么是加密哈希函数?
密码散列函数是一类特殊的散列函数,它具有使其适用于密码学的某些特性。它是一种数学算法,可将任意大小的数据映射到固定大小的位字符串(散列函数),它也被设计为单向函数,即无法求逆的函数(来源:Wiki )。
如果您曾经查看过登录代码,那么您很有可能已经看到开发人员使用 hash(‘sha256’, $password) 甚至 md5($password) 来“保护”用户密码。以这种方式生成的密码哈希很容易被破解;使用弱算法并且在某些地方没有加盐或拉伸,您几乎将密码提供给获得访问权限的攻击者。
- MD5最初设计用作加密哈希函数,但已发现它存在大量漏洞(来源 Wiki)。
- SHA-1不再被视为对抗资金充足的对手的安全。 2005 年,密码分析者发现对 SHA-1 的攻击表明该算法可能不够安全,无法继续使用 [来源:维基]。
- SHA-2 ,目前不常用,是SHA1的继承者,汇集了4种哈希函数:SHA224、SHA256、SHA384和SHA512。它的工作方式与 SHA1 相同,但更强大并生成更长的哈希。
- BlowFish是一种对称密钥分组密码,包含在大量密码套件和加密产品中。 Blowfish 在软件中提供了良好的加密率,迄今为止尚未发现对其进行有效的密码分析。
什么是盐渍?
盐是一种随机数据,用作“散列”密码或密码短语的单向函数的附加输入。为了给密码加盐,我们在散列之前向其添加一些随机字符,以便相同的密码在每次散列时都会产生一个唯一的字符串,从而消除彩虹表攻击并使得有必要单独破解每个密码。盐通常与散列一起存储,并且必须在根据散列检查密码时使用。
PHP函数salts 中的password_hash() 、 stretch和默认情况下会选择在执行时使用的最佳散列算法,这意味着我们永远不必担心选择算法,甚至更新我们的代码以使用更强的算法作为时间在继续——如果有更好的算法可用,该函数将开始将其用于新的散列。
以下是如何使用此函数的示例:
散列以算法信息、成本和 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://en.wikipedia.org/wiki/Salt_(密码学)
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/