2017-09-29 33 views
-2

我正在使用encryptByKey()進行Yii2中的SSN和帳號加密。問題是,當我嘗試重新生成同一帳號時,它會生成不同的加密數據。Yii2加密生成不同的加密數據

我不能像下面的數據庫匹配它:

Customers::findOne(['account_number'=> Yii::$app->getSecurity()->encryptByKey($account_number, "someKeyHere")]); 

是否有任何加密方法可用來生成相同的加密數據每次我對其進行加密的時間?

謝謝,

回答

1

通常,這就是加密應該工作的方式。它有時被稱爲"ciphertext indistinguishability."每次給定明文被加密時產生相同的密文會破壞安全性,允許攻擊者分析模式的密文集合。

在這種情況下,它看起來像只存儲加密帳號的一個實例;你可以爭辯說,因爲「消息」從不重複,所以密文不可區分性是沒有意義的。這可能會導致您證明使用ECB模式(如果您的API提供了該模式)或HMAC(消息驗證代碼,由hashData()方法提供)來計算查找密鑰。如果攻擊者訪問您的數據庫,則每個密鑰只有一個實例,並且沒有任何顯示。

但是,如果攻擊者可以提供系統加密的帳號,這仍然不安全。例如,攻擊者可能構成合法用戶並在註冊期間提供SSN。如果他們選擇重複號碼,然後查看數據庫,則他們惡意選擇的加密值將與合法記錄匹配。或者,如果系統因爲重複而拒絕其帳號,攻擊者就會知道這是合法用戶正在使用的號碼。這稱爲oracle attack.

如果您使用HMAC(或ECB模式加密),您將不得不非常小心地設計您的應用程序以防止選擇明文和oracle攻擊。坦率地說,如果您現在第一次遇到這些想法,那麼您的知識中可能存在許多其他缺陷,這些缺陷將導致您的應用程序中容易被利用的漏洞。

+0

非常感謝(Y) – Tahir