2015-04-08 33 views
1

我正在使用Laravel 5,並且對於其中一位租戶是系統中存儲的電子郵件必須加密的項目。我使用Laravel 5的Crypt::外觀,以及相關的encrypt()decrypt()方法。Laravel 5加密 - 給定相同字符串的不同值?

問題在於即使給定相同的字符串,加密值似乎也不相同。起初,我認爲它可能與VARCHAR字段的最大長度有關,但是這兩個散列值都會在字段中設置的255長度以下返回。

舉例來說,這個轉儲;

PHP

$hash1 = 'eyJpdiI6InJFNTFkdktpVU9cL1wvRTJPVk94SURiUT09IiwidmFsdWUiOiJIZVh4Y1NyUGpVcTVFVTNSbWdUNnJCUWRHSGZTcnFTQWJKa1h0Q1wvMEVtZnFuM3dDeFwvXC9hdUs4enFXXC94dEJ0cSIsIm1hYyI6IjFjNjZjODFjMjI5NTQ0NmVhZDUwODQzODE0OTQ4NTdjMzAxNTQ5Y2ZjY2M4YzRiODU0ZjIwNDhmMDA0Yjc4OWQifQ'; 
    $hash2 = 'eyJpdiI6ImRBVWNKVTlJZVFmckk2T0c4cXNObFE9PSIsInZhbHVlIjoidElqcE5TMUFwVHZXeW12R3hKMFVFWlR0WmgxOFRBbW5cL2V3dUJ6VndsdktLYjVGR2JQQWpSUUNUWDBJbU5OQWEiLCJtYWMiOiI3MjM3ODNiMzc0NDJlNDVhYzFkOTBmMjhhOTk0MTUyM2FlNzM5ZGE4ODE3MTJlMDM5NWZiMzViZjM5OTA0MGRhIn0='; 
    $dump = [ 
    'hash1' => $hash1, 
    'hash2' => $hash2, 
    'string1' => Crypt::decrypt($hash1), 
    'string2' => Crypt::decrypt($hash2) 
    ]; 
    return $dump; 

傾銷對象

hash1: "eyJpdiI6InJFNTFkdktpVU9cL1wvRTJPVk94SURiUT09IiwidmFsdWUiOiJIZVh4Y1NyUGpVcTVFVTNSbWdUNnJCUWRHSGZTcnFTQWJKa1h0Q1wvMEVtZnFuM3dDeFwvXC9hdUs4enFXXC94dEJ0cSIsIm1hYyI6IjFjNjZjODFjMjI5NTQ0NmVhZDUwODQzODE0OTQ4NTdjMzAxNTQ5Y2ZjY2M4YzRiODU0ZjIwNDhmMDA0Yjc4OWQifQ" 
hash2: "eyJpdiI6ImRBVWNKVTlJZVFmckk2T0c4cXNObFE9PSIsInZhbHVlIjoidElqcE5TMUFwVHZXeW12R3hKMFVFWlR0WmgxOFRBbW5cL2V3dUJ6VndsdktLYjVGR2JQQWpSUUNUWDBJbU5OQWEiLCJtYWMiOiI3MjM3ODNiMzc0NDJlNDVhYzFkOTBmMjhhOTk0MTUyM2FlNzM5ZGE4ODE3MTJlMDM5NWZiMzViZjM5OTA0MGRhIn0=" 
string1: "[email protected]" 
string2: "[email protected]" 

點輸入到位隱私的人物,但他們是完全一樣的。我唯一能想到的其他事情可能是某種字符集格式化?

任何幫助解決這個將不勝感激!

問候。

+1

等等,如果解密後的散列最終是相同的,那麼問題是什麼? –

+0

如果密鑰不同,則加密值將不同;而且鑰匙不應該總是一樣,否則它會變得可以預測並容易破裂。這就是整個點 –

+0

@MarkBaker道歉,我一般都不太瞭解加密 - 我認爲相同的價值將會被賦予兩種方式。關鍵是這些值必須存儲在數據庫表中,但是作爲數據行的檢索點,我現在必須找出另一種更可行的方法:)。 – VitaCoco

回答

4

如果我理解你的問題,這就是爲什麼加密結果不同,即使使用相同的輸入和相同的密鑰?

(你提到這些是哈希值,但地穴::加密()和解密()是對稱加密)

Laravel Crypt uses CBC mode by default。這意味着每次你加密一些東西時它會產生一個隨機的IV,以確保輸出總是不同的。

如果不使用CBC等模式,則可能會泄漏信息。如果我知道[email protected]總是加密到eyJpdiI6InJFNTFkdktpVU9cL1wvRTJPVk94SURiUT09IiwidmFsdWUiOiJIZVh4Y1NyUGpVcTVFVTNSbWdUNnJCUWRHSGZTcnFTQWJKa1h0Q1wvMEVtZnFuM3dDeFwvXC9hdUs4enFXXC94dEJ0cSIsIm1hYyI6IjFjNjZjODFjMjI5NTQ0NmVhZDUwODQzODE0OTQ4NTdjMzAxNTQ5Y2ZjY2M4YzRiODU0ZjIwNDhmMDA0Yjc4OWQifQ,那麼即使不知道您的加密密鑰,我仍然知道有關您的消息(例如,它發送給誰)的東西

您可以看到風險的一個很好的例子here

編輯:如果這是用於密碼存儲的,則不應該使用encrypt()和decrypt()。您應該使用bcrypt()或PBKDF2。否則,假設妥協,攻擊者可以解密所有用戶密碼。

+1

Laravel的'Hash'外觀有一個方便的'make'方法,所以當你想生成例如''''''''時,你只需調用'Hash :: make($ string)'。用戶的密碼。這也是內置的'Auth'類用來檢查提交密碼的方式。 –

相關問題