2012-09-27 209 views
9

我的應用程序需要加密一些數據(用戶會話令牌)。我看到的大多數例子周圍有使用密碼和鹽一樣,生成密鑰的方法:我們在哪裏存儲密鑰/密碼/鹽進行加密?

public static Key generateKey(char[] passphrase, byte[] salt) { 
    ... 
} 

我的理解是,我們有生成密碼三個選項:

  1. 讓用戶每次應用程序啓動時輸入它(煩人的用戶)。
  2. 將密碼硬編碼到應用程序本身中。對用戶更方便,但有人可以找出你的密碼是給你的應用程序二進制文件。
  3. 隨機生成一個密碼,但我們必須將生成的密鑰存儲在磁盤上。現在我們只是將問題轉移到必須將密鑰安全地存儲在磁盤上,這似乎也是不可能的。如果攻擊者發現生成的密鑰,那麼大問題。

選項#1不適用於我。選項#2和#3似乎固有地有缺陷,除非我嚴重誤解如何去做這件事(希望我是)。如果我們無法參加#1,那麼建議如何做到這一點?我們是否爲一個攻擊者加入了一堆模糊的箍環,並希望獲得最好的結果?

感謝

回答

2

「難道我們把一堆模糊箍攻擊者最好通過跳躍和希望?」基本上是的。箍的大小和數量是你想要做到的難度。

如果您不使用服務器,那麼無論您如何對數據進行隱藏和加密都是可逆的。但是,你可以很難做到這一點。例如,我用來保護一些視頻資產的技術。

  1. 與來自應用程序圖像的資產之一的中間截取1024個字節代替第一1024個字節的報頭(它的MP4)的。我嘗試了幾個維修人員,所有這些維修人員都無法自動恢復文件 - 儘管可以手動完成。然後...

  2. 使用從另一個圖像資產取得的256字節的私鑰加密文件。

  3. 當密鑰被提取時,它通過一種算法進行散列,該算法執行各種其他非感性數學來破壞密鑰。

  4. 使用了一個預編譯的obsfucator。

我已經嘗試過自己去逆向工程,即使知道它是如何完成的,而且很難做出不值得的結果。

有許多關於SO的討論總結爲:如果你只是想停止複製,使其難以實現(成本vs獎勵),否則睡覺容易,因爲最終你什麼都做不了。如果數據在商業上是敏感的,那麼需要一個與系統級安全性(例如整個設備加密並且沒有根)相結合的服務器。

0

您將salt與加密數據一起存儲,它不是祕密信息。您可以在用戶輸入的內容或某種設備屬性上獲得密鑰:(散列)IMEI,MAC地址等

基本上,想想你是誰保護你的數據,爲什麼。由於用戶需要這些,所以嘗試保護它們並不是很重要。如果您將其存儲在私人文件中,則其他應用程序無法在無根電話上讀取它。如果你想保護它植根於手機,加密也許會有幫助,但只要關鍵在於應用,或根據設備上的東西被導出,它只是變得更難,甚至無法恢復。

的Android確實有一個全系統的密鑰存儲服務,但它沒有公開的API,並隨時可能更改。如果您願意承擔未來版本的應用程序風險,您可以使用它來保護您的密鑰。一些細節在這裏:http://nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.html