【问题标题】:PHP crypt function password encodingPHP crypt函数密码编码
【发布时间】:2023-09-17 10:09:01
【问题描述】:

无论哪种方式,以下代码都会返回相同的加密密码。我们为什么以及如何阻止这种情况。

$pwd = 'shits8888';
$salt = '50153fc193af9';

echo crypt($pwd,$salt)

显然缺少一些东西,因为这是返回相同的东西

$pwd = 'shits8888hjhfgnsdkjf8744884';
$salt = '50153fc193af9';

echo crypt($pwd,$salt)

【问题讨论】:

标签: php salt crypt


【解决方案1】:

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

http://php.net/manual/en/function.crypt.php

如果你想更好地控制用于哈希的算法,我建议你看看mcrypt

还要注意crypt()(尽管有名字)实际上并没有加密一个字符串,它只是生成一个哈希。如果您要指定盐,您可能还会将其存储在某个地方,那么您可能会使用以下方法做得更好:

function my_crypt ($string, $salt) {
  return sha1($string.$salt); // ...or your hashing function of choice
}

【讨论】:

  • 查看前 8 个字符似乎是一个很大的限制。有谁知道最初的目的是什么?如果有人目前正​​在使用基于 DES 的密码,是否有任何简单的方法可以转换为基于 MD5 的版本,而无需重新散列所有存储的密码?
【解决方案2】:

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

两个条目都有相同的前 8 个字符和相同的盐。所以它必须返回相同的结果。

例如:

echo crypt('12345678xxxxx','50153fc193af9');
echo crypt('12345678yyyyyy','50153fc193af9');

都将返回50gyRGMzn6mi6 因为它们共享相同的盐和相同的前 8 个字符

每个加密算法都有一个限制,甚至 md5 在某些时候都会重复。

【讨论】: