2014-04-01 49 views
1

我在應用的文檔目錄中保存了一個重要的文件。我不允許其他人查看其內容,因此我使用自動生成的AES密鑰對文件進行加密,並使用RSA公鑰對此AES密鑰進行加密,然後將加密的AES密鑰保存到NSUserDefaults。在我的代碼中寫入RSA私鑰是否安全

當使用重要文件時,我將獲取加密的AES密鑰並使用RSA公鑰解密AES密鑰,然後解密該文件。

但我不知道在哪裏存儲RSA私鑰,是否安全地將其寫入我的代碼中,如NSString *rsaPrivateKey = @"%^^&*(())";,如果不是,是否有更安全的解決方案?

我知道如何使用OpenSSL的(This link helps me

編輯生成RSA公鑰和私鑰:

的重要文件,是隻開放給用戶自己,你可以把它看作與一些敏感的照片內容和照片由用戶保存。

+0

這是一個敏感的話題。你無法在本地存儲它,這將是完全的黑客證明。最好的辦法是從服務器獲取它並將其存儲在iOS鑰匙串中。從程序中獲取字符串不是很難。 – borrrden

+0

@borrrden謝謝你的回答。我知道最好從服務器上獲取它,但實際上我沒有服務器... – KudoCC

+0

如果你沒有服務器,那麼我建議使用'#define'來代替它,並使它成爲一個C字符串。實際上,將它們組合成一個'NSString',或者甚至可以將密鑰基於您在運行時生成的UUID。 – borrrden

回答

1

原則上你試圖解決DRM問題。只要你不能相信運行時系統,就沒有完整的解決方案。最好的選擇是將密鑰存儲在系統提供的容器中,並希望這些密鑰能夠得到很好的保護(即已經提到的iOS密鑰鏈)。

如果失敗,您可以使用設備中的某些靜態信息生成的AES密鑰來加密您的RSA密鑰。這應該被認爲是混淆而不是加密,因爲密鑰並不是真正的祕密。您應該嘗試使用標準容器格式(例如PKCS#8)來加密密鑰。

可以從一組靜態數據生成RSA密鑰(使用PRNG在RSA密鑰對生成器中提供此數據),但這些方案不是標準化的,非常脆弱並且佔用了未指定數量的CPU時間,所以我會強烈建議不要走這條路。

+0

好吧,由於重要文件對用戶自己開放,所以使用密鑰鏈應該是一個很好的解決方案。但是我將面臨的問題是如何在運行時生成RSA公鑰和私鑰。你有什麼建議嗎?謝謝。 – KudoCC

+0

如果您仍然需要RSA密鑰對,問題真的會變成現實。您也可以使用鏈中的密鑰加密對稱密鑰。只要一切都停留在同一臺設備上,就不需要PKI。 –

+1

是的,我是多麼的愚蠢! :) – KudoCC