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