2013-02-04 31 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

回答