AES 256 Encryption/Decryption 无 IV
AES 256 Encryption/Decryption without IV
我正在开发一个与位于 VPS 上的数据库通信的应用程序。
我需要在我的数据库中存储使用 AES-256 加密的信息。
如果我是正确的,当我加密时,会生成一个 IV 参数,并且每次加密都不同。但是当我解密时,我没有这个参数,因为我在数据库中只有密钥和加密文本。
我该怎么做才能解决这个问题?
您可以将 IV 与密文连接起来(其长度已知且恒定),或者您可以将它们并排存储在数据库中。静脉注射不是秘密;它只是确保块密码在每次加密时都以不同的方式初始化,以便暴力破解一个文件不会损害所有其他文件。
您必须将初始化向量存储在某处。因为,从概念上讲,在 CBC 模式中,IV 是密文的 "zeroth" 块,所以有些人将它存储为密文的前缀。然而,大多数低级解密库并不期望这一点,因此应用程序通常需要提供一个包装器来处理在加密后添加此前缀并在解密前删除它。
理想情况下,您应该使用一些元数据存储加密值,这些元数据指定所使用的加密算法、所需的任何参数,并指示使用的密钥(注意以下!)。这将包括使用 CBC 的块密码的 IV。一个标准格式是加密消息语法,或 PKCS #7。因为它是一个标准,所以您可能有几个开源库来处理格式的选项。
通过包含此元数据,您可以执行一些操作,例如随时间轮换密钥,或将数据迁移到新算法。您不必使用相同的密钥以相同的方式对每个值进行加密。
注意:当我说元数据指示使用的密钥时,这当然并不意味着包括密钥本身!对于预共享密钥,它只是一个标签,告诉您大密钥环上的哪个密钥将解密有效负载。对于基于密码的加密,将提供有关如何从隐含密码派生正确密钥的信息。
我正在开发一个与位于 VPS 上的数据库通信的应用程序。 我需要在我的数据库中存储使用 AES-256 加密的信息。
如果我是正确的,当我加密时,会生成一个 IV 参数,并且每次加密都不同。但是当我解密时,我没有这个参数,因为我在数据库中只有密钥和加密文本。
我该怎么做才能解决这个问题?
您可以将 IV 与密文连接起来(其长度已知且恒定),或者您可以将它们并排存储在数据库中。静脉注射不是秘密;它只是确保块密码在每次加密时都以不同的方式初始化,以便暴力破解一个文件不会损害所有其他文件。
您必须将初始化向量存储在某处。因为,从概念上讲,在 CBC 模式中,IV 是密文的 "zeroth" 块,所以有些人将它存储为密文的前缀。然而,大多数低级解密库并不期望这一点,因此应用程序通常需要提供一个包装器来处理在加密后添加此前缀并在解密前删除它。
理想情况下,您应该使用一些元数据存储加密值,这些元数据指定所使用的加密算法、所需的任何参数,并指示使用的密钥(注意以下!)。这将包括使用 CBC 的块密码的 IV。一个标准格式是加密消息语法,或 PKCS #7。因为它是一个标准,所以您可能有几个开源库来处理格式的选项。
通过包含此元数据,您可以执行一些操作,例如随时间轮换密钥,或将数据迁移到新算法。您不必使用相同的密钥以相同的方式对每个值进行加密。
注意:当我说元数据指示使用的密钥时,这当然并不意味着包括密钥本身!对于预共享密钥,它只是一个标签,告诉您大密钥环上的哪个密钥将解密有效负载。对于基于密码的加密,将提供有关如何从隐含密码派生正确密钥的信息。