2012-03-01 33 views
48

我正在尋找一種方法在WP7應用程序中安全地存儲API密鑰。密鑰是一個字符串,目前被硬編碼到代碼中(見下文)。我知道有個反射器程序的人可以很容易地看到這個。有沒有更好的方式來打包這個鍵作爲我的應用程序的一部分?資源會更安全嗎?如何在C#中安全地嵌入靜態字符串(鍵)?

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt"; 

(這其實不是關鍵;))

預先感謝您。

+0

您可以將這些類型的數據存儲在.config文件中 – 2012-03-01 08:05:04

回答

21

看一看Safeguard Database Connection Strings and Other Sensitive Settings in Your Code,這是一個很好看的。您的問題位於「應用程序源代碼中的隱藏鍵」部分。

摘錄:

如果定義應用程序的關鍵,除了混淆組裝,儘量不實際的密鑰字節存儲的源代碼。相反,使用持久特性(例如加密算法,密鑰大小,密碼短語,初始化向量和鹽)(請參閱Encrypt and Decrypt Data Using a Symmetric (Rijndael) Key上的示例)來實現密鑰生成邏輯。這將引入一個額外的間接層,所以通過簡單地從應用程序二進制轉儲符號將無法訪問該密鑰。只要您不更改密鑰生成邏輯和密鑰特徵,則最終密鑰保證是相同的。最好不要使用靜態字符串作爲密鑰生成特性,而是動態構建它們。另一個建議是以與數據存儲應該相同的方式處理程序集,即通過應用適當的ACL。只有使用此選項作爲最後手段時,其他數據保護技術都不起作用,而您的唯一選擇是保留敏感數據未加密。

+9

您是否介意在此處總結內容?這將使得答案作爲一個獨立單元更有價值(例如,如果鏈接過時)。 – 2012-03-01 10:20:17

+2

好點。我將總結下班後描述的步驟。 – maka 2012-03-01 10:24:57

5

您可以使用ProtectedData加密Api密鑰,然後在運行時將其解密。這是很好的教程如何將數據在Windows Phone的加密:Encryption in Mango

+1

我試過了,但事實證明,您無法使用ProtectedData在一臺計算機中加密某些內容,並在另一臺計算機中對其進行解密。正如你可以看到以下內容:http://stackoverflow.com/questions/23124000/unable-to-decrypt-data-on-second-computer – Entrodus 2015-11-18 10:19:24

0

可能是你可以用手之前對它進行加密並將其保存在app.config中。在閱讀時使用相同的算法對其進行解密。

0

這不是可能的答案,但相信這是一個建議:

將加密密鑰存儲在數據庫中。並在app.config中存儲加密的「db密碼」。

  1. 使用兩個正確的字符串加密/解密算法,比如算法x和y。在app.config中
  2. 認沽加密的數據庫密碼,將其發佈之前。
  3. Decypt的app.config密碼(ALGO Y)來連接數據庫採取新encrpyted字符串(真實的)。
  4. 關閉連接,並與算法x如果反射器/等decyrpt新的字符串。沒有運行。
  5. 使用它。
  6. 處置保存字符串的對象。
+1

算法的選擇(這是通過反射暴露)沒有問題,但關鍵管理。例如,你不在步驟#3中說明密鑰存儲在哪裏。所以即使有人實施了你的建議,他們仍然會有OP的問題。你在哪裏存儲密鑰? – 2012-03-01 15:38:28

+0

將加密密鑰存儲在數據庫中。並在app.config中存儲加密的「db密碼」。無論如何,我更新了我的答案。 (如果開發人員在他的應用程序中使用硬編碼的自定義加密算法,然後對其進行混淆,則通過反射將其暴露出來是非常困難的。) – 2012-03-01 15:47:05

+0

@LostInLib:Conrad可能指的是解密app.config密碼所需的密鑰。 – Groo 2012-03-06 08:38:09

10

我已經通過所有這些答案看完了,我不覺得有什麼,你可以安全地嵌入此任何方式 - 無論你把它在哪裏,或者你是如何混淆它的。只要它在您的XAP中並在應用程序中解碼,那麼它將始終可供黑客入侵。

如果您需要在合理的保護範圍內運送xap中的密鑰,那麼我認爲@ maka的答案會產生最好的結果 - 儘可能地對其進行混淆 - 但不要認爲這會使您安全 - 即不要爲您的手機銀行應用程序做這個!

或者,如果您確實需要安全性,那麼請不要單獨在應用程序中運行 - 也請使用Web服務器。例如,如果您正在製作Facebook應用程序並需要以某種方式保護您的Facebook密鑰,則您需要將用戶從您的應用程序重定向到服務器上的網頁以進行身份​​驗證。然後,該網頁需要引導用戶完成獲取訪問令牌的過程 - 然後只需訪問令牌(以及公共appid)就需要返回到您的應用。對於那些需要知道祕密密鑰的網絡服務來陪伴每個電話,恐怕每一個電話都可能需要通過您的服務器。

相關問題