2013-02-04 30 views
4

我想在我的Android應用程序中加密數據。對於目前的加密狀態,我幾乎沒有經驗,無論是專門針對Android還是通常針對Android。我記得幾年前,美國有法律阻止軟件公司出口強大的加密技術。如果考慮到Android是開源代碼,我不確定今天是否適用。在Android中加密數據

我想完成的是允許用戶只使用密碼來加密數據。我寧願避免使用私鑰/公鑰,因爲這可能需要用戶輸入這兩個密鑰。在我的應用程序中,用戶應該能夠使用密碼加密/解密數據。他們的數據將從一個移動設備發送到另一個移動設備,並且在不知道密碼的情況下應該不可能在接收端解密他們的數據。我在發送數據時使用SSL,但這並不夠好,因爲數據在傳送到接收設備之前需要在服務器上保持加密。如果黑客有權訪問我的服務器,他們可能會讀取數據。因此,我想在發送設備上對其進行加密,並僅在接收設備上對其進行解密。

有一些問題,我需要解決:

  1. 是否有一個加密API,可以讓我只加密使用一個密碼,但如果沒有,那麼我會考慮使用私有/公共密鑰。
  2. 目前我可以使用哪些加密算法,並且它們是否可以在國際上使用,或者美國是否對使用它們有一些限制?
  3. 爲了防止黑客輕易破壞它,我最好創建自己的自定義加密算法並對其進行修改嗎?或者你會勸阻這個?如果是這樣,爲什麼?如果我經常更改算法,則需要在數據中包含一個算法ID,以便解密代碼識別是否可以解密該算法的當前版本。

我不是在尋找任何「非常難打破」算法,但應該是足夠的東西。存儲的數據類型是圖像,視頻,音頻和GPS數據。如果解決方案適用於Android 2.2及更高版本,那將會很不錯。我不明白爲什麼任何算法都不適用於這些版本,因爲算法應該獨立於操作系統。儘管如此,也許Android的確只爲某些版本使用內置算法?

編輯:我現在用在我的應用程序的一些基本的內部加密

代碼看起來是這樣,但我懷疑它是足夠足夠了:

import java.security.SecureRandom; 
import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.SecretKeySpec; 

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
byte[] encrypted = cipher.doFinal(clear); 

原來,上面一行是:

SecureRandom.getInstance("SHA1PRNG") 

但谷歌在4.0中改變了這一點,這導致我的代碼打破。任何使用我以前的代碼加密的東西都不能再使用4.0的默認API解密。我個人發現這是Google的一個主要問題,因爲他們打破了兼容性。什麼是阻止他們在將來再次重複這一點?我的加密/解密不能依賴谷歌選擇打破兼容性。

我也被迫使用128位加密,因爲顯然支持192位和256位並不一定適用於所有設備,可能是因爲地方政府法律。

+0

我沒有看到這部分內容:「不知道密碼就不可能在接收端解密他們的數據」。攻擊者不能像接收端那樣做並恢復消息? – Henry

+0

當然,黑客可以。要麼黑客首先必須破解通過互聯網傳輸的數據,這意味着破解SSL和加密數據,或者他們必須破解我的服務器上的數據。如果他們無法通過Internet數據或訪問我的服務器,則他們必須有權訪問接收數據的移動設備。這很難獲得。沒有加密是100%安全的,但在我的服務器上留下未加密的數據並僅依賴於SSL將是一個嚴重的錯誤。基本上我想要雙重加密,以便解密數據非常困難。 – AndroidDev

+1

對不起,我忽略了那句話中的「不」,現在有道理。 – Henry

回答