2011-02-24 34 views
18

我使用PHP的mcrypt庫和AES-256(rijndael)算法,它需要一個鍵+初始化向量才能運行。加密:使用初始化向量與鍵?

我的邏輯思維並不真正與此相伴。 是不是一個足夠的關鍵?

理論情景:
如果我加密存儲在數據庫中,只有車主應能夠解密敏感數據,這將是適合使用的用戶哈希密碼要麼鍵或初始化矢量到他或她的數據?

應該重點考慮比初始化向量更多的私人或者是周圍的其他方式?

+2

+1好問題。 – rook

回答

11

不,實際上IV在大多數實現中都是至關重要的。 IV也被認爲對公衆有用,例如IV以WEP和WPA1/WPA2的明文形式傳輸。如果使用相同的密鑰+ iv來加密相同的純文本,則會出現問題。密碼文本將是相同的,除非你使用IV。如果攻擊者可以用此密鑰加密任意純文本,然後查看密文。這是暴力破解攻擊者獲得的其他密文的更快方式。

不僅如此,該IV必須是隨機的,或者你就違反了CWE-329。這是一個問題的原因有點微妙和I didn't get it at first。您沒有提到這一點,但我希望您使用的是密碼上使用散列函數幾乎與使用String2Key函數相同。只要攻擊者無法使用SQL注入來獲取密鑰,這是一個可靠的設計。

+0

Hi Rook。這對我來說都是新聞。非常感謝!如果我用非隨機IV的'CFC',我應該是安全的? – Industrial

+0

@工業實際上它的'CBC'模式和IV **必須是隨機的。在數據庫中,您可以爲iv創建一個列,並使用'mt_rand()'生成此編號。 – rook

+0

@ R嗯。我無法解密我的加密的字符串,而沒有在加密和解密之間保持一致的IV,所以沒有真正的隨機存在。也許我做錯了什麼,或者你是說IV總是應該完全隨機化的? – Industrial

6

初始化向量(IV)是不是一個關鍵的一切,已經不是祕密了。事實上,它經常被暴露(例如被加密數據前置)。它用作加密算法的附加隨機輸入,因此每次使用不同的IV時,加密相同清除數據的結果都不相同。這樣,無法在加密數據上收集統計信息。它本身不會「改善」加密強度。

你可以看看here的漂亮表示如何以及爲什麼IV使用。

+0

太好了。謝謝! – Industrial

7

不要將散列密碼用作密鑰和IV的單一來源。作爲一個經驗法則,您應該隨機生成IV EVERY TIME,更新加密數據並將IV存儲到該數據中。密鑰可以多次重複使用,但是也可以使用醃製哈希和數據存儲鹽。

如果你只是哈希的用戶密碼,並用它作爲加密密鑰,用戶使用相同的密碼,將有相同的密鑰。根據您的數據庫結構和入侵者訪問權限,當可以檢測到具有相同密碼的用戶時,可能會出現一些不幸的情況。至少爲此散列添加唯一的用戶名。

如果您不更改每個數據更新的IV,則有關數據更改的信息可能會泄漏。在CBC或CFB模式下,相同的第一個明文塊將被加密爲相同的密文,直到第一個明文變化,因此可以確定這種變化的位置。

+0

非常重要的建議 – davka

+0

非常感謝你的建議! – Industrial

+0

因此,而不是DB中的一個字段,現在至少需要3個字段?加密值,IV和鹽?我們甚至可以將密鑰添加到數據庫中,使其在數據庫中有4個字段(但我不會將密鑰保存到數據庫)。聽起來像很多工作,可能是不必要的? – Piero

0

如果您使用的塊加密的EBP模式,或大部分流密碼中,相同的鍵+ IV上不同明文的組合將提供攻擊者對密鑰的XOR結果的直接視圖。這個擴展揭示了密鑰本身以及在某種程度上的密碼。

但是,我的意思是說IV是絕對必要的嗎?不,只要你在你的下一個純文本塊中每次更改你的密碼(即使是第二次同一個塊),你也完全沒有IV。實際上,IV所做的就是上述過程的自動化。

+0

什麼是EBP模式?從來沒有聽說過這個,快速搜索也沒有發現任何東西。 OFB和CTR模式泄漏密鑰流,因爲它們實際上是流密碼。但沒有流行模式泄漏密鑰本身。 – CodesInChaos