从这里on how to achieve password based encryption很明显,我需要保存盐、IV 和密文以便稍后解密。
从这里iv and salt can be stored along with cipher text
我以这种格式存储十六进制值
DatatypeConverter.printHexBinary(salt) + DatatypeConverter.printHexBinary(iv) + DatatypeConverter.printHexBinary(ciphertext);
我需要以二进制格式存储值吗?
DatatypeConverter.printBase64Binary(salt) + DatatypeConverter.printBase64Binary(iv) + DatatypeConverter.printBase64Binary(ciphertext));
输出清楚地表明 salt 和 iv 结束的位置,这很糟糕
lIvyAA/PZg4=fE4gTZUCPTrKQpUKo+Z1SA==4/gAdiOqyPOAzXR69i0wlC7YFn9/KOGitZqpOW2y3ms=
以十六进制格式存储会不会有数据丢失的影响?
IV 的长度是常数吗?在我的例子中,它总是 32 个字符(十六进制) 或者我什至还需要存储 IV 的长度?因为盐长度最初固定为 8 位(16 个十六进制字符)
(我使用 PBKDF2WithHmacSHA1 算法生成 key ,使用 AES/CBC/PKCS5Padding 算法生成密码)
最佳答案
我认为有必要再次强调一下上面提到的公认答案。
也就是说,没有必要也没有必要试图隐藏盐或静脉注入(inject)液。您的密码术的安全性完全取决于 key 的保密性,并且仅取决于 key 的保密性。 IV 和盐可以与密文一起以明文形式分发,只要 key 保持 secret ,密文就保持安全。
理解并接受这一点很重要,否则您将绕过轴试图混淆无关紧要的事物。默默无闻是没有安全感的。
然而,重要的是要注意,salt 应该在加密强度高的伪随机数生成器中生成。应该为每个正在加密的新纯文本生成一个新的盐。同样,应该为每个新密文随机生成 IV。
这些参数需要独立且不可预测,但不必保密。
因此您可以将它们存储在单独的字段中或将它们分隔在单个字段中,或者对三个字段中的前两个字段使用固定长度。不过,为了获得最大的灵 active 和 future 验证,我建议使用分隔字段,并包括处理数据所需的所有参数。如果您使用 PBE,我也会包括算法名称和迭代次数,而不是依赖默认值。
关于java - 如何存储iv、salt和密文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283123/