白帽子讲Web安全(第 11 章 加密算法与随机数)

第 11 章 加密算法与随机数

加密算法与伪随机数算法是开发中经常会用到的东西,但加密算法的专业性非常强,在 Web 开发中,如果对加密算法和伪随机数算法缺乏一定的了解,则很可能会错误的使用它们,最终导致应用出现安全问题。

11.1 概述

密码学有着悠久的历史,它满足了人们对安全的最基本需求----保密性。密码学可以说是安全领域发展的基础。

常见的加密算法通常分为 分组加密算法流密码加密算法 两种,两者的实现原理不同。

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

针对加密算法的攻击,一般根据攻击者能获得的信息,可以分为:

  • 唯密文攻击
    攻击者有一些密文,它们是使用同一加密算法和同一密钥加密的。这种攻击是最难的。
  • 已知明文攻击
    攻击者除了能得到一些密文外,还能得到这些密文对应的明文。
  • 选择明文攻击
    攻击者不仅能得到一些密文和明文,还能选择用于加密的明文。
  • 选择密文攻击
    攻击者可以选择不同的密文来解密。

11.2 Stream Cipher Attack

流密码是常用的一种加密算法,与分组加密算法不同,流密码的加密是基于异或( XOR )操作进行的,每次都只操作一个字节。但流密码加密算法的性能非常好,因此也是非常受开发者欢迎的一种加密算法。

11.2.1 Reused Key Attack

在流密码的使用中,最常见的错误便是使用同一个密钥进行多次加/解密。这将使得破解流密码变得非常简单。这种攻击被称为“ Reused Key Attack ”,在这种攻击下,攻击者不需要知道密钥,即可还原出明文。

假设有密钥 C ,明文 A ,明文 B ,那么,XOR 加密可表示为:

E(A) = A xor C
E(B) = B xor C

密文是公之于众的,因此很容易就可计算:

E(A) xor E(B)

因为两个相同的数进行 XOR 运算结果为 0 ,由此可得:

E(A) xor E(B) = (A xor C) xor (B xor C) 
              = A xor B xor C xor C
              = A xor B

这意味着 4 个数据中,只需要知道 3 个,就可以推到出剩下的一个。这个公式中密钥 C 在哪里?已经完全不需要了!

11.2.2 Bit-flipping Attack

再次回到公式上来:

E(A) xor E(B) = A xor B

由此可以得出:

A xor E(A) xor B = E(B)

这意味着当知道 A 的明文、B 的明文、A 的密文时,可以推导出 B 的密文。这在实际应用中非常有用。

比如一个网站应用,使用 Cookie 作为用户身份的认证凭证,而 Cookie 的值是通过 XOR 加密而得的。认证的过程就是服务器端解密 Cookie 后,检查明文是否合法。假设明文是:

username+role

那么当攻击者注册了一个普通用户 A 时,获取了 A 的 Cookie 为 Cookie(A),就有可能构造出管理员的 Cookie,从而获得管理员权限:

(accountA+member) xor Cookie(A) xor (admin_account+manager) = Cookie(admin)

在密码学中,攻击者在不知道明文的情况下,通过改变密文,使得明文按其需要的方式发生改变的攻击方式,被称为 Bit-flipping Attack

解决 Bit-flipping 攻击的方法是验证密文的完整性,最常见的方法是增加带有 KEY 的 MAC (消息验证码,Message Authentication Code ),通过 MAC 验证密文是否被篡改。

通过哈希算法来实现的 MAC,称为 HMAC。HMAC 由于其性能较好,而被广泛使用。

11.2.3 弱随机 IV 问题

11.3 破解

流密码加密算法存在“ Reused Key Attack ”和“ Bit-flipping Attack ”等攻击方式。而在现实中,一种最著名的针对流密码的攻击可能就是 WEP 密钥的破解。 WEP 是一种常用道得无线加密传输协议,破解了 WEP 的密钥,就可以以此密钥连接无线的 Access Point。WEP 采用 RC4 算法,也存在这两种攻击方式。

WEP 在加密过程中,有两个关键因素,但两者均可通过一些方法克服:

  1. 初始化向量 IV 。
  2. 对消息的 CRC-32 校验。

11.4 ECB 模式的缺陷

对于分组加密算法来说,除去算法本身,还有一些通用的加密模式,不同的加密算法会支持同样的几种加密模式。常见的加密模式有:ECB、CBC、CFB、OFB、CTR 等。如果加密模式被攻击,那么不论加密算法的密钥有多长,都可能不再安全。

ECB 模式(电码表模式)是最简单的一种加密模式,它的每个分组之间相对独立。

但 ECB 模式最大的问题也是出在这种分组的独立性上:攻击者只需要对调任意分组的密文,在经过解密后,所得明文的顺序也是经过对调的。

对于 ECB 模式来说,改变分组密文的顺序,将改变解密后的明文顺序;替换某个分组密文,解密后该对应分组的明文也会被替换,而其他分组不受影响。

这与链式加密模式(CBC)等是完全不同的,链式加密模式的分组前后之间会互相关联,一个字节的变化,会导致整个密文发生变化。

ECB 模式的缺陷,并非某个加密算法的问题,因此即使强壮如 AES-256 等算法,只要使用了 ECB 模式,也无法比卖你此问题。此外,ECB 模式仍然会带有明文的统计特征,因此在分组较多的情况下,其私密性也会存在一些问题,如下:

ECB 模式并非完全混淆分组间的关系,因此当分组足够多时,仍然会暴露一些私密信息,而链式模式则避免了此问题。

当需要加密的明文多于一个分组的长度时,应该避免使用 ECB 模式, 而使用其他更加安全的加密模式。

11.5 Padding Oracle Attack

Padding Oracle 实际上是一种边信道攻击,攻击者只需要知道密文的解密结果是否正确即可。

Padding Oracle Attack 的关键在于攻击者能够获知解密的结果是否符合 padding。在实现和使用 CBC 模式的分组加密算法时,注意这一点即可。

11.6 密钥管理

在密码学里有个基本的原则:密码系统的安全性应该依赖于密钥的复杂性,而不应该依赖于算法的保密性。

在安全领域里,选择一个足够安全的加密算法不是困难的事情,难得是密钥管理。在一些实际的攻击案例中,直接攻击加密算法本身得案例很少,而因为密钥没有妥善管理导致的安全事件却很多。对于攻击者来说,他们不需要正面破解加密算法,如果能够通过一些方法获得密钥,则是件事半功倍的事情。

密钥管理中最常见的错误,就是将密钥硬编码在代码里。

硬编码的密钥,在以下几种情况下可能被泄露:

  1. 代码被广泛传播。
  2. 软件开发团队的成员都能查看代码,从而获知硬编码的密钥。

常见的做法是 将密钥(包括密码)保存在配置文件或者数据库中。

密钥管理的主要目的,还是为了防止密钥从非正常的渠道泄露。

11.7 伪随机数问题

伪随机数( pseudo random number )问题----伪随机数不够随机,是程序开发中会出现的一个问题。

但伪随机数问题是真实存在的、不可忽视的一个安全问题。伪随机数,是通过一些数学算法生成的随机数没并非真正的随机数。

11.7.1 弱伪随机数的麻烦

11.7.2 时间真的随机吗?

很多伪随机算法与系统时间有关而有的程序员甚至就直接使用系统时间代替随机数的生成。这样生成的随机数,是根据时间顺序增长的,可以从时间上进行预测从而存在安全隐患。

11.7.3 破解伪随机数算法的种子

伪随机数是由数学算法实现的,它真正随机的地方在于“种子( seed )”。种子一旦确定后,再通过统一伪随机数算法计算出来的随机数,其值是固定的,多次计算所得值得顺序也是固定的。

11.7.4 使用安全的随机数

11.8 小结

在加密算法的选择和使用上,有以下最佳实践:

  1. 不要使用 ECB 模式;
  2. 不要使用流密码(比如 RC4 )
  3. 使用 HMAC-SHA1 代替 MD5(甚至是代替 SHA1 )
  4. 不要使用相同的 key 做不同的事情;
  5. salts 与 IV 需要随机数产生;
  6. 不要自己实现加密算法,尽量使用安全专家已经实现好的库;
  7. 不要依赖系统的保密性。

当你不知道该如何选择时,有以下建议:

  1. 使用 CBC 模式的 AES256 用于加密;
  2. 使用 HMAC-SHA512 用于完整性检查;
  3. 使用带 salt 的 SHA-256 或 SHA-512 用于 Hashing 。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值