Cryptography 使用带单块加密的常量IV

Cryptography 使用带单块加密的常量IV,cryptography,aes,initialization-vector,Cryptography,Aes,Initialization Vector,我有很多小秘密,我想在数据库中加密存储。数据库客户端将拥有密钥,而数据库服务器将不处理加密和解密。我所有的秘密都是16字节或更少,这意味着使用AES时只有一个块。我使用常量IV(和密钥)使加密具有确定性,我使用确定性加密的原因是能够使用密文轻松地查询数据库,并确保相同的机密不会存储两次(通过使列唯一)。就我所知,只要钥匙是保密的,这样做应该没有问题。但我想确定:我是对还是错?如果我错了,可以做什么攻击 顺便说一句:散列在这里是非常无用的,因为可能的明文数量相对较少。使用散列,获取原始纯文本将非常

我有很多小秘密,我想在数据库中加密存储。数据库客户端将拥有密钥,而数据库服务器将不处理加密和解密。我所有的秘密都是16字节或更少,这意味着使用AES时只有一个块。我使用常量IV(和密钥)使加密具有确定性,我使用确定性加密的原因是能够使用密文轻松地查询数据库,并确保相同的机密不会存储两次(通过使列唯一)。就我所知,只要钥匙是保密的,这样做应该没有问题。但我想确定:我是对还是错?如果我错了,可以做什么攻击


顺便说一句:散列在这里是非常无用的,因为可能的明文数量相对较少。使用散列,获取原始纯文本将非常简单。

如果程序集是公开的,或者可以公开,则可以通过使用Reflector公开使用它的源代码来发现密钥和IV。如果数据真的是秘密的,这将是主要的问题。有可能混淆MSIL,但这只会使其更难跟踪;它仍然必须是计算机消费品,所以你不能真正加密它。

对于长度为n位的消息,理想的密码是n位的2n序列的排列,在2n中随机选择!这样的排列。“键”是对所选排列的描述

安全分组密码被认为与理想密码无法区分,其中n是块大小。对于AES,n=128(即16字节)。AES被认为是一种安全的分组密码

如果您所有的秘密长度正好为16字节(或者小于16字节,使用一些填充约定将其明确扩展到16字节),那么理想的密码就是您想要的密码,AES“本身”就可以了。对于想要应用填充和处理任意长流的普通AES实现,您可以通过请求ECB模式或带有全零IV的CBC模式来获得单块加密

关于IV的所有问题,以及为什么首先需要CBC等链接模式,都来自多块消息。AES加密16字节的消息(不多也不少):链接模式是对较长消息模拟理想的密码。如果在您的应用程序中,所有消息的长度正好为16字节(或者更短,但您添加了填充),那么您只需要“原始”AES;而固定IV是对原始AES的足够接近的模拟

不过,请注意以下几点:

  • 如果您将加密元素存储在数据库中,并且在应用程序的整个生命周期中都需要唯一性,那么您的密钥是长期存在的。长期保守秘密密钥可能是一个困难的问题。例如,长寿命的密钥需要某种存储(可以抵抗重新启动)。如何管理死机硬盘?你会在装满酸的大锅里销毁它们吗

  • 加密确保机密性,而不是完整性。在大多数安全模型中,攻击者可能是活动的(即,如果攻击者可以读取数据库,他可能也可以写入数据库)。主动攻击会引发一系列问题:例如,如果攻击者在数据库中交换您的一些机密,会发生什么情况?或者随意改变一些?像往常一样,加密是容易的部分(并不是说它真的“容易”,而是比其他工作容易得多)


静态IV会使您的实现容易受到频率攻击。请参见

该组件不公开。我这里的主要问题是使用常量IV是否安全。如果有人访问整个数据库,破解加密是否比每行使用唯一(随机)IV更容易?它与使用随机IV的任何方法都不安全,唯一的例外是,如果他们知道一个,他们就知道所有。您(和任何攻击者)必须知道两个秘密——密钥和IV——才能解密使用相同密钥加密的AES密文。如果使用常量IV,则可以使用与隐藏密钥相同的方式隐藏它。如果您使用随机IV,您必须以某种方式将IV包含在密文中,以便可以使用它来解密该消息;这意味着这两个秘密成为关键,以及如何在密文中包含IV。第二个秘密现在不那么难发现了。好吧,那就如我所想。谢谢你的回答!:-)@尝试静脉注射是无关紧要的-只有一个区块和一个固定的钥匙,你可以像托马斯建议的那样使用ECB,完全跳过静脉注射。谢谢你的回答,这正是我想知道的!我没有资格投票支持你,我希望其他人也有。:-)