本文共 2081 字,大约阅读时间需要 6 分钟。
加密算法分类:
分组加密
将明文消息编码表示后的数字(简称明文数字)序列,划分成长度为n的组(可看成长度为n的矢量),每组分别在密钥的控制下变换成等长的输出数字(简称密文数字)序列 代表算法:DES、3-DES、Blowfish、IDEA、AES等流加密
明文数据每次与密钥数据流顺次对应加密,得到密文数据流 代表算法:RC4、ORYX、SEAL攻击者攻击方式:
广泛采用的authcode()流密码加密函数存在以下安全问题:
1.1 Reused Key Attack
使用同一密钥进行多次加密,此时攻击者不需要知道密钥,即可还原出明文。
原理:明文A和明文B,都利用密钥C进行异或加密:
E(A)=A XOR C E(B)=B XOR CE(A) XOR E(B)=A XOR C XOR B XOR C=A XOR B XOR (C XOR C)=A XOR B
而E(A)和E(B)很容易获得,如果知道A,即可得到B,而不需要知道密钥C。
2.2 Bit-flipping Attack
攻击者在不知道明文的情况下,通过改变密文,使得明文按其需要的方式发生改变的攻击方式,该种攻击方式称为Bit-flipping Attack
原理:A XOR E(A) XOR B=E(A) XOR E(A) XOR E(B)=E(B)
即知道明文A和明文B以及A的密文,就可以得到B的密文。例子:攻击者新建普通用户A,获取A的cookie即E(A)后,就有可能利用同样的算法获得管理员admin的cookie
解决办法:
在传递的消息中增加带有KEY的消息验证码,从而验证密文是否被篡改。弱随机IV问题:
authcode()函数中,默认使用4字节的初始化向量IV(密钥后增加的随机值,用来保证每次使用的密钥都不同)。4字节不够安全,会被使用暴力法破解。
WEP是一种常用的无线加密传输协议,破解了WEP的密钥,就可以连接到该Access Point。
破解原理:WEP加密采用24位的IV,但是仍然在数小时内可能出现重复的IV值,一旦IV重复,就有可能出现上述的Reused Key Attack。
具体流程可以参考:分组加密有多种加密模式(表征组间关系),例如:ECB、CBC、CFB、OFB、CTR等
ECB是其中最简单的一种模式:
最大的特点是组与组之间毫不相干:交换两个组的明文,对应的密文也会交换;其中一组的明文改变,只影响改组对应的密文。危害:攻击者可能替换某一组的密文,从而攻击成功
该攻击针对CBC模式(上一组的密文作为下一组加密的IV),它可以在不知道密钥的情况下,通过对padding byte的尝试,还原明文,或者构造任意明文的密文。
padding指的是在对明文进行分组时,如果最后一组长度不够指定值,需要添加一些字符,被称为padding。padding规则为:当需要补几位时,即全部添加数字几的ACS码对应的十六进制值。
攻击者在知道加密算法和加密模式后,可以通过遍历IV的值,然后观察最后一组解密后的明文是否满足padding规则从而判断IV值是否正确,而得到IV值,进一步解密得到前面组的明文。
加密算法破解难度太高,一般人也做不到,所以攻击者往往想办法获取密钥,因此密钥管理至关重要。
最常见错误为将密钥硬编码进代码中!
对于WEB应用,常见正确做法:将密钥保存在配置文件或数据库,在使用密钥时,由程序加载进内存,然后通过控制配置文件或数据库的访问权限来保证密钥安全。
PHP中microtime()函数,由微秒数和系统当前秒数合成,系统当前秒数便于获取,只需遍历微秒数,就可以暴力破解利用该函数生成的密码。
php4.2.0版本之前需要人为播种,之后系统自动播种,而种子一旦确定,生成的随机数就是确定的。
";echo rand()."";echo rand()."";echo rand()."";?>
seed值确定后,刷新页面,每次获得的随机数都不变!!
所以种子的随机及安全很重要。
获取第一个随机数后猜测种子的思路:遍历
Java:java.security.SecureRedom
Linux: int ran=open("/dev/random",O_RDONLY);或“/dev/urandom”目录 PHP:openssl_random_pseudo_byte()函数转载地址:http://jrzwi.baihongyu.com/