所以,我有一个从数据库中读取/验证(和写入)密码哈希的网站,我有一些东西可以生成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密码哈希。
谢谢!
答案 0 :(得分: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/
正如所料!
答案 1 :(得分:3)
不幸的是没有。 crypt
将是您的系统libc crypt
,它负责选择算法并将前缀字符串映射到算法。如果您想要访问系统中不存在的算法crypt
,那么您需要使用它们的重新实现,而对于libc,我不知道任何重新实现。 glibc的“SHA-512”密码哈希不仅仅是SHA-512;这是我所知道的glibc之外不存在的自定义算法。如果您仍有机会,可能需要更改为bcrypt或PBKDF-SHA-2等具有多种不同语言实现的算法。