Cryptography 使用带单块加密的常量IV
我有很多小秘密,我想在数据库中加密存储。数据库客户端将拥有密钥,而数据库服务器将不处理加密和解密。我所有的秘密都是16字节或更少,这意味着使用AES时只有一个块。我使用常量IV(和密钥)使加密具有确定性,我使用确定性加密的原因是能够使用密文轻松地查询数据库,并确保相同的机密不会存储两次(通过使列唯一)。就我所知,只要钥匙是保密的,这样做应该没有问题。但我想确定:我是对还是错?如果我错了,可以做什么攻击Cryptography 使用带单块加密的常量IV,cryptography,aes,initialization-vector,Cryptography,Aes,Initialization Vector,我有很多小秘密,我想在数据库中加密存储。数据库客户端将拥有密钥,而数据库服务器将不处理加密和解密。我所有的秘密都是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的足够接近的模拟 不过,请注意以下几点:
- 如果您将加密元素存储在数据库中,并且在应用程序的整个生命周期中都需要唯一性,那么您的密钥是长期存在的。长期保守秘密密钥可能是一个困难的问题。例如,长寿命的密钥需要某种存储(可以抵抗重新启动)。如何管理死机硬盘?你会在装满酸的大锅里销毁它们吗
- 加密确保机密性,而不是完整性。在大多数安全模型中,攻击者可能是活动的(即,如果攻击者可以读取数据库,他可能也可以写入数据库)。主动攻击会引发一系列问题:例如,如果攻击者在数据库中交换您的一些机密,会发生什么情况?或者随意改变一些?像往常一样,加密是容易的部分(并不是说它真的“容易”,而是比其他工作容易得多)