Php Crypt函数为相同的密码生成相同的哈希

Php Crypt函数为相同的密码生成相同的哈希,php,hash,password-protection,Php,Hash,Password Protection,我正在尝试创建一个散列函数,给定一个随机salt,它将从中生成一个密码散列 问题是,如果我为两个不同的用户输入相同的密码,那么生成的哈希对这两个用户都是相同的 有什么问题吗 public function generateSalt() { return $salt = substr(sha1(uniqid(rand(), true)), 0, 32); } public function pwdEncrypt($password, $salt) {

我正在尝试创建一个散列函数,给定一个随机salt,它将从中生成一个密码散列

问题是,如果我为两个不同的用户输入相同的密码,那么生成的哈希对这两个用户都是相同的

有什么问题吗

public function generateSalt()
{       


     return $salt = substr(sha1(uniqid(rand(), true)), 0, 32);
}

public function pwdEncrypt($password, $salt)
{       

    $hash = crypt($password, '$2a$' . $salt . '$');     
    return $hash;
}

public function registerUser($nome, $email, $password, $permitions, $active)
{



    $this->nome = $nome;
    $this->email = $email;


    $salt = $this->generateSalt();


    $this->password = $this->pwdEncrypt($password, $salt);

   //INSERT METHODS BELOW
}
crypt()
将使用标准的基于Unix DES的算法返回哈希字符串

标准的基于DES的散列有一个两字符salt,来自字母表“/0-9A-Za-z”

因为在您的例子中,盐的前三个字符总是相同的,所以使用的盐总是相同的

使用

crypt()
将使用标准的基于Unix DES的算法返回哈希字符串

标准的基于DES的散列有一个两字符salt,来自字母表“/0-9A-Za-z”

因为在您的例子中,盐的前三个字符总是相同的,所以使用的盐总是相同的

使用


这不是你对河豚(
$2a$
)使用的
crypt

您需要指定强度,以及最后的盐

试试这个
crypt($password,$2a$08$'.$salt)

明显增加了强度以提高安全性,但牺牲了处理时间


我还应该补充一点,如果您使用的PHP版本大于5.3.7,您应该为您的河豚算法使用
$2y$
,因为2011年发现了对
$2a$
的攻击。

这不是您对河豚使用
crypt
的方式(
$2a$

您需要指定强度,以及最后的盐

试试这个
crypt($password,$2a$08$'.$salt)

明显增加了强度以提高安全性,但牺牲了处理时间



我还应该补充一点,如果您使用的PHP版本大于5.3.7,您应该为您的blowfish算法使用
$2y$
,因为2011年发现了对
$2a$
的攻击。

告诉我们如何调用
pwdenscript()
。顺便说一下,正确的拼写是“Encrypt”@ThiefMaster谢谢你的通知。我用你询问的信息编辑了这篇文章确保你确实通过了$password和$salt,可能没有为这些变量传递值,你得到的只是
crypt()
$2a$
$
@Austin,我已经测试过了。不同的密码产生不同的哈希。否则,所有的哈希值都是相同的。演示如何调用
pwdenscript()
。顺便说一下,正确的拼写是“Encrypt”@ThiefMaster谢谢你的通知。我用你询问的信息编辑了这篇文章确保你确实通过了$password和$salt,可能没有为这些变量传递值,你得到的只是
crypt()
$2a$
$
@Austin,我已经测试过了。不同的密码产生不同的哈希。如果你的系统有
CRYPT\u BLOWFISH
可用,而这正是你想要做的,那么Leigh的答案是正确的。我正想问这个问题!谢谢你的努力!这仍然是一个很好的有效答案;)如果你的系统有可用的
CRYPT\u河豚
,而这正是你想要做的,那么Leigh的答案是正确的。我正要问这个问题!谢谢你的努力!这仍然是一个很好的有效答案;)@乔迪亚斯:请看我的编辑。对于算法的选择,这里有一些指导。但是,我知道,2y$似乎不起作用。。。我正在LocalHost上运行PHP5.3.5您的PHP版本可能太低了(如果它太低,您真的应该升级)有什么方法可以基于PHP版本进行加密吗?@JoãoDias:您可以使用
version\u compare(PHP_version,'5.3.7')>=0
来检查版本。@JoãoDias:请查看我的编辑。对于算法的选择,这里有一些指导。但是,我知道,2y$似乎不起作用。。。我正在LocalHost上运行PHP5.3.5您的PHP版本可能太低了(如果它太低,您真的应该升级)有什么方法可以基于PHP版本进行加密吗?@JoãoDias:您可以使用
version\u compare(PHP\u version,'5.3.7')>=0
来检查版本。
return $salt = substr(sha1(uniqid(rand(), true)), 0, 2);
$hash = crypt($password, $salt);