2011-04-06 68 views
1

(由於對我的問題有些困惑而更新)我們使用此方法生成digested_pa​​ssword,將其保存到我們的數據庫中供以後查找。當我們向我們的應用程序驗證用戶身份時,此方法再次針對他們的輸入進行運行,並且如果digested_pa​​ssword輸出與我們保存在數據庫中的digested_pa​​ssword匹配,我們會對其進行身份驗證。我需要在PHP中爲共享數據庫的另一個應用程序重現此功能。Ruby中的sha512密碼檢索php

def self.hash_password(password, salt) 
    salted_password = password.insert 4, salt 
    digested_password = Digest::SHA512.hexdigest("#{salted_password}") 
    return digested_password 
end 

我真的沒有Ruby的經驗,所以請原諒我的缺乏理解。

謝謝!

回答

2

因爲你不能從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 > 
+0

我想我的問題並不十分清楚,但我們實際上是在數據庫中儲存了digested_pa​​ssword及其salt。當用戶登錄系統時,該功能針對用戶輸入和salt運行,並且如果數據庫中的加密密碼與來自此方法的digest_password匹配,我們對其進行身份驗證。我只需要一個PHP的等價物來共享這個數據庫的另一個應用程序。對困惑感到抱歉! – somecallmemike 2011-04-06 16:57:49

+0

@somecallmemike,在這種情況下,我在這裏鞭打的功能*應該*做這項工作。 – Charles 2011-04-06 17:09:39

+0

如果字符串太短,Ruby會觸發錯誤。所以它可能不關心PHP版本在短字符串上做什麼,因爲這是用於驗證的。 – Matthew 2011-04-06 17:17:20

1

SHA512是一個one way hash function,這意味着你不能輕易獲得任何給定輸出的輸入。

建立一個rainbow table是可能的,但非常昂貴。因爲這是一個鹽醃散列,所以它更加困難

2
function hash_password($password, $salt) 
{ 
    $salted_password = substr_replace($password, $salt, 4, 0); 
    $digested_password = hash('sha512', $salted_password); 
    return $digested_password; 
} 
+0

太棒了!在我回答問題之前沒有看到您的回覆。這是一個更好的實現,謝謝! – somecallmemike 2011-04-06 17:13:52

0

我想通了。我不太瞭解Ruby中的insert方法,結果證明salt正被插入到第四個字符的密碼中。這裏是PHP的等價物:

$password_input = "derpaderp"; 
$password_salt = "aderp"; 
$arg=substr_replace($password_input, $password_salt, 4, 0); 
$pass = hash('sha512', $arg); 
if ($digested_password_from_database == $pass){ echo "success!"; } 

感謝您的答覆人。