【问题标题】:sharing & storing IV for AES Encryption/decryption为 AES 加密/解密共享和存储 IV
【发布时间】:2012-12-11 11:19:08
【问题描述】:

我目前在一个安卓应用上使用 AES-ECB 加密用户密码,但我必须将此应用的数据库连接到一个网站,用户可以在该网站上以与移动应用相同的方式注册和登录。

我读到 ECB 模式不安全,所以我想通过生成 IV 来使用 CBC。

将 IV 作为常量存储在代码中是否安全(我也以这种方式存储密钥),无论是在服务器端的 php 中还是在应用程序中?

如果没有,网站和移动应用程序有没有办法共享它的 IV 来加密/解密用户密码?

或者,我可能选择了错误的加密算法,可能有一个更适合我的需要

【问题讨论】:

    标签: php android encryption aes


    【解决方案1】:

    最佳做法是为每个加密创建一个新的随机 IV。 IV 基本上是第一个块中使用的加密调用的种子。

    每个 IV 都可以与密文一起以明文形式安全地存储,以便在解密密文时可用(用于加密的 IV 必须与用于解密的 IV 相同)。

    【讨论】:

    • 但是这种方式登录时,用户密码必须明文存储在服务器上,以便服务器可以使用秘钥和iv解密hash,然后与明文进行比较数据库中的密码。由于 IV 的变化,不可能只比较哈希值
    • 如果我知道您有一个移动应用程序,我可以使用一些凭据登录,还有一个网站,我应该能够使用相同的凭据登录?我需要能够以离线模式登录移动应用程序吗?
    • 没错,但由于我不想在服务器的数据库上存储清晰的密码,我可能使用了错误的算法,我应该用加盐的 MD5 加密密码,然后用 RSA 加密在应用程序中使用硬编码的公钥
    • 推荐的从密码导出哈希的方法是使用密钥导出函数,例如 PBKF2、bcrypt 或 scrypt。
    • 对于密码,绝对使用 KDF 的@owlstead 推荐之一。加密 MD5 哈希的场景为您的用户提供的功能远不如使用适当调整的强哈希函数(如 PBKDF2)。攻击者只需要恢复密钥并破解打开的 Hashcat 即可破坏您的 md5 哈希。那是因为 MD5 被设计为快速而 KDF 被设计为缓慢。如果您需要传输安全性,请使用 SSL。
    【解决方案2】:

    如果你对这个算法很满意,我可能会建议 - 不要分享 IV 从加密端到解密端。

    虚拟块 在 16 字节的实际消息块之前添加一个 16 字节的初始虚拟块。这样,即使您不将 IV 共享给解密端,由于 AES-CBC 是一种链接模式,解密端的第一个块(虚拟块)将被破坏,其余块不受影响。

    加密结束 根据 AES 中的 CBC 模式,在 CBC 模式下,每个明文块在加密之前与前一个密文块进行异或。 为了使每条消息唯一,必须在第一个块中使用初始化向量。 参考:http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Block_Chaining_.28CBC.29

    解密结束 使用不正确的 IV 解密会导致第一个明文块损坏,但随后的明文块将是正确的。 这是因为一个明文块可以从两个相邻的密文块中恢复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2012-02-21
      • 1970-01-01
      • 2011-01-03
      相关资源
      最近更新 更多