加密算法与随机数

1.1 概述:
	常见的加密算法分为分组加密算法和流加密算法两种,两者的实现原理不同。
	1)分组加密算法基于分组(block)进行操作,根据算法的不同,每个分组的长度可能不同。分组加密算法的代表有DES 3-DES Blowfish IDEA  AES 等。
	2)流加密算法则每次只处理一个字节,秘钥独立于消息之外,连个通过异或实现加密与解密,流加密算法的代表有RC4 ORYX SEAL等。
	
	针对加密算法的攻击,一般根据攻击者能获得的信息,可以分为:
		1)唯密文攻击 (攻击者有一些密文,他们是使用同意加密算法和同一秘钥加密的,此类攻击最难)
		2)已知明文攻击 (攻击者除了能得到一些密文外,还能得到这些密文对应的明文)
		3)选择明文攻击 (攻击者不仅能得到一些密文和明文,还能选择用于机密的明文)
		4)选择密文攻击 (攻击者可以选择不同的密文来解密)

1.2 Steram Cipher Attack

	1.Reused Key Attack  在流密码的使用中,最常见的错误便是使用同一个秘钥进行多次加解密。这将使得破解密码变得非常简单,这种攻击被称为“Reused Key Attack”,在这种攻击下,攻击者不需要知道秘钥即可还原出明文。
		XOR异或运算:A=B   A XOR B = 0   A!=B   A XOR B = 1 
	
	2.Bit-flipping Attack  在密码学中,攻击者在不知道明文的情况下,通过改变密文,使得明文按其需要的方式发生改变的攻击方式,被称为“Bit-flipping Attack”
		解决Bit-flipping 攻击的方法是验证密文的完整性,最常见的方法是增加带有KEY 的MAC(消息验证码 Message Authentication Code),通过MAC验证密文是否被篡改。  
		通过哈希算法来实现MAC,被称为HMAC,由于HMAC的性能较好,所以被广泛应用。
	
	3.若随机的问题 在authcode函数中,它默认使用了4字节的IV,就是函数中的keyc ,使得破解难度增加,但其实4字节的IV 是很脆弱的,它不够随机,我们可以通过暴力破解的方式找到重复的IV。

1.3 WEP破解
	流加密算法存在Reused Key Attack和Bit-flipping Attack 等攻击方式,而在现实中,一种最著名的针对流密码的攻击可能是WEP秘钥的破解。WEP是一种常用的无线加密传输协议,破解了WEP的秘钥,就可以以此秘钥连接无线的Access Point,WEP采用RC4算法,也存在这两种攻击方式。
	WEP在加密过程,有两个关键因素,一个是初始化向量IV(秘钥),一个是对消息的CRC-32校验。

1.4 ECB模式的缺陷
	对分组密码来说,除去算法本身,还有一些通用的加密模式,不同的加密算法会支持同样的几种加密模式。常见的加密模式有:ECB 、CBC、CFB 、OFB 、OFB 、CTR 。ECB 模式(电话簿模式)是最简单的一种加密模式,它的每个分组之间相对独立。但ECB模式最大的问题也是出在这种分组的独立性上:攻击者只需要对调任意分组的密文,经过解密后,所得的明文的顺序也是经过对调的。
	这与链式加密模式(CRC)是完全不同的,链式加密模式的分组前后之间会相互关联,一个字节的变化,会导致整个密码文发生变化。
	对于ECB模式来说,改变分组密文的顺序,将改变解密后的明文的顺序,替换某个分组密文,解密后对应分组的明文也会被替换,而其他分组不受影响。
	当需要加密的明文多于一个分组的长度时,应该避免使用ECB模式,而使用其他更加安全的加密模式。
	
1.5 Padding Orcale Attack 
	它可以在不知道秘钥的情况下,对padding bytes 进行尝试,还原明文,或者构造出任意明文的密文。Padding Orcale实际上是一种边信道攻击,攻击者只需要知道密文的解密结果是否正确即可。

11.6 秘钥管理
	在密码学里有个基本的原则:密码系统的安全性应该依赖于秘钥的复杂性,而不应该与算法的保密性。
	秘钥管理中最常见的错误,就是将秘钥硬编码在代码里。硬编码的秘钥,在以下几种情况下可能被泄露:
		1.代码被广泛传播。这种泄露途径一般常见于一些开源软件,有的商业软件并不开源,但是编译后的二进制文件能被用户下载,被逆向工程反编译后,泄露硬编码的秘钥
		2.软件开发软对的成员都能查看代码,从而获知硬编码的秘钥。
		对于第一种情况,如果一定要将密码硬编码在代码中,我们尚可通过Diffie-Hellman交换秘钥体系,生成公私钥来完成秘钥的分发,而对于第二种情况,则只能通过改善秘钥管理来保护秘钥。
		对于web应用而言,常见的做法是将秘钥(包括密码)保存在配置文件或者数据库中,在使用时由程序读出秘钥并进行加载进内存。
		
11.7 伪随机数问题
	伪随机数问题-伪随机数不够随机,是程序开发中会出现的一个问题。伪随机数是通过一些数学算法生成的随机数并非真正的随机数,真正的随机数则是通过一些物理系统生成的随机数,比如电压的波动、硬盘磁头读写时寻道时间、空中电磁波的噪声等。
	1.弱伪随机数的麻烦
		在web应用中使用伪随机数的地方非常广泛,密码、key、sessionid、token等关键的secret 往往都是通过伪随机数算法生成的,如果使用了弱伪随机数算法,则可能导致非常严重的安全问题。
	2.时间真的随机么?
		很多伪随机数算法与系统时间有关,而有的程序员甚至直接使用系统时间代替随机数的生成,这样生成的随机数,是根据时间顺序增长的,可以从时间上进行预测,从而存在安全隐患。
	3.破解伪随机算法的种子
		伪随机数是由数学算法实现的,他真正随机的地方在于种子(seed),种子一旦确定后,在通过同一伪随机数算法计算出来的随机数,其值是固定的,多次计算所得值的顺序也是固定的。
	4.使用安全的随机数
		在重要或者敏感的系统中,一定要使用足够强壮的随机数生成算法,还可以通过多个随机数组合,以增加随机数的复杂性。比如通过给随机数使用MD5算法后,在连接一个随机字符,然后在使用MD5算法一次。
		
总结:在加密算法的选择和使用上,有以下最佳实践:
	1.不要使用ECB模式
	2.不要使用流密码(比如RC4)
	3.使用HMAC-SHA1代替MD5甚至是代替SHA1
	4.不要使用想的key做不同的事
	5.salts与IV(秘钥)需要随机产生
	6.不要自己实现加密算法,尽量使用安全专家已经实现的库
	7.不要依赖系统的保密性
当你不知道如何选择时,有以下建议:
	1)使用CBC模式的SHA256用户加密
	2)使用HMAC-SHA512用于完整性检查
	3)使用带salt的SHA-256或SHA-512用户Hashing

你可能感兴趣的:(安全,算法,安全)