【问题标题】:Using blowfish in CBC mode for encryption and decryption but how to proceed with the IV?在 CBC 模式下使用河豚进行加密和解密,但如何进行 IV?
【发布时间】:2015-01-27 07:24:51
【问题描述】:

我有一个 UI 来添加/编辑密码。这些密码是在 CBC 模式下使用 Blowfish 加密的,它工作正常,但在解密期间它需要一个 IV(它抛出一个参数丢失异常。)

我在初始化密码时使用了密码类,所以这会在加密时处理 IV。

所以我的疑问是,

  1. 加密和解密的 IV 是否应该相同?我在一些页面上读到,如果我们使用不正确的 IV 进行解密,第一个块将是不正确的,但其余块将是正确的。你能解释一下吗?

  2. 如果保存 IV(在使用相同 IV 加密和解密的情况下)应该将其保存为普通对象还是使用某些分隔符与密码一起加密?哪个更安全?

提前致谢。

【问题讨论】:

    标签: java encryption cryptography


    【解决方案1】:
    1. 是的,加密/解密的 IV 应该相同。在 CBC 中,如果我没记错的话,错误会沿着块级联。因此,如果您使用错误的 IV,则整个信息都是错误的。
    2. IV 可以明文形式存储。如果您尝试将其加密存储,您最终需要存储用于加密 IV 的 IV...

    但是,以加密形式存储密码通常被认为是一种不好的做法。如果有人要检索您的数据库,他们只需要找到一个密钥即可检索所有密码。

    推荐的存储密码的方法是多次使用散列函数,也称为 PBKDF(基于密码的密钥派生函数),基于普通散列或 hmac 函数。请参阅OWASP password storage cheatsheet

    在 java 中有用于此的原语,请参阅 the example on this page。 (搜索 Use a Password Hashing Algorithm 并向下滚动到 java 实现。)

    【讨论】:

    • 错误不会传播,因为前面的密文在加密前与明文异或,并且您拥有完整的密文。只有第一个块会被破坏。
    • 没问题。我一直记得这一点,因为如果没有这个特殊属性,你就无法实现 CBC 位翻转攻击。
    猜你喜欢
    • 2013-11-28
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多