我渴望将代码迁移到php提供的新password_*函数。
数据库中现有的哈希已生成如下:

hash ('sha512', '<A constant defined earlier>' . $email . $password);

我想将这些移到由下面推荐的创建的散列:
password_hash ($password, PASSWORD_DEFAULT);

显然,当用户登录时,我可以利用这个机会从他们刚刚提供的密码创建新的散列,并将其保存在数据库中。
但是,我想避免在数据库中有两个字段,即一个用于不推荐的散列,另一个用于现代密码散列。相反,我宁愿在每个用户登录时替换旧的。
因此,是否可以保留单个数据库字段,并让userland代码确定散列是否旧,即确定要使用哪个检查?
(我假设hash('sha512')哈希不能自动升级到crypt()哈希?)

最佳答案

使用password_hash创建的散列在开头将有一个非常独特的$2y$字符串(或者类似的$..$,只要您使用当前默认值Blowfish cypher),而sha256将只是所有十六进制值。因此,您可以简单地测试一个值是传统散列值还是password_hash值:

function isLegacyHash($hash) {
    return !preg_match('/^\$\w{2}\$/', $hash);
}

使用此选项,您可以将这两种类型的散列保留在单个字段中,并在用户登录时升级它们。或者,您可以简单地在hash_version这样的列中设置一个标志。

09-19 09:00