java - 如何存储iv、salt和密文?

标签 java encryption hex byte

从这里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/

相关文章:

java - GCM Listener无法检索实际值

android - Android的 "Full Disc Encryption"和 "Storage Encryption"是一样的吗?

java - 如何在 Clojure 中直接使用位?

r - 将十六进制字符串值硬编码为 ggplot 中的颜色

c - 在 Linux 中通过串口通信发送十六进制数据

java - 在 java 中对语句使用或 "|"运算符

java - 为什么 Android 对话框标题不显示在 Android 版本的棉花糖上?

java - php加密脚本需要类似的java代码

Java 维吉尼亚密码

java - H2数据库错误信息本地化