我想在我的 Android 应用程序中加密数据。我对当前的加密状态几乎没有经验,无论是针对 Android 还是一般而言。我记得几年前,美国有法律禁止软件公司出口强加密技术。考虑到 Android 是开源代码,我不确定今天是否适用。
我想要完成的是允许用户仅使用密码来加密数据。我更喜欢避免使用私钥/公钥,因为这可能需要用户输入这两个密钥。在我的应用程序中,用户应该能够使用密码加密/解密数据。他们的数据将从一台移动设备发送到另一台移动设备,在不知道密码的情况下,不可能在接收端解密他们的数据。我在发送数据时确实使用了 SSL,但这还不够好,因为数据需要在服务器上保持加密状态,然后才能中继到接收设备。如果黑客可以访问我的服务器,他们可能会读取数据。出于这个原因,我想在发送设备上加密它,只在接收设备上解密。
我需要解决的一些问题:
- 是否有一个加密 API 可以让我只使用密码进行加密,但如果没有,那么我会考虑使用私钥/公钥。
- 我可以使用的当前加密算法有哪些?它们在国际上是否可用,或者美国是否对使用它们有一些限制?
- 我会不会更好地创建自己的自定义加密算法并不时修改它以防止黑客轻易破解它?或者你会劝阻吗?如果是这样,为什么?如果我定期更改算法,我需要在数据中包含一个算法 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 位,这可能是由于当地政府的法律。