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