使用我有我使用的加密和iOS應用程序解密一些字符串一些代碼。代碼涉及使用CCCrypt。有沒有一種可靠的方法來測試密鑰的有效性,而不用在任何地方實際存儲密鑰?從我的研究看來,似乎只有通過使用密鑰長度和密鑰哈希來接近告訴密鑰是否有效。任何人都可以引導我以正確的方向嗎?可靠的方式,如果錯了鍵在AES256解密
回答
獲得答案需要一點關於正確加密的背景知識。你可能已經知道這一點,但大多數人做錯了,所以我正在覆蓋它。 (如果你使用密碼進行加密,並且不編碼至少一個HMAC,兩種鹽和一種IV,那麼你就錯了。)
首先,你必須使用HMAC(見CCHmac()
)您使用未經身份驗證的模式(例如AES-CBC)進行加密。否則,攻擊者可以用導致其解密爲不同消息的方式修改密文。有關此攻擊的示例,請參閱modaes。 HMAC是基於密鑰的密碼安全散列。
第二,如果你使用的是基於密碼的加密,您必須使用KDF把它轉換成一個密鑰。最常見的是PBKDF2。你不能只將密碼字節複製到一個密鑰中。
假設你正在使用的密碼這種方式,你通常生成兩個密鑰,一個用於加密,一個用於HMAC。
OK,用到位的部分,你可以驗證密碼是正確的,因爲如果它不是HMAC將失敗。這是如何RNCryptor這樣做。
有兩個問題,這個簡單的方法:你要處理整個文件之前,您可以驗證的密碼,就沒有辦法來檢測文件損壞VS密碼錯誤。
要有所修復這些問題,你可以說你HMAC單獨添加額外的數據的一小塊。然後您驗證該小塊而不是整個文件。這基本上是如何aescrypt做到這一點。具體來說,它們生成一個「真實」密鑰來加密整個文件,然後使用分別由PBKDF2生成的密鑰和HMAC對該密鑰進行加密。某些形式的腐敗仍然看起來像不好的密碼,但以這種方式區分它們會更容易一些。
您對以下過程有何看法:我使用密鑰來加密自己,並將其與其他加密信息一起存儲。當用戶提供解密信息的密鑰時,我將自己的密鑰加密並檢查它是否與加密密鑰匹配。如果是這樣,我可以繼續使用用戶提供的密鑰解密數據。 –
如果設計正確,它可能沒問題(儘管沒有HMAC,你仍然可以在你的密文中操縱,所以你通常會需要這個)。在密鑰之前,你一定會想要一個隨機的IV。我不知道這是否會比消息開頭的一組已知固定字節更好。我不得不考慮這一點。 –
非常感謝您的幫助,我看了一下RNCryptor類,可能會使用它,它似乎根據我在其文檔中閱讀的內容來完成所需的任何操作。 –
您可以在數據庫中存儲用該密鑰加密的已知值。驗證密鑰是否正確非常簡單:您可以對已知字符串進行加密,並將其與數據庫中的加密輸出進行比較。如果您堅持使用一個數據塊,那麼您不必擔心操作模式,並且可以保持簡單。
也可以存儲密鑰的哈希值,但我會將密鑰當作密碼,並採取所有的防禦措施來存儲數據庫中的密碼(例如,使用bcrypt,salt hash等)。
如果你不能存儲這些值,你可以解密某些你不知道實際內容的東西,但也許知道消息的一些屬性(例如ASCII文本,當前日期在字符串中的某處等)併爲這些屬性測試解密後的消息。然後,如果沒有這些屬性的解密塊(例如具有MSB設置的字節,沒有日期的實例),則知道密鑰無效。在這種情況下可能會出現誤判,但機會非常低。
一般來說,我同意Peter Elliott。不過,我有一些額外的意見:
a)如果再隨機產生的密鑰的密鑰存儲哈希值是安全
b)您可以隨時連接到加密的郵件(如果你可以控制)的哈希原始消息。在這種情況下,您可以解密消息,獲得解密消息的散列並將其與原始消息的散列進行比較。如果它們是eqaul,那麼正確的密鑰用於解密。
- 1. iOS AES256解密
- 2. AES256解密問題
- 3. Objective C AES256解密
- 4. C#/ Java | AES256加密/解密
- 5. 解密AES256加密字節
- 6. AES256加密/解密速度
- 7. 在PHP中加密和JS解密 - AES256
- 8. 如何在網絡(ASP)中解密AES256
- 9. ASP25中的AES256加密和解密
- 10. linux aes256與cbc加密/解密庫
- 11. 如何在PHP中解密iPhone加密的AES256文本
- 12. 在KeyChain Access中存儲加密/解密密鑰的可靠性?
- 13. 如何解密在nodejs中加密的golang中的AES256位密碼?
- 14. 解密AES256從node.js的在.NET加密數據 - 如何從密碼短語
- 15. 的NodeJS AES256加密是從網上AES256加密工具
- 16. 在Matlab中使用AES256加密/解密圖像
- 17. 需要加密AES256
- 18. 瞭解前一頁地址的可靠性方法
- 19. 如何在iOS中使用AES256解密字符串
- 20. AES256 iOS中的NSString加密
- 21. 解密不同的鍵給出了相同的結果
- 22. 瞭解SVN錯誤:如果
- 23. Java不可靠的RSA加密/解密字符串
- 24. LAST_INSERT_ID更可靠的解決方案
- 25. 在MachineKey中使用AES256作爲SqlMembershipProvider的「解密」
- 26. 使用初始化向量解密AES256-rijdeal加密文件
- 27. C#服務器與java/c#客戶端,aes256加密和解密
- 28. AES256加密用PHP rijndael_256 ECB_MODE
- 29. 我可以使用PBKDF2生成AES256密鑰來加密和隱式驗證嗎?
- 30. IOS DES加密和解密PHP工作不可靠
通過嘗試解密使用它加密的內容來「測試」密鑰的有效性。 –
您可以使用錯誤的密鑰解密某些內容。它不會是正確的解密,但輸入的文本預先加密不在於確認解密的有效性。如果輸入的文本在那裏,那將會失敗整個過程的目的。 –
你解密你可以識別的東西。 –