我正在尝试创建一个 Android 应用程序,它可以即时加密数据并将其写入存储。已经在没有加密的情况下实现了该应用程序,在 stackoverflow 上检查了 100 多个加密示例/帖子,但无法决定使用哪种方法。
起初想到使用 AES 并进行了一些谷歌搜索以了解它的安全性。每次输入 16 或 32 个字符(我希望安全性更高)的密码似乎并不方便。作为替代方案,我想到了非对称加密。用一个 key 加密并用另一个 key 解密,这样我就可以将用于加密的 key 留在内存中,只有在数据需要解密时才使用另一个 key (比如在 PC 上离线,或在另一个应用程序上)。
将被加密的文件主要是图像、视频、录音、办公文档。
第二种方法是否会留下任何漏洞?如果我需要平衡速度和安全性,那么在 AES 和 RSA 之间哪个更好。数据不是绝密,只是需要防止落入坏人之手。设备未加密,运行 KitKat。这两种方法抵御某种攻击的能力如何?
编辑:描述两种方法。
方法 1:使用基于密码的 AES 加密,在应用程序启动时手动输入 16/32 字符的密码,在某些时间/某些触发后从内存中清除密码。需要时再次输入密码。
方法 2:使用基于私钥/公钥的 RSA 加密。留下一把 key ,那把用于在设备上加密。在几乎不执行的解密过程中使用另一个 key 。
最佳答案
这个问题有点难回答,因为你实际上没有描述任何方法,你只是命名了两种加密算法。如果正确实现,这两种算法都非常安全,可以满足您的需求。
请务必记住,RSA 加密数据的长度不能超过其 key 长度(减去一些用于填充的长度),因此在大多数情况下,仅使用 RSA 是不够的。
如果您只是在单个设备上加密信息并希望用户控制何时加密和解密,例如使用密码,您可以使用 PBKDF2 以密码字符串作为输入派生出 x 长度的 key (例如,对于 AES256,32 字节)。
如果您不打算利用 RSA 的非对称属性,就不要费心使用 RSA。在大多数情况下(但不是全部),如果不涉及服务器或其他方,RSA 是多余的。
您没有过多描述您的问题,但如果是我,我会使用 AES。
使用 AES 时,请牢记以下几点:
- 永远不要使用 ECB 模式。
- 从不使用纯 ASCII 字节作为 key 。您应该使用 PBKDF2 或类似工具来派生 key ,通常 100,000 轮就可以了。
- 始终使用安全的 RNG 来创建您的 IV(如果您的密码模式使用一个,有些,例如 CTR,则使用 nonce,但概念几乎相同)。
- 始终记住 AES 不确保完整性。在解密之前使用 MAC 检测密文的变化。
关于android - 在 Android 上加密图像的对称加密与非对称加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37045287/