2014-02-13 66 views
5

Amazon擁有適用於iOS的AWS開發工具包,以及several sample apps。在他們的樣本,他們把API證書在Constants.h文件:iOS:在代碼中是否包含API密鑰的安全方法?

// Constants used to represent your AWS Credentials. 
#define ACCESS_KEY_ID   @"CHANGE ME" 
#define SECRET_KEY    @"CHANGE ME" 

我擔心的是,這些可以通過一個意志堅定的黑客提取。有什麼方法可以安全地在應用程序中包含API密鑰?

我見過的一個選項是包括我自己的服務器作爲中介:應用程序與我的服務器通話,我的服務器與S3通信。我可以看到這樣做的價值,但仍然存在一個問題:我是否允許應用程序在沒有任何身份驗證的情況下在我的服務器上進行API調用?在應用程序中包含我自己的API密鑰與包含AWS API密鑰的問題相同。

+1

如果它們被存儲在該應用(特別是在明文),則它們可以被檢索。您的應用程序能否在第一次運行(使用https)時檢索密鑰,然後使用KeychainItemWrapper將其存儲。如果是這樣,您還應該確保您還爲訪問鑰匙串設置適當的應用安全級別。 –

+0

這聽起來像一個好主意。我甚至可以制定一些措施強制它在一週後過期,以防我需要更換一組不同的憑證。 –

回答

3

有幾種憑證管理選項可幫助您避免在應用中嵌入憑據。首先是Web Identity Federation,它允許用戶使用Facebook,Google或Login With Amazon登錄到您的應用程序。另一種選擇是使用令牌自動售貨機,它是一種向您的應用程序分發臨時憑證的服務器組件。

沒有與指針在AWS移動開發博客相關的文檔和代碼示例一個高度概括:http://mobile.awsblog.com/post/Tx3UKF4SV4V0LV3/Announcing-Web-Identity-Federation

+0

對於這個用例,令牌自動售貨機聽起來是最好的選擇。謝謝! –

0

大概你colud存儲他們在一個編碼的形式和編碼他們根據需要。

+0

您可能會依賴可逆或加密的混淆。如果你加密了密鑰,你仍然需要存儲解密的密鑰,這是一個遞歸問題。你將如何存儲加密密鑰? –

+0

@StephenJohnson混淆密鑰在使用純文本方面仍然是一大改進。 – rmaddy

+0

@rmaddy同意! –

0

你試過KeychainItemWrapper嗎?

KeychainItemWrapper *keychain = 
[[KeychainItemWrapper alloc] initWithIdentifier:@"TestAppLoginData" accessGroup:nil]; 

設置

[keychain setObject:@"some text" forKey:(id)kSecAttrAccount]; 
[keychain setObject:@"some pass" forKey:(id)kSecValueData]; 

獲取

NSString *text = [keychain objectForKey:(id)kSecAttrAccount]; 
NSString *pass = [keychain objectForKey:(id)kSecValueData]; 

Keychain Services Programming Guide

導入前Security.framwork

我沒有檢查這個代碼,如果有些東西不起作用,請告訴我

+1

這不回答這個問題。這是如何隱藏密鑰的?這仍然需要鑰匙在代碼中。 – rmaddy

+0

@rmaddy'有什麼方法可以將API密鑰安全地包含在應用程序中?'。可能我誤解了 – Zhans

+0

閱讀問題中的代碼。他的代碼中有一個關鍵字。他正在詢問如何從代碼中隱藏該密鑰,以便黑客無法找到它。使用鑰匙串不會隱藏應用程序代碼中的密鑰。 – rmaddy

相關問題