2012-06-13 59 views
6

因此,我有一個網站從數據庫讀取/驗證(並寫入)密碼哈希,並且我擁有使SHA-512樣式密碼哈希的東西,那看起來像:在Perl中創建glibc 2.7樣式的Sha-512 crypt哈希

$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的密碼散列。

謝謝!

回答

3

不幸的是,crypt將是您的系統libc crypt,它負責選擇算法並將前綴字符串映射到算法。如果您想訪問不在系統crypt中的算法,那麼您需要重新實現他們,而在libc的情況下,我不知道任何重新實現。glibc的「SHA-512」密碼哈希不是簡單的SHA-512;它是一種自定義算法,它不會在我所知道的glibc之外並不存在。如果仍然有機會,您可能需要更改爲像bcrypt或PBKDF-SHA-2這樣的算法,該算法具有多種不同語言的實現。

+0

它不是一個自定義算法,因爲它是一種不同的算法。這是sha512crypt。 SHA512被設計成FAST,這與密碼散列函數所需要的相反。它遵循crypt(3)標準以及bcrypt,並且支持可變複雜性(當缺省5000輪不夠時,可變數量的'回合'使其在未來變得更加強大)。 crypt(3)總是用於密碼散列。沒有別的,永遠。 –

7

其實,我想我只是發現我自己的答案:Crypt::Passwd::XS

地穴:: ::的passwd XS - 全XS實現共同隱窩()的算法

它確實unix_md5,apache_md5,unix_des,unix_sha256和unix_sha512 ..我想它有點不幸,它不會做河豚。但是,儘管如此,它解決了我的問題!謝謝@hobbs無論如何tho!

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/ 

+0

嘿,很酷。我會注意到:) – hobbs

+0

哦,有趣的反諷。一個名爲「Crypt :: Passwd :: XS」的模塊,其中包含您不應該使用密碼的算法! bcrypt或PBKDF *傢伙,如果你不明白爲什麼,你最好去看看。這是微妙的,但只是「無用」和「作品」之間的區別! – cnd

+0

真的嗎?爲什麼你不應該使用unix_sha512?它鹽,據我所知它仍然是碰撞抵抗..? – bnsh