1

我正在寻找类似于 radcrypt 输出的 PHP 解决方案。

我研究了 mcrypt,似乎无法弄清楚我应该使用哪种密码和设置。

Mcrypt 希望在加密中添加盐,但 radcrypt 似乎没有盐。

任何人都知道 radcrypt 的密码和/或设置是什么?

4

1 回答 1

2

为此,您不需要 mcrypt。这些密码作为散列,未加密。

radcrypt脚本是从这部分 Perl 构建的。它依赖于 Perl 的内置crypt函数,其语义类似于标准crypt函数

PHP还提供crypt. 在 5.3 之前,PHP 使用相同的功能,以相同的方式调用,生成相同的哈希值。从 5.3 开始,PHP 的实现与该语言捆绑在一起,而不是依赖于外部库,从而允许添加和增强。

radcrypt脚本自动生成盐,使用两个字符作为 DES,使用八个字符作为 MD5:

$salt = ($opt_md5 ? '$1$' : '');
for ($i = 0; $i < ($opt_md5 ? 8 : 2); $i++) {
    $salt .= $saltc[rand 64];
}
$salt .= '$' if ($opt_md5);
print crypt($ARGV[0], $salt), "\n";

DES crypt 将散列存储为前两个字符。例如,crypt('password', 'aa')产生aajfMKNH1hTm2.

MD5 crypt 将散列存储为$分隔部分的一部分。例如,crypt('password', '$1$iamasalt$')产生$1$iamasalt$RSUhkOk5NVnvbM3BPw/g8/.

知道了这一点,您现在可以使用 PHP 或任何其他提供标准的语言正确地创建预期的密码格式cryptcrypt还知道如何从散列字符串中提取盐,因此您可以将已经散列的密码传回以验证密码:

$hash = '$1$iamasalt$RSUhkOk5NVnvbM3BPw/g8/';
$password = 'password';
if($hash == crypt($password, $hash)) {
    print "Passwords matched.\n";
}

顺便说一句,该代码在 Perl 和 PHP 中都有效。

请务必阅读上面的维基百科文章,尤其是有关密码安全的部分。DES 和 MD5 散列都不能抵御暴力攻击。你不应该使用这两种方法中的任何一种,除非你被只支持这两种散列类型的东西所要求(比如,我不知道,FreeRADIUS)。

于 2014-03-06T18:12:57.313 回答