PHP函数使用password_hash,hash或MD5,具体取决于可用性

Ahm*_*med 0 php hash

我正在创建一个脚本,理想情况下喜欢使用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它是什么?

cee*_*yoz 5

缺少password_hash(低于5.5)的每个PHP版本现在都是生命结束且不安全的结果.它是a)不值得考虑这些现在危险不安全的PHP版本,并且b)不值得因为降级到MD5作为散列算法而导致用户的安全性损失.

但大多数地方我都看到了以下格式的示例语法:

password_hash($hashpwd, PASSWORD_DEFAULT)."\n";
Run Code Online (Sandbox Code Playgroud)

我从来没有见过这样的事.\n是一个新的路线.将其与哈希一起保存到数据库中会导致问题 - 如果您在某处输出哈希值以进行调试/查看,那么这只是值得做的.

  • @ceejayoz感谢您提供错误报告.文档更改将在接下来的几个小时内反映在php.net上.PHP项目以其文档而自豪,而这样的"问题"很容易解决,如果它帮助未来的读者更好地理解这些例子,那就太棒了. (3认同)
  • @ChrisForrence我已经提交了[错误报告](https://bugs.php.net/bug.php?id=75276). (2认同)

dec*_*eze 5

  1. 单个无盐的SHA512是一个糟糕的后备password_hash.至少你需要在这里使用不同的算法,包括盐.最好使用crypt合适的散列算法,password_hash无论如何都要包装.
  2. 有一个password_hash反向移植的PHP可用5.3.7+,根据您的操作系统,甚至一些老的版本上.你不应该现实地需要支持比这更旧的东西.你需要在沙子的某处绘制线条.大多数新项目至少要求5.6+.如果您需要支持更旧的东西,请使用像PHPass这样的可信库,它向后兼容,直到PHP 3.
  3. password_hash($hashpwd, PASSWORD_DEFAULT)."\n";仅用于调试输出,尾随换行符不是密码哈希的一部分.