2013-01-24 66 views
5

使用我有我使用的加密和iOS應用程序解密一些字符串一些代碼。代碼涉及使用CCCrypt。有沒有一種可靠的方法來測試密鑰的有效性,而不用在任何地方實際存儲密鑰?從我的研究看來,似乎只有通過使用密鑰長度和密鑰哈希來接近告訴密鑰是否有效。任何人都可以引導我以正確的方向嗎?可靠的方式,如果錯了鍵在AES256解密

+1

通過嘗試解密使用它加密的內容來「測試」密鑰的有效性。 –

+1

您可以使用錯誤的密鑰解密某些內容。它不會是正確的解密,但輸入的文本預先加密不在於確認解密的有效性。如果輸入的文本在那裏,那將會失敗整個過程的目的。 –

+2

你解密你可以識別的東西。 –

回答

6

獲得答案需要一點關於正確加密的背景知識。你可能已經知道這一點,但大多數人做錯了,所以我正在覆蓋它。 (如果你使用密碼進行加密,並且不編碼至少一個HMAC,兩種鹽和一種IV,那麼你就錯了。)

首先,你必須使用HMAC(見CCHmac())您使用未經身份驗證的模式(例如AES-CBC)進行加密。否則,攻擊者可以用導致其解密爲不同消息的方式修改密文。有關此攻擊的示例,請參閱modaes。 HMAC是基於密鑰的密碼安全散列。

第二,如果你使用的是基於密碼的加密,您必須使用KDF把它轉換成一個密鑰。最常見的是PBKDF2。你不能只將密碼字節複製到一個密鑰中。

假設你正在使用的密碼這種方式,你通常生成兩個密鑰,一個用於加密,一個用於HMAC。

OK,用到位的部分,你可以驗證密碼是正確的,因爲如果它不是HMAC將失敗。這是如何RNCryptor這樣做。

有兩個問題,這個簡單的方法:你要處理整個文件之前,您可以驗證的密碼,就沒有辦法來檢測文件損壞VS密碼錯誤。

要有所修復這些問題,你可以說你HMAC單獨添加額外的數據的一小塊。然後您驗證該小塊而不是整個文件。這基本上是如何aescrypt做到這一點。具體來說,它們生成一個「真實」密鑰來加密整個文件,然後使用分別由PBKDF2生成的密鑰和HMAC對該密鑰進行加密。某些形式的腐敗仍然看起來像不好的密碼,但以這種方式區分它們會更容易一些。

+0

您對以下過程有何看法:我使用密鑰來加密自己,並將其與其他加密信息一起存儲。當用戶提供解密信息的密鑰時,我將自己的密鑰加密並檢查它是否與加密密鑰匹配。如果是這樣,我可以繼續使用用戶提供的密鑰解密數據。 –

+0

如果設計正確,它可能沒問題(儘管沒有HMAC,你仍然可以在你的密文中操縱,所以你通常會需要這個)。在密鑰之前,你一定會想要一個隨機的IV。我不知道這是否會比消息開頭的一組已知固定字節更好。我不得不考慮這一點。 –

+0

非常感謝您的幫助,我看了一下RNCryptor類,可能會使用它,它似乎根據我在其文檔中閱讀的內容來完成所需的任何操作。 –

0

您可以在數據庫中存儲用該密鑰加密的已知值。驗證密鑰是否正確非常簡單:您可以對已知字符串進行加密,並將其與數據庫中的加密輸出進行比較。如果您堅持使用一個數據塊,那麼您不必擔心操作模式,並且可以保持簡單。

也可以存儲密鑰的哈希值,但我會將密鑰當作密碼,並採取所有的防禦措施來存儲數據庫中的密碼(例如,使用bcrypt,salt hash等)。

如果你不能存儲這些值,你可以解密某些你不知道實際內容的東西,但也許知道消息的一些屬性(例如ASCII文本,當前日期在字符串中的某處等)併爲這些屬性測試解密後的消息。然後,如果沒有這些屬性的解密塊(例如具有MSB設置的字節,沒有日期的實例),則知道密鑰無效。在這種情況下可能會出現誤判,但機會非常低。

0

一般來說,我同意Peter Elliott。不過,我有一些額外的意見:

a)如果再隨機產生的密鑰的密鑰存儲哈希值是安全

b)您可以隨時連接到加密的郵件(如果你可以控制)的哈希原始消息。在這種情況下,您可以解密消息,獲得解密消息的散列並將其與原始消息的散列進行比較。如果它們是eqaul,那麼正確的密鑰用於解密。