【问题标题】:how does PHP funciton: crypt(string str, string [salt]) works? Is it possible that the salt equals to the encrypted result?PHP function: encrypt(string str, string [salt]) 是如何工作的?盐是否可能等于加密结果?
【发布时间】:2017-07-14 16:48:10
【问题描述】:

最近,我学习了一个新的 Web 应用程序。在其用户授权部分,我发现它在 PHP 中使用 crypt() 来授权用户。但代码如下:

if ($auth != crypt(md5($cdata), $auth))
{
   exit(); //exit
}
//the code after authorization;

这个函数中的salt是否可以等于加密后的结果,这样授权后的代码就可以执行了? 我完全无法理解这一点。非常渴望回答,谢谢!

【问题讨论】:

    标签: php cryptography md5 salt password-hash


    【解决方案1】:

    首先,避免使用crypt()md5(),请使用password_hash()password_verify()。有关详细信息,请参阅http://php.net/password_hash。这些函数非常易于使用,无需配置,几乎可用于任何 PHP 版本(低至 5.3.9)(如果尚未包含原生函数,则使用 PHP 库)。

    第二,是的,创建的哈希(即使使用 crypt)确实包含盐,这就是为什么password_verify() 需要了解先前创建的密码哈希值。它将从中读取盐部分和散列参数,用盐和参数散列新的给定密码,如果当前给定密码的结果与旧散列相同,则密码正确。

    举例说明:

    echo password_hash('foo', PASSWORD_DEFAULT);
    
    > $2y$10$ODIL7VQp1aLOfLrEv2rPQ.wFIbBr7hvQtMTuw4B4xnB/qI7nnMpVO
    

    $2y$ 表示哈希算法(即 BCrypt),下面的 10$ 是 BCrypt 的参数(10 轮哈希),字符串的其余部分部分是盐,部分是哈希值。请注意,调用password_hash() 会随机生成一个盐值,因此每次都返回不同的字符串。

    var_dump(password_verify('foo', '$2y$10$ODIL7VQp1aLOfLrEv2rPQ.wFIbBr7hvQtMTuw4B4xnB/qI7nnMpVO'));
    
    > bool(true)
    

    验证密码总是这么简单:将新密码和旧哈希传递给password_verify() - 如果它们匹配,它将返回true

    【讨论】:

    • 非常感谢!我仔细阅读了你的答案,但仍然不明白。你说旧哈希和新密码部分,我完全同意。但仍然没有提及是否存在等于盐值的加密结果。或者更具体地说,我如何创建 $auth 以便方程: $auth == crypt(md5($cdata), $auth) 可以满足?再次感谢。
    • 正如我所说:不要使用crypt(),不要使用md5(),不要使用== 进行比较——所有这些对安全性都非常不利。请务必使用password_hash() 创建哈希值,并使用password_verify() 检查给定密码是否与哈希匹配。
    猜你喜欢
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2017-02-18
    • 2020-07-22
    相关资源
    最近更新 更多