------------恢复内容开始------------

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