在CBC模式下使用blowfish进行加密和解密,但如何继续进行IV?

时间:2015-01-27 07:24:52

标签: java encryption cryptography

我有一个用于添加/编辑密码的UI。这些密码在CBC模式下使用Blowfish加密,并且工作正常,但在解密过程中需要一个IV(它抛出一个参数缺少异常。)

我在启动密码时使用了密码类,因此在加密时会处理IV。

所以我怀疑是,

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

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

  3. 提前致谢。

1 个答案:

答案 0 :(得分:2)

  1. 是的,加密/解密的IV应该相同。在CBC中,如果我没记错的话,错误会在块中向下级联。因此,如果使用错误的IV,整个消息将是错误的。
  2. IV可以以明文形式存储。如果您尝试将其加密存储,则最终需要存储用于加密IV的IV ...
  3. 但是,以加密形式存储密码通常被认为是一种不好的做法。如果有人要检索您的数据库,他们只需要找到一个密钥来检索所有密码。

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

    在java中有这样的原语,请参阅the example on this page。 (搜索使用密码散列算法并向下滚动到java实现。)