《白帽子讲Web安全》11-加密算法与随机数

第11章 加密算法与随机数

11.1 概述

  1. 常见的加密算法
    • 分组加密算法
    • 流密码加密算法
  2. 对比
分组加密算法 流密码加密算法
基于“分组”(block)进行操作 每次只处理一个字节
根据算法的不同,每个分组的长度可能不同 密钥独立于消息之外,两者通过异或实现加密与解密
代表:DES、3-DES、Blowfish、IDEA、AES等 代表:RC4、ORYX、SEAL等

3. 针对加密算法的攻击,一般根据攻击者能获得的信息,可以分为:
- 唯密文攻击
- 已知明文攻击
- 选择明文攻击
- 选择密文攻击

11.2 Stream Cipher Attack

流密码的加密是基于异或(XOR)操作进行的,每次都只操作一个字节。但流密码加密算法的性能非常好。

11.2.1 Reused Key Attack

  1. 在流密码的使用中,最常见的错误便是使用同一个密钥进行多次加/解密。

11.2.2 Bit-flipping Attack

  1. 在密码学中,攻击者在不知道明文的情况下,通过改变密文,使得明文按其需要的方式发生改变的攻击方式,被称为Bit-flipping Attack.
  2. 解决Bit-flipping攻击的方法是验证密文的完整性。
    • 最常见的方法是增加带有KEY的MAC(消息验证码,Message Authentication Code),通过MAC验证密文是否被篡改。
    • HMAC:通过哈希算法来实现的MAC

11.2.3 弱随机IV问题

11.3 WEP破解

  1. 现实中,一种最著名的针对流密码的攻击可能就是WEP密钥的破解。
  2. WEP是一种常见的无线加密传输协议,破解了WEP的密钥,就可以以此密钥连接无线的Access Point。
  3. WEP采用RC4算法。
  4. WEP在加密过程中,有两个关键因素
    • 初始化向量IV
    • 对消息的CRC-32校验
  5. 实际破解WEP的步骤(Aircrack实现):
    • 加载目标
    • 与目标网络进行协商
    • 生成密钥流
    • 构造ARP包
    • 生成自己的ARP包
    • 开始破解
    • 成功破解出WEP的KEY

11.4 ECB模式的缺陷

  1. 分组加密算法常见的加密模式:
    • ECB(电码簿模式)
    • CBC
    • CFB
    • OFB
    • CTR
  2. ECB模式,及其存在的问题
  3. 当需要加密的明文多余一个分组的长度时,应该避免使用ECB模式,而使用其他更安全的加密模式

11.5 Padding Oracle Attack

11.6 密钥管理

  1. 在密码学里有个基本的原则:密码系统的安全性应该依赖于密钥的复杂性,而不应该在于算法的保密性。
  2. 在安全领域里,选择一个足够安全的加密算法不是困难的事,难的是密钥管理。
    • 在实际的攻击案例中,直接攻击加密算法本身的案例很少,而因为密钥没有妥善管理导致的安全事件却很多。
  3. 密钥管理中最常见的错误,就是将密钥硬编码在代码里。
  4. 同样,将加密密钥、签名的salt等“key”硬编码在代码中,是非常不好的习惯。
    • 硬编码的密钥,在以下几种情况中可能被泄露:
      • 代码被广泛传播
      • 软件开发团队的成员都能查看代码,从而获知硬编码的密钥。
  5. 对于Web应用来说,常见的做法是将密钥(包括密码)保存在配置文件或者数据库中,在使用时由程序读出密钥并加载进内存。
    • 密钥所在的配置文件或数据库需要严格的控制访问权限,同时也要确保运维或DBA中具有访问权限的人越少越好。
  6. 当应用发布到生产环境时,需要重新生成新的密钥或密码,以免与测试环境中使用的密钥相同。
  7. 当黑客已经入侵之后,密钥管理系统也难以保证密钥的安全性。
    • 由于正常的应用程序也需要使用密钥,因此对密钥的控制不可能限制住webshell的“正常”请求。
  8. 密钥管理的主要目的,还是为了防止密钥从非正常的渠道泄露。

11.7 伪随机数问题

  1. 伪随机数,是通过一些数学算法生成的随机数,并非真正的随机数。
  2. 对应的“真随机数”,则是通过一些物理系统生成的随机数。
  3. 伪随机数(pseudo random number)问题——伪随机数不够随机,是程序开发中会出现的一个问题。
  4. (待补充)

11.8 小结

  1. 在Web安全中,我们更关心的是怎样用好加密算法,做好密钥管理,以及生成强壮的随机数。
  2. 在加密算法的选择和使用上,有以下最佳实践:
    • 不要使用ECB模式
    • 不要使用流密码(比如RC4)
    • 使用HMAC-SHA1代替MD5(甚至是代替SHA1)
    • 不要使用相同的key做不同的事情
    • salts与IV需要随机产生
    • 不要自己实现加密算法,尽量使用安全专家已经实现好的库
    • 不要依赖系统的保密性
  3. 当你不知道该如何选择时,有以下建议:
    • 使用CBC模式的AES256用于加密
    • 使用HMAC-SHA512用于完整性检查
    • 使用带salt的SHA-256或SHA-512用于Hashing

你可能感兴趣的:(Web,安全,web,加密)