2015-10-08 64 views
1

我有一張以前由另一家公司創建的哈希表和鹽。哈希用C#完成,哈希方法是sha256。這背後的邏輯是sha256(password+salt)C#sha256進入PHP

的輸入的例子:

password = 'rosnicka' 
salt  = 'zxwqTy+XjaY=' 
hash  = '3jdt1+JL3MPmjYr2OoXdoUwNfuweuDCZa8/3g7SfsNg=' 

當我試圖在PHP

運行散列函數

的這個輸出是 "1125ed47a7aa11bc1c54c841b5eb7a6e72aa8ad27e010e6e25baa5b2a86cffb3"

我只使用散列計算器得到相同的結果

我與他們聯繫以瞭解我做錯了什麼。他們告訴我,在數據庫中存儲散列的ASCII版本。我應該怎麼做才能在PHP中獲得相同的散列或者爲了將它們的散列轉換爲原始的sha256散列做什麼?

非常感謝!

+1

C#的哈希值已經Base64編碼的(所以是鹽,因此它可能是Base64編碼被應用之前解碼),在PHP你有字節的十六進制表示。 Base64對PHP哈希結果進行編碼,如果它不匹配Base64對salt進行解碼,則附加字節,Base64對結果進行編碼。 –

+0

@AlexK。是的,但沒有更多的呢? Base64爲您提供了比輸入更大的輸出,而在上面的例子中,期望的散列只有44個字符 - 與sha256散列中的64個字符相比。 – JimL

+0

不,44個字符是合理的,Base64會更小 - 它的64個字符,因爲2個字符用於直觀地表示字符串中的每個字節,哈希長度是其中的一半。 –

回答

2

亞歷克斯K說:

base64_encode(hash('sha256', 'rosnicka'.base64_decode('zxwqTy+XjaY='), true)); 

會做的伎倆

+0

男人!我愛你:)我試圖重現逐行C#代碼,但我失敗了。爲什麼我不需要將所有內容都轉換爲字節數組? –

+0

@AdamBednár'true'參數將讓hash()輸出字節。您不必將所有內容都轉換爲字節,但只需確保連接相同類型的變量(密碼是純字符串,而salt是base64編碼的) –

+0

如果感謝幫助,請將答案標記爲選中@AdamBednár –