加密Android中的数据

时间:2013-02-04 09:50:15

标签: android encryption

我想在我的Android应用中加密数据。我对加密的当前状态没有什么经验,无论是针对Android还是一般情况。我记得几年前美国有法律禁止软件公司出口强大的加密技术。考虑到Android是开源代码,我不确定今天是否适用。

我想要完成的是允许用户仅使用密码加密数据。我更喜欢避免使用私钥/公钥,因为这可能需要用户输入这两个密钥。在我的应用程序中,用户应该能够使用密码加密/解密数据。他们的数据将从一个移动设备发送到另一个移动设备,如果不知道密码,就不可能在接收端解密他们的数据。我在发送数据时使用SSL,但这还不够好,因为数据需要在服务器中继到接收设备之前保持加密状态。如果黑客可以访问我的服务器,他们可能会读取数据。出于这个原因,我想在发送设备上加密它,只在接收设备上解密它。

我需要解决的一些问题:

  1. 是否有加密API让我只使用密码加密,但如果没有,那么我会考虑使用私钥/公钥。
  2. 我目前使用的加密算法有哪些,可以在国际上使用,还是美国对使用它们有一些限制?
  3. 我是否会更好地创建自己的自定义加密算法并不时修改它以防止黑客轻易破坏它?或者你会劝阻这个吗?如果是这样,为什么?如果我定期更改算法,我需要在数据中包含算法ID,以便解密代码识别它是否可以解密当前版本的算法。
  4. 我不是在寻找任何“非常难以打破”的算法,但这应该是足够的。存储的数据类型是图像,视频,音频和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位不一定适用于所有设备,可能是因为当地政府的法律。

1 个答案:

答案 0 :(得分:9)

  

是否有加密API可以让我只使用一个加密   密码,但如果没有,那么我会考虑使用私钥/公钥。

我编写了一个开源Java库,使用256位AES通过密码加密数据。你可以在GitHub上找到它:JNCryptor。这与iOS的RNCryptor项目兼容。

这可能适用于Android,或者至少可以看到代码如何工作并根据需要进行调整。 (如果你发现它没有按照你的意愿运行,请随意提出问题,我会调整库。)

  

我可以使用的当前加密算法是什么?   国际上可用或美国是否对使用有一些限制   它们?

有许多算法可供选择,但如果你坚持使用非常标准的东西,例如AES,你就会没事。

据我所知,美国仍然禁止导出使用256位AES密钥大小的软件。其他国家也可能存在其他限制。但我不是律师。

  

我最好创建自己的自定义加密算法和   不时修改它以防止黑客轻易破坏   它?或者你会劝阻这个?

不要这样做。始终使用已经过广泛同行评审的众所周知的算法。不应该经常更改您的算法选择,除非已知它被泄露。