------------恢复内容开始------------
- 密码三要素:
- 保密性,完整性,可用性
- 在算法公开的情况下,也不能被破解,如果密码算法逼得攻击者只能用穷举法,那么密钥被称为安全密钥,此时攻击难度可以被量化
- 分组密码: 先分组后加密 -->商用民用-->慢
- 流密码:来一个数据加密一个数据 -->军用-->快
-
第11章 加密算法与随机数
- 针对加密算法的攻击
- 密文攻击
- 攻击者有一些密文,他们是使用统一加密算法和同一密钥加密的。
- 已知明文攻击
- 攻击者能获得一部分明文和对应密文
- 选择明文攻击
- 攻击者能选择明文,获取密文
- 选择密文攻击
- 攻击者可以选择不同的密文来解密
- 密文攻击
- Stream Cipher Attack (流密码攻击)
- 流密码的加密是基于异或(XOR)操作进行的,每次操作都只操作一个字节,但是流密码加密的性能好
- 常见:RC4、ORYX、SEAL等
- Reused Key Attack(使用一个密钥多次加/解密)
- 攻击者不需要知道密钥,即可还原明文
- 两个相同的数异或为0,根据一组明文和密文,已知三个推导第四个
- 如果存在初始向量,则相同的明文每次加密的结果均不相同,增加破解的难度
- 如果IV不够随机,攻击者可能找到相同的IV,则在相同的IV的情况下仍然可以实施攻击
- Bit-flipping Attack
- 密码学中,攻击者在不知道明文的情况下,通过改变密文,使得明文按照其需要的方式发生改变,叫做Bit-flipping Attack
- A明文、B明文、A密文-->推导B密文 构造管理员Cookie
- 解决方案:验证密文的完整性,常见方法是 带有KEY的MAC(消息验证码),通过MAC验证密文是否被篡改。
- 通过哈希算法实现的MAC,称为HMAC.
- 弱随机IV问题
- authcode()函数中,默认4字节的IV,4字节不够随机,可以通过暴力破解的方式,找到重复的IV
- 16秒,便利19295个不同的XOR KEY,找到了相同的IV,破解出了明文。
- WEP破解
- 一种常用的无线加密传输协议,破解了WEP的密钥,就可以以此密钥链接无线的Access Point.WEP使用RP4算法。
- WEP在加密过程中有两个关键因素,一个是初始化向量IV,一个是对消息CRC-32校验。
- IV以明文的形式发送,WEP中采用的是24bit的IV
- IV一旦重复,就使得Reused Key Attack成为可能
- 一种常用的无线加密传输协议,破解了WEP的密钥,就可以以此密钥链接无线的Access Point.WEP使用RP4算法。
- ECB模式的缺陷
- 在分组加密算法中常见加密算法:ECB\CBC\CFB\OFB\CTR等
- EBC模式最大的问题出在这种独立分组的独立性上:攻击者只需要对任意分组的密文,在 经过解密后,所得明文顺序也是经过对调的
- 对于ECB模式来说,改变分组密文的顺序,将改变解密后的明文顺序:替换某个分组密文,解密后对应的明文也会被替换,而其他分组不受影响。
- ECB模式带有明文的统计特征
- 当需要加密的明文多余一个 分组的长度时,应该避免ECB模式。
- Padding Oracle Attack
- 漏洞:在 不知道密钥的情况下,通过对Padding bytes的尝试,还原明文,或者构造出任意明文的密文。
- 分组加密算法在实现加/解密时,需要把消息进行分组(block),block的大小64bit、128bit、256bit等
- 如果最后一个分组没有达到block的大小,则需要填充一些字节,被称为padding.
- 以8个字节为一个block为例
- 在解密完成后,如果最后的pading值不正确,解密程序往往会抛出异常(padding error),利用错误回显,攻击者往往可以判断出padding是否正确。
- 仅需要密文和IV,通过padding推导,即可还原明文,而不需要密码
- CBC模式将异常封装,就不会有问题了
- 密钥管理
- 密码学基本原则
- 密码系统的安全性应该依赖于密钥的复杂性
- 而不是依赖于算法的保密性
- 常见错误:
- 将密钥硬编码在代码里
- 讲过加密密钥、签名的salt等硬编码在代码中
- 硬编码私钥
- 泄露途径
- 代码被广泛传播,反编译后泄露硬编码的密钥
- 如果一定 要硬编码,可以通过Diffie-Hellman交换密钥体系,生成公私密钥
- 软件开发团队成员泄露代码
- 密钥管理
- 代码被广泛传播,反编译后泄露硬编码的密钥
- 密钥(密码)保存在配置文件或数据库中,在使用时由此程序读出密钥并加载进内存。
- 密钥所在的配置文件或数据库需要严格的访问控制,确保运维或DBA中具有权限的人尽可能少。
- 应用发布时,重新生成 新的密钥(密码),避免和测试环境相同
- 密钥集中保护,提供获取密钥的API,定期更换
- 密码学基本原则
- 伪随机数问题
- 密码、Key、SessionID、token等往往时伪随机算法生成的
- 时间真的随机码
- 不要把时间函数当成随机数使用
- 破解伪随机 算法的种子
- 常见的PHP 随机数生成算法有rand(),mt_rand()
- 伪随机数是由数学 算法实现的,种子(seed)一旦确定后,再通过统一伪随机算法计算除开的随机数,其值是固定的,多次计算所得值的顺序也是固定的。
- 攻击方式
- 通过一些方法猜解出种子的值
- 通过,t_srand()对猜解出的种子值进行传播
- 通过还原程序逻辑,计算出对应的mt_rand()产生的伪随机数的值。
- 使用安全的随机数
- 在重要或敏感的系统中,使用安全的随机数生成算法,
- JAVA:java.security.SecureRandom
- Linux,可以使用/dev/random 或 /dev/urandom来生成随机数
- 在PHP5.3.0及以后版本,若支持OpenSSL扩展,可以直接使用函数生成随机数
- string openssl_random_pseudo_bytes(int $length[,bool &$crypto_strong])
- 在重要或敏感的系统中,使用安全的随机数生成算法,
- 建议
- 不要使用ECB模式
- 不要使用流密码(如RC4)
- 不要使用HMAC-SHA1代替MD5(甚至是代替SHA1)
- 不要适应相同的key做不同的事情
- salts 与IV需要重新生成
- 不要自己实现加密算法,尽量使用安全专家已经实现好的库
- 不要依赖系统的保密性
- 好的推荐
- 使用CBC模式的AES256用于加密
- 使用HMAC-SHA512用于完整性校验
- 使用带salt的SHA-256或SHA-512用于Hashing.
- PBKDF2
- 针对加密算法的攻击