使用具有单块加密的常数IV

我有很多小秘密,我想在数据库中加密存储。数据库客户端将具有密钥,并且数据库服务器将不处理加密和解密。我的所有秘密都是16字节或更少,这意味着使用AES时只有一个块。我使用常量IV(和密钥)使加密确定性,我做确定性加密的原因是能够使用密文轻松查询数据库,并确保相同的秘密不会存储两次(通过使列UNIQUE )。只要密钥是秘密的,我可以看到这样做应该没有问题。但我想确定:我是对还是错?如果我错了,可以做些什么攻击? BTW:哈希在这里很无用,因为可能的明文数量相对较少。使用哈希,获得原始明文是微不足道的。     
已邀请:
对于长度为n位的消息,理想的密码是nn的2n个序列的置换,在2n中随机选择!这样的排列。 “关键”是选择排列的描述。 安全块密码应该与理想密码无法区分,n是块大小。对于AES,n = 128(即16字节)。 AES应该是一个安全的分组密码。 如果你所有的秘密长度恰好是16个字节(或者少于16个字节,并且有一些填充约定明确地将它们扩展到16个字节),那么理想的密码就是你想要的,并且AES“as own”应该没问题。对于想要应用填充和处理任意长流的常见AES实现,您可以通过要求ECB模式或具有全零IV的CBC模式来获得单块加密。 关于IV的所有问题,以及为什么首先需要CBC等链接模式的问题来自多块消息。 AES加密16字节消息(不多也不少):链接模式是关于模拟更长消息的理想密码。如果在您的应用程序中,所有消息的长度恰好为16个字节(或者更短,但是您添加了填充),那么您只需要“原始”AES;固定的IV是原始AES的足够接近的仿真。 但请注意以下内容: 如果要将加密元素存储在数据库中,并且在应用程序的整个生命周期内需要唯一性,那么您的密钥就是长期存在的。长时间保密密钥可能是一个难题。例如,长期存在的密钥需要某种存储(拒绝重新启动)。你如何管理死硬盘?你在一个充满酸的大锅里摧毁它们吗? 加密可确保机密性,而非完整性。在大多数安全模型中,攻击者可以是活动的(即,如果攻击者可以读取数据库,他也可以写入数据库)。主动攻击会打开一大堆问题:例如,如果攻击者在数据库中交换了一些秘密,会发生什么?或者随机改变一些?加密一如既往地是容易的部分(不是说它真的很“简单”,但它比其他工作容易得多)。     
如果程序集是公开的,或者可以成为程序集,则可以使用Reflector公开使用它的源代码来发现密钥和IV。如果数据确实是秘密的,那将是这个问题的主要问题。有可能对MSIL进行模糊处理,但这只会使跟踪变得更难;它仍然必须是计算机消耗品,因此您无法真正加密它。     
静态IV会使您的实施容易受到频率攻击。请参阅AES CBC加密,了解IV的重要性?     

要回复问题请先登录注册