【问题标题】:Java encryption ivSpec random or not?Java加密ivSpec随机与否?
【发布时间】:2014-03-08 06:24:52
【问题描述】:

我正在尝试使用每个 HttpResponse 发送一个加密文本,当我得到下一个带有加密文本的 HttpRequest 时,我将它解密并用它做一些事情:)。

我对围绕密钥和 ivSpec(或随机数)的存储/检索的最佳实践感到好奇,但特别是根据@VoidPointer 在How to encrypt String in Java 中的建议查看@sherif 发布的代码,

a) 我们是否必须为要加密的每个字符串使用随机字节初始化 ivSpec?

b) 如果是这样,我们是否将生成的 ivSpec 存储在某个数据库中,并在我需要使用它进行解密时查找它?

c) 如果是这样,我们如何查找它?当需要解密加密字符串时,我们如何从 db 中选择正确的 ivSpec?

d) 一个建议是send ivParameter along with the encrypted string!本身(这可能是@sherif 's implementation 发生的事情!)。如果我们选择这样做,我如何修改@sherif提供的类来解密和分离iv参数和加密字符串,而不是在初始化解密密码时提供iv参数?

【问题讨论】:

    标签: java encryption


    【解决方案1】:

    A.如果不更改向量,则每次加密相同的字符串时,都会得到相同的加密结果。 通过每次更改 IV,您可以使每个单独的加密输出看起来都不同(即使它是相同的输入)。 将其视为您在对密码进行哈希处理时使用的“盐”。

    所以在正常情况下,最好使用随机静脉注射。

    B&C。你需要查一下IV,是的。但是将其存储到数据库中并不是很有用。您已经有一条秘密存储的信息:这就是密码。 IV只是在这里增加随机性,不需要保留,随输出一起推出。

    D.发送它是通常的方式。

    一种方法是在输出的开头连接它。 (输出 = IV + 加密数据)。然后在解密之前先拆分输入(IV = 32 个输入的第一个字节)并解密其余部分(crypt_data_to_decrpt = 字节数 32 之后的输入)

    另一种方法是在开头有一个常量 IV 和一个随机部分: 您只需使用一串 NUL 字节作为 IV。 然后你加密 32 字节的纯随机垃圾 然后你加密你的输入。 (当使用一个好的加密方法时,这应该总是产生不同的加密输出,因为开始是不同的)。 对于解密,您使用相同的空 IV,然后解密所有内容。您忽略开头的 32 字节。您拆分并仅获取 32 号之后的字节。这是你的解密输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      相关资源
      最近更新 更多