在Android中加密数据

在Android中加密数据,android,encryption,Android,Encryption,我想在我的Android应用程序中加密数据。我对加密的当前状态几乎没有经验,无论是针对Android还是一般情况。我记得几年前,美国有法律禁止软件公司出口强大的加密技术。考虑到Android是开源代码,我不确定这些是否适用于今天 我想实现的是允许用户仅使用密码加密数据。我宁愿避免使用私钥/公钥,因为这可能需要用户输入这两个密钥。在我的应用程序中,用户应该能够使用密码加密/解密数据。他们的数据将从一个移动设备发送到另一个移动设备,在不知道密码的情况下,不可能在接收端解密他们的数据。我确实在发送数据

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

我想实现的是允许用户仅使用密码加密数据。我宁愿避免使用私钥/公钥,因为这可能需要用户输入这两个密钥。在我的应用程序中,用户应该能够使用密码加密/解密数据。他们的数据将从一个移动设备发送到另一个移动设备,在不知道密码的情况下,不可能在接收端解密他们的数据。我确实在发送数据时使用SSL,但这还不够好,因为数据需要在服务器上保持加密,然后才能中继到接收设备。如果黑客能够访问我的服务器,他们就有可能读取数据。出于这个原因,我想在发送设备上加密它,而只在接收设备上解密它

我需要解决的一些问题:

  • 是否有一个加密API,允许我用密码加密,但如果不是,那么我将考虑使用私有/公钥。
  • 我可以使用的当前加密算法是什么?它们是否在国际上可用?或者美国是否对使用它们施加了一些限制
  • 我是否最好创建自己的自定义加密算法,并不时对其进行修改,以防止黑客轻易破坏它?或者你会阻止这样做吗?若然,原因为何?如果我定期更改算法,我需要在数据中包含一个算法ID,以便解密代码识别它是否可以解密当前版本的算法
  • 我不是在寻找任何“极难破解”的算法,而是应该足够的算法。存储的数据类型包括图像、视频、音频和GPS数据。如果该解决方案能在安卓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进行解密。我个人认为这是谷歌的一个主要问题,因为他们破坏了兼容性。怎样才能阻止他们今后再次重复这一点?我的加密/解密不能依赖于谷歌选择破坏兼容性

    我还被迫使用128位加密,因为显然并非所有设备都支持192位和256位,很可能是因为当地政府的法律

    是否有一个加密API可以让我只使用 密码,但如果不是,那么我将考虑使用私有/公钥。< /P> 我编写了一个开源Java库,它使用256位AES使用密码加密数据。您可以在GitHub上找到此文件:。这与iOS项目兼容

    这可能适用于Android,或者至少您可以看到代码的工作方式,并根据需要进行调整。(如果您发现它不能按您的意愿工作,请随时提出问题,我将调整库)

    我可以使用的当前加密算法是什么?它们是什么 在国际上可用,还是美国对其使用有限制 他们

    有无数的算法可用,但是如果你坚持一些非常标准的东西,比如AES,你会很好

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

    创建自己的自定义加密算法和 不时对其进行修改,以防止黑客轻易破解 信息技术或者你会阻止这样做吗


    不要这样做。始终使用经过广泛同行审查的著名算法。应该没有必要定期更改您选择的算法,除非已知它已被破坏。

    我不明白这一部分:“在不知道密码的情况下,不可能在接收端解密他们的数据”。攻击者不能像接收端那样恢复消息吗?当然,黑客可以。要么黑客首先必须破解通过互联网传输的数据,这意味着同时破解SSL和加密数据,要么他们必须破解我服务器上的数据。如果他们无法通过互联网数据或访问我的服务器,那么他们必须访问接收数据的移动设备。这要难得多。没有加密是100%安全的,但是在我的服务器上留下未加密的数据并且只依赖SSL将是一个严重的错误。基本上,我想要双重加密,以使数据解密变得非常困难。对不起,我忽略了那句话中的“不是”,现在才有意义。如果Java是任何指标,那么限制仅适用于几个司法管辖区(例如“恐怖国家”)。AES 256的使用当然不是被禁止的,而且这些限制仅限于从美国出口。AES-192和AES-256具有这些限制。当然,这些限制完全是卡夫卡式的。就我们所知,AES1-28是无法被打破的,我们可以放心,那些“邪恶”的司法管辖区一点也不在乎。注意:我不是律师,这不是法律建议。@owlstead好的评论,我已经调整了我关于美国出口管制的措辞。