加密:使用初始化向量vs键?

Ind*_*ial 18 php security encryption cryptography mcrypt

我正在使用PHP的mcrypt库和 AES-256(rijndael)算法,它需要运行密钥+初始化向量.

我的逻辑思维并不是真的与此同时存在.不只是一个关键吗?

理论场景:
如果我将加密的敏感数据存储在数据库中,只有所有者应该能够解密,那么将用户哈希密码用于他或她的数据的密钥或初始化向量是否合适?

密钥应该被认为比初始化向量更私密还是反过来?

roo*_*ook 11

不,实际上IV在大多数实现中都是至关重要的.IV也被认为是安全的公共用途,例如IV用于WEP和WPA1/WPA2的纯文本传输.当使用相同的密钥+ iv加密相同的纯文本时出现问题.除非您使用IV,否则密文将是相同的.如果攻击者可以使用此密钥加密任意纯文本,然后查看密文.这是一种更快的方式,可以强制攻击者获得其他密文.

不仅如此,IV必须是随机的,否则你将违反CWE-329.这是一个问题的原因有点微妙,我起初并没有得到它.你没有提到这个,但我希望你使用的是CBC或CMAC模式

在密码上使用散列函数几乎与使用String2Key函数相同.只要攻击者无法使用SQL注入获取密钥,这是一个可靠的设计.


bla*_*aze 7

不要使用散列密码作为密钥和IV的单一来源.根据经验,您应该随机生成随机IV,更新加密数据并使用此数据存储IV.密钥可以多次重复使用,但也可以使用盐水哈希并将盐存储在数据中.

如果您只是哈希用户密码并将其用作加密密钥,则具有相同密码的用户将具有相同的密钥.根据您的数据库结构和入侵者访问权限,可能会出现一些不幸的情况,即可以检测到具有相同密码的用户.至少为此哈希添加唯一用户名.

如果不为每次数据更新更改IV,则可能会泄漏有关数据更改的信息.对于CBC或CFB模式,相同的第一个明文块将被加密为相同的密文直到第一个明文改变,因此可以确定该变化的位置.


dav*_*vka 6

初始化向量(IV)根本不是密钥,并不是秘密.实际上,它经常被暴露(例如,预先加密到加密数据).它被用作加密算法的附加随机输入,因此每次使用不同的IV时,加密相同清晰数据的结果都不同.这样,无法在加密数据上收集统计信息.它本身并没有"改善"加密强度.

您可以在这里查看显示如何以及为何使用IV的漂亮图表.