加密:使用初始化向量与密钥?
Posted
技术标签:
【中文标题】加密:使用初始化向量与密钥?【英文标题】:Encryption: Use of initialization vector vs key? 【发布时间】:2011-07-03 18:38:24 【问题描述】:我正在使用 php 的 mcrypt
库和 AES-256
(rijndael) 算法,该算法需要密钥 + 初始化向量才能运行。
我的逻辑大脑并不真正同意这一点。 一把钥匙还不够吗?
理论场景: 如果我加密了存储在数据库中的敏感数据,只有所有者才能解密,那么将用户散列密码用于其数据的密钥或初始化向量是否合适?
是否应该认为密钥比初始化向量更私密,还是相反?
【问题讨论】:
【参考方案1】:不,事实上,IV 在大多数实现中都至关重要。 IV 也被认为对公众使用是安全的,例如 IV 以纯文本形式传输用于 WEP 和 WPA1/WPA2。当使用相同的密钥+iv 加密相同的纯文本时,就会出现问题。除非您使用 IV,否则密文将是相同的。如果攻击者可以用这个密钥加密任意明文,然后查看密文。这是暴力破解攻击者获得的其他密文的一种更快的方法。
不仅如此,IV 必须是随机的,否则您将违反CWE-329。这是一个问题的原因有点微妙和I didn't get it at first。你没有提到这一点,但我希望你使用CBC or CMAC modes
对密码使用散列函数几乎与使用 String2Key 函数相同。这是一个可靠的设计,只要攻击者不能使用 SQL 注入来获取密钥。
【讨论】:
嗨,鲁克。这对我来说都是新闻。非常感谢!如果我将CFC
与非随机IV 一起使用,我应该是安全的?
@Industrial 实际上它的CBC
模式,IV 必须是随机的。在数据库中,您可以有一个 iv 列并使用 mt_rand()
生成此数字。
@Rook 嗯。如果没有加密和解密之间一致的 IV,我无法解密我的加密字符串,所以那里真的没有随机性。也许我做错了什么,或者你是说 IV 总是应该完全随机的?
@Industrial 是的,IV 必须是随机的。您确实需要相同的密钥+ iv 进行加密和解密。可以这样想,IV 在使用之前修改密钥。如果您使用相同的键+iv,我怀疑您的代码中存在错误。
@Industrial well 那有点不同。理想情况下,您将拥有自己的文件类型,这并不复杂。例如,您可以将文件的前 X 位数作为您的 IV。查看您使用的分组密码并找到最大 IV 大小。【参考方案2】:
初始化向量 (IV) 根本不是密钥,也不是秘密。事实上,它经常被暴露(例如,添加到加密数据中)。它用作加密算法的附加随机输入,因此每次使用不同的 IV 时,加密相同的明文数据的结果都不同。这样,就无法收集加密数据的统计信息。它本身并不会“提高”加密强度。
您可以查看here 以获取显示如何以及为何使用 IV 的精美图表。
【讨论】:
【参考方案3】:不要将散列密码用作密钥和 IV 的单一来源。根据经验,您应该在每次更新加密数据并使用此数据存储 IV 时生成随机 IV。密钥可以重复使用多次,但也可以使用加盐哈希并将盐存储在数据中。
如果您只是对用户密码进行哈希处理并将其用作加密密钥,则具有相同密码的用户将拥有相同的密钥。根据您的数据库结构和入侵者访问权限,可能会检测到具有相同密码的用户。至少向此哈希添加唯一的用户名。
如果您不为每次数据更新更改 IV,则有关数据更改的信息可能会泄露。在 CBC 或 CFB 模式下,相同的第一个明文块将被加密为相同的密文,直到第一个明文发生变化,因此可以确定这个变化的位置。
【讨论】:
因此,您现在需要至少 3 个而不是数据库中的一个字段?加密值,IV 和 Salt ?我们甚至可以向它添加密钥,使其成为数据库中的 4 个字段(尽管我不会将密钥保存到数据库)。听起来工作量很大,可能没有必要? 为什么? Salt 和 IV 是固定长度的,只需将其添加到加密/散列数据之前,并在需要时分开。【参考方案4】:如果您使用分组密码或大多数流密码的 EBP 模式,不同明文上的相同密钥+IV 组合将使攻击者直接查看密钥的 XOR 结果。这通过扩展揭示了密钥本身,并在某种程度上揭示了密码。
但我的意思是说静脉注射绝对是必要的吗?不。只要您每次在下一个明文块(甚至是第二次相同的块)上都更改密码,没有 IV 就完全没问题。事实上,IV 所做的只是上述过程的自动化。
【讨论】:
什么是 EBP 模式?从来没有听说过那个,快速搜索也没有发现任何东西。 OFB 和 CTR 模式会泄漏密钥流,因为它们实际上是流密码。但是没有流行模式会泄露密钥本身。以上是关于加密:使用初始化向量与密钥?的主要内容,如果未能解决你的问题,请参考以下文章