我试图为此目的测试password_hash方法我创建了以下函数hashPassword:
function hashPassword($string) { $settings = array('cost' => 10, 'encryption_key' => 'thisIsMyEncryptionKey1234'); return password_hash($string, PASSWORD_BCRYPT, $settings); }
现在,如果我用随机字符串测试这个 "test"
结果将是:
$2y$10$thisIsMyEncryptionKeyu5n3NNnKh3DjgJqgb5pE8YOLBclKrVWC
或者如果我测试它helloworld
:
$2y$10$thisIsMyEncryptionKeyuVw8QRVNw8HbEWHX2oQlArVtne2TzOpS
谁能告诉我为什么会这样?还是假设是这样的?
除非您有充分的理由这样做,否则不应手动提供加密密钥.我建议再阅读password_hash
一些文档.
正确使用只是让系统自己解决所有问题:
function hashPassword($password) { return password_hash($password, PASSWORD_DEFAULT); }
然后,PHP将在内部为当前硬件选择最佳可用算法和最适合的迭代次数,并生成安全且独特的盐.
要验证密码,请使用password_verify
并检查所需的重新加密,例如在User
类中:
class User { ... public function verifyPassword($password) { if(!password_verify($password, $this->hash)) return false; if(password_needs_rehash($this->hash, PASSWORD_DEFAULT)) $this->setNewHashAndSaveToDB(password_hash($password, PASSWORD_DEFAULT)); return true; } }
通过使用此构造,您可以确保在用户登录时,随着硬件容量的进展,散列密码始终保持最新且安全.
什么算法PASSWORD_DEFAULT
选择的策略,以及使用哪个配置,如下所示:
此函数对受支持算法的更新(或对默认算法的更改)必须遵循以下规则:
在成为默认值之前,任何新算法必须在核心中至少有1个完整版本的PHP.因此,例如,如果在5.5.5中添加了新算法,则在5.7之前它将不符合默认条件(因为5.6将是第一个完整版本).但是如果在5.6.0中添加了不同的算法,它也有资格默认为5.7.0.
默认值应仅在完整版本(5.6.0,6.0.0等)上更改,而不在修订版本上更改.唯一的例外是在当前默认情况下发现严重安全漏洞的紧急情况.