3

我正在使用 crypt 如下:

$pass = crypt($pass, 'd4');

用于针对 mysql 表插入和验证密码。问题是如果密码相似,它会产生相似的结果。是否有一种算法可以保证不同密码的不同结果?

4

4 回答 4

4

使用hash()并选择适合您的散列算法(如果可能的话,比 MD5 更强,但也不要一直使用 SHA512)

crypt()的手册页上,您会发现:

基于标准 DES 的 crypt() 将 salt 作为输出的前两个字符返回。它也只使用 str 的前八个字符,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的盐时)。

这应该解释为什么你会得到相同的结果。

于 2011-07-29T21:18:48.767 回答
2

crypt()只要您使用旧的基于 DES 的模式 ( CRYPT_STD_DES),使用就可以了。使用它的唯一正当理由是与使用此类密码哈希的旧软件的互操作性。

而是使用CRYPT_BLOWFISH,CRYPT_SHA256CRYPT_SHA512模式。这些是现代密码散列算法,可以接受任意长的密码,使用长盐并通过多次迭代支持密钥强化。

不幸的是,PHPcrypt()接口有些笨拙:明确选择所需算法的唯一方法是提供格式正确的$salt参数,这意味着您还必须自己生成实际的盐。不过,这可能比滚动您自己的密码哈希代码更容易、更安全。

于 2011-07-29T22:15:15.350 回答
1

你可以加盐。通常,如果您要存储密码,则需要对其进行哈希处理,而不是对其进行加密。如果你搜索它(比如在谷歌上),你可以了解很多东西。

于 2011-07-29T21:19:00.107 回答
1

从 php crypt() 页面:

基于标准 DES 的 crypt() 将 salt 作为输出的前两个字符返回。它也只使用 str 的前八个字符,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的盐时)。

您可能还想使用不同的加密方法,例如 MD5 或 SHA256,因为它们通常比 DES 更可取。

于 2011-07-29T21:24:42.660 回答