【问题标题】:Symmetric vs. Asymmetric encryption for encrypting images on Android用于在 Android 上加密图像的对称与非对称加密
【发布时间】:2016-05-05 07:50:11
【问题描述】:

我正在尝试创建一个动态加密数据并将其写入存储的 Android 应用程序。已经实现了没有加密的应用程序,在 stackoverflow 上检查了 100 多个加密示例/帖子,但无法决定使用哪种方法。

起初想到使用 AES,并进行了一些谷歌搜索以了解它的安全性。每次输入 16 或 32 个字符(我希望安全性更好)的密码似乎并不方便。作为替代方案,我想到了非对称加密。用一个密钥加密并用另一个解密,这样我就可以将用于加密的密钥留在内存中,仅在需要解密数据时使用另一个密钥(例如在 PC 上离线,或在另一个应用程序上)。

将被加密的文件将主要是图像、视频、录音、办公文件。

第二种方法会留下任何漏洞吗?如果我需要平衡速度和安全性,那么在 AES 和 RSA 之间,哪一个更好。数据不是绝密的东西,只是需要防止落入坏人之手。该设备未加密,运行 KitKat。这两种方法对某种攻击的抵抗力如何?

编辑:描述两种方法。

方法1:使用基于密码的AES加密,在应用程序启动时手动输入16/32个字符的密码,在某个时间/某些触发后从内存中清除密码。需要时再次输入密码。

方法 2:使用基于私钥/公钥的 RSA 加密。留下一把钥匙,用于在设备上加密的一把钥匙。在解密期间使用另一个密钥,这几乎不会执行。

【问题讨论】:

    标签: android encryption


    【解决方案1】:

    这个问题有点难以回答,因为您实际上没有描述任何方法,您只是命名了两种加密算法。如果实施正确,两种算法都可以满足您的需求。

    请务必记住,RSA 加密数据的长度不超过其密钥长度(减去一些用于填充的长度),因此在大多数情况下,仅 RSA 是不够的。

    如果您只是在单个设备上加密信息并希望用户控制何时加密和解密,例如使用密码,您可以使用 PBKDF2 导出一个长度为 x 的密钥(例如,对于 AES256,32 字节),并以密码字符串作为输入。

    如果您不打算利用 RSA 的不对称特性,请不要使用 RSA。在大多数情况下(但不是全部),如果不涉及服务器或其他方,则 RSA 是多余的。

    你没有过多描述你的问题,但如果是我,我会使用 AES。

    使用 AES 时,请牢记以下几点:

    • 从不使用 ECB 模式。
    • 从不使用纯 ASCII 字节作为键。您应该使用 PBKDF2 或类似方法来导出密钥,通常 100,000 轮是好的。
    • 始终使用安全的 RNG 来创建您的 IV(如果您的密码模式使用一个,有些,例如 CTR,使用 nonce 代替,但概念几乎相同)。
    • 始终记住,AES 确保完整性。在解密之前使用 MAC 检测密文的变化。

    【讨论】:

    • @Luke Park:谢谢你的回答。我使用 256 位密钥和 1000 轮的 PBKDF2WithHmacSHA1 实现了 AES/CBC/PKCS5Padding。 5 MB 文件只需不到 2 秒的时间。需要整理代码/逻辑/流程并进行精确测量。
    • @RaghavPete 很高兴你已经成功了。然而,对于 PBKDF2 来说,1000 轮已经远远不够了。这些天你应该至少在 100,000 左右。
    • @Luke Park :我计划进行 10,000 轮。需要查看额外回合需要多少额外时间。
    猜你喜欢
    • 2011-03-08
    • 2010-10-30
    • 1970-01-01
    • 2019-07-29
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2013-11-30
    相关资源
    最近更新 更多