因爲你不能從SHA-512這樣的單向散列中「檢索」密碼,所以我們可以得到的最接近的是能夠從相同的密碼和鹽。讓我們來看看Ruby代碼:
def self.hash_password(password, salt)
salted_password = password.insert 4, salt
digested_password = Digest::SHA512.hexdigest("#{salted_password}")
return digested_password
end
唯一有點「怪異」這裏是調用.insert
method的密碼字符串。它基本上是將salt從第四個字符索引開始直接粘貼到密碼中。通常鹽與密碼簡單地連接。
我們可以使用substr
複製此:
function hash_password($password, $salt) {
$salted_password = substr($password, 0, 4) . $salt . substr($password, 4);
return hash('sha512', $salted_password);
}
我使用的是現在默認hash extension在這裏,因爲這幾乎是生成一個SHA-512散列最可靠的方法。
使用此代碼,您應該能夠爲給定的相同密碼和鹽組合生成相同的散列。我不確定密碼少於五個字符時的行爲。
是啊,看起來像它應該工作:
[[email protected] ~]$ irb
irb(main):001:0> require 'digest/sha2'
=> true
irb(main):002:0> def hash_password(password, salt)
irb(main):003:1> salted_password = password.insert 4, salt
irb(main):004:1> digested_password = Digest::SHA512.hexdigest("#{salted_password}")
irb(main):005:1> return digested_password
irb(main):006:1> end
=> nil
irb(main):007:0* puts hash_password('password', 'salt')
92d3efdbf51d199b0930c427b77dc8d5cf41ac58b6fab5f89cc3f32d719a8f6ffcdff6211bdd0565a6e7b09925839e5dcce1fa5abf65eca87c6a883ab0b510b9
=> nil
irb(main):018:0> exit
[[email protected] ~]$
[[email protected] ~]$ php -a
Interactive shell
php > function hash_password($password, $salt) {
php { $salted_password = substr($password, 0, 4) . $salt . substr($password, 4);
php { return hash('sha512', $salted_password);
php { }
php > echo hash_password('password', 'salt');
92d3efdbf51d199b0930c427b77dc8d5cf41ac58b6fab5f89cc3f32d719a8f6ffcdff6211bdd0565a6e7b09925839e5dcce1fa5abf65eca87c6a883ab0b510b9
php >
我想我的問題並不十分清楚,但我們實際上是在數據庫中儲存了digested_password及其salt。當用戶登錄系統時,該功能針對用戶輸入和salt運行,並且如果數據庫中的加密密碼與來自此方法的digest_password匹配,我們對其進行身份驗證。我只需要一個PHP的等價物來共享這個數據庫的另一個應用程序。對困惑感到抱歉! – somecallmemike 2011-04-06 16:57:49
@somecallmemike,在這種情況下,我在這裏鞭打的功能*應該*做這項工作。 – Charles 2011-04-06 17:09:39
如果字符串太短,Ruby會觸發錯誤。所以它可能不關心PHP版本在短字符串上做什麼,因爲這是用於驗證的。 – Matthew 2011-04-06 17:17:20