function aes128ctr_en($data,$key,$hmac = false) {
$key = ($hmac===false) ? hash('sha256',$key,true) : hash_hmac('sha256',$key,$hmac,true);
$data .= hash('md5',$data,true);
$iv = mcrypt_create_iv(16,MCRYPT_DEV_URANDOM);
return mcrypt_encrypt('rijndael-128',$key,$data,'ctr',$iv).$iv;
}
function aes128ctr_de($data,$key,$hmac = false) {
$key = ($hmac===false) ? hash('sha256',$key,true) : hash_hmac('sha256',$key,$hmac,true);
$iv = substr($data,-16);
$data = substr($data,0,strlen($data)-16);
$data = mcrypt_decrypt('rijndael-128',$key,$data,'ctr',$iv);
$md5 = substr($data,-16);
$data = substr($data,0,strlen($data)-16);
return (hash('md5',$data,true)===$md5) ? $data : false;
}
$encrypted = aes128ctr_en('secret text','password');
echo aes128ctr_de($encrypted,'password');
这些安全吗?
IV怎么办?可以将它添加到加密字符串的末尾吗?
通过模块,即使用
mcrypt_module_open
来进行所有这些操作,会更好/更快吗?#1 楼
为简单起见,假设您的数据D正好是一个块长。
然后密文包含3个16字节块,如下所示。
C0 || C1 || C2
= D xor AES(IV)|| MD5(D)x或AES(IV + 1)|| IV
(通常在消息之前添加IV,但这在此无关紧要)。
如果攻击者可以猜出D,则攻击者可以得出AES(IV)和AES(IV +1),然后
通过计算
D'xor AES(IV)||生成另一个有效的密文。 MD5(D')x或AES(IV + 1)|| IV
获取他喜欢的任何消息D'。
无键哈希不能提供您想要的完整性。通常,应该使用HMAC或类似的东西代替MD5。因此,协议中的最大弱点不是您使用的原语,而是您没有正确使用它们的事实。只是要回答这里提出的另一个问题:SO方面的人员远没有足够的能力来发现新协议中的每个缺陷。因此,您最好寻找现有的标准。
让我也补充一点,类似于此处的协议是在80年代提出的。例如,Kerberos也有类似的缺陷。更好的消息身份验证(例如HMAc)正是为防止这种密文操作而设计的。
#2 楼
可能会或可能不会成为问题的事情:您不会对密码加盐。如果您要为多个用户存储密码,并且多个用户使用相同的密码,则可以查看数据库并一目了然地确定哪些用户共享相同的密码。理想情况下,应避免这种情况。
您没有在使用按键增强。这使得暴力破解密码比暴力破解密钥本身更容易,这意味着您的大多数加密算法实际上比要求保护的弱。我建议为此使用bcrypt;我相信它已包含在php 5.3+中。
请注意,这些都不是必需的。您尚未定义使用加密的原因(即您希望安全使用的加密方法),因此无法完全回答您的问题。
评论
\ $ \ begingroup \ $
在php中被称为简单的“ crypt”:php.net/manual/en/function.crypt.php
\ $ \ endgroup \ $
–rsk82
2011年1月3日,21:34
\ $ \ begingroup \ $
@ user393087:我对bcrypt的主要观点是您当前的哈希可能运行得太快。
\ $ \ endgroup \ $
–布赖恩
2011年1月3日在22:26
\ $ \ begingroup \ $
他没有说是否存储密码,但是,如果他存储了密码,他甚至不应该加密它们,而只是对它们进行哈希处理。
\ $ \ endgroup \ $
–Chochos
2011年1月3日23:52
\ $ \ begingroup \ $
@Chochos:地穴就是这么做的。
\ $ \ endgroup \ $
–布赖恩
2011年1月4日,下午2:14
#3 楼
如果安全的意思是您没有偏离被认为是安全的标准化加密程序,那么是的,您是安全的。答案是否定的。如果有足够的时间和先进的计算能力或密码分析技术,最终将导致密码被破解。无需保留IV秘密,并且可以将其明确转让,所以是的,您可以将IV附加到密文中。
评论
您正在加密要放入数据库的内容吗?等待。有人建议您不要这样做,然后您继续前进,还是这样做了吗? -但是,它看起来确实很复杂,尽管我不确定再次包装mcrypt的意义是什么。如果是银行网站,请咨询顾问。
好吧,他没有设计自己的加密货币-他正在使用mcrypt_encrypt()。他正在做的只是包装起来以使其易于使用,并询问包装器是否导致安全性降低。我认为询问是否对IV,哈希和密钥创建进行了这种特殊处理而没有无意间打开漏洞是很合理的。
@mario:建议他不要自己创建加密算法。他没有这样做。他只是用了一个现有的。
有人建议我不要自己做加密算法,在这里我使用的是AES和CTR模式,我读过这种模式对某些攻击更为安全。