我正在创建一个脚本,理想情况下喜欢使用password_hash函数将用户密码转换为哈希,但是我想让哈希动态以确保password_hash函数实际存在,所以我编写了以下函数来返回一个哈希依赖什么功能可用.
function generateHash($hashpwd){
if (function_exists('password_hash')) {
return password_hash($hashpwd, PASSWORD_DEFAULT);
} elseif (function_exists('hash')) {
return hash('sha512', $hashpwd);
} else {
return md5($hashpwd);
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法有什么问题还是有效?我也用以下方式使用password_hash创建哈希:
password_hash($hashpwd, PASSWORD_DEFAULT);
Run Code Online (Sandbox Code Playgroud)
但大多数地方我都看到了以下格式的示例语法:
password_hash($hashpwd, PASSWORD_DEFAULT)."\n";
Run Code Online (Sandbox Code Playgroud)
差异是\n是\n需要\n它是什么?
缺少password_hash(低于5.5)的每个PHP版本现在都是生命结束且不安全的结果.它是a)不值得考虑这些现在危险不安全的PHP版本,并且b)不值得因为降级到MD5作为散列算法而导致用户的安全性损失.
但大多数地方我都看到了以下格式的示例语法:
Run Code Online (Sandbox Code Playgroud)password_hash($hashpwd, PASSWORD_DEFAULT)."\n";
我从来没有见过这样的事.\n是一个新的路线.将其与哈希一起保存到数据库中会导致问题 - 如果您在某处输出哈希值以进行调试/查看,那么这只是值得做的.
password_hash.至少你需要在这里使用不同的算法,包括盐.最好使用crypt合适的散列算法,password_hash无论如何都要包装.password_hash反向移植的PHP可用5.3.7+,根据您的操作系统,甚至一些老的版本上.你不应该现实地需要支持比这更旧的东西.你需要在沙子的某处绘制线条.大多数新项目至少要求5.6+.如果您需要支持更旧的东西,请使用像PHPass这样的可信库,它向后兼容,直到PHP 3.password_hash($hashpwd, PASSWORD_DEFAULT)."\n";仅用于调试输出,尾随换行符不是密码哈希的一部分.