6

所以,我有一个网站,可以从数据库中读取/验证(和写入)密码哈希,并且我有一些东西可以为此制作 SHA-512 风格的密码哈希,看起来像:

$6$GloHensinmyampOc$AxvlkxxXk36oDOyu8phBzbCfLn8hyWgoYNEuqNS.3dHf4JJrwlYCqha/g6pA7HJ1WwsADjWU4Qz8MfSWM2w6F.

该网站是基于 java 的,所以我为它写了一个 SHA-512 哈希。麻烦的是,有一堆运行的 perl cron 作业需要偶尔验证数据库的密码哈希,并且由于这些作业在 Solaris 机器上运行,它的 crypt 不支持 $6$ 格式。

所以,当我这样做时:

printf("crypt => '%s'\n",crypt("Hello",'$1$CygnieHyitJoconf$'));

我理智地回过神来:

crypt => '$1$CygnieHy$n9MlDleP0qmGCfpbnVYy11'

然而,如果我这样做

printf("crypt => '%s'\n",crypt("Hello",'$6$CygnieHyitJoconf$'));

我得到一个无益的

crypt => ''

有没有办法在不使用 glibc 的机器上获取 Perl 中的 SHA-512 密码哈希?(这就是我在主要进行搜索时被告知的内容(“使用地穴”)。

我真的不想在 perl 中重新实现 SHA-512 密码哈希。

谢谢!

4

2 回答 2

7

实际上,我想我刚刚找到了自己的答案:Crypt::Passwd::XS

Crypt::Passwd::XS - 通用 crypt() 算法的完整 XS 实现

它有 unix_md5、apache_md5、unix_des、unix_sha256 和 unix_sha512 .. 我想它没有做河豚有点不幸。但是,尽管如此,它解决了我的问题!无论如何感谢@hobbs!

use strict;
use Crypt::Passwd::XS;

{
        printf("crypt => %s\n",Crypt::Passwd::XS::crypt("Hello",'$6$CygnieHyitJoconf$'));
}

现在返回

crypt => $6$CygnieHyitJoconf$vkGJm.nLrFhyWHhNTvOh9fH/k7y6k.8ed.N7TqwT93hPMPfAOUsrRiO3MmQB5xTm1XDCVlW2zwyzU48epp8pY/

正如预期的那样!

于 2012-06-14T18:14:32.957 回答
3

不幸的是没有。crypt将是您的系统 libc crypt,它负责选择算法并将前缀字符串映射到算法。如果您想访问系统中没有的算法,crypt那么您需要使用它们的重新实现,对于 libc 的情况,我不知道有任何重新实现。glibc 的“SHA-512”密码哈希不仅仅是 SHA-512;这是我所知道的 glibc 之外不存在的自定义算法。如果您仍有机会,您可能希望更改为 bcrypt 或 PBKDF-SHA-2 之类的算法,该算法在不同语言中具有多种实现。

于 2012-06-13T15:10:26.787 回答