看书之前对加密算法是有基本概念了解的。通过学习有了更加的了解,把自己get的点记录一下,其中代码部分没有逐行学习。
分组加密算法和流加密算法
加密算法分为两种:分组加密和流加密。
- 分组是基于block进行操作,根据算法不同,每个分组的长度可能不同,代表算法DES,3DES,AES。IDEA,
- 流加密是每次处理一个字节,秘钥是独立于消息之外的,通过异或实现加密和解密。代码算分RC4,SEAL
流秘钥攻击
- reused key attack。多次用同一个秘钥加解密,这种情况下,攻击者不需要知道秘钥就可以还原明文 E(A)xor E(B) = A xor B, 这个公式里面,四个中知道3就能算出第四个了,所以即使不知道秘钥也可以实施破解
- 一次一密。就是初始化向量,防止resued key attack。使用随机的初始化向量,增加了破解的难度,从而增加了安全性。但是如果初始化向量不够随机,攻击者仍然可能实施破解
- bit flipping attack。修改密文的某个字节,导致另一组明文字节发生变化。 E(A)xor E(B) = A xor B ->A xor E(A) xor b = E(b)可以看出如果我们知道ab的明文,a的密文,可以推导出b的密文。
- 解决的方式是,验证密文完整性,增加带key的mac消息,通过mac验证密文是否被篡改
- 通过哈希实现的MAC,就是HMAC,性能较好,被广泛应用。
- 不知道key的情况下,就不能实现bit flipping攻击
分组加密算法缺陷攻击
- 分组加密的共识:ECB,CBC,CFB
- 加密模式被攻击,不管秘钥多长,都不安全
- ECB 缺陷,对调分组密文,解密后,明文也是对调的。ECB没有混淆分组之间的关系,分组足够多的时候,会暴露一些隐私信息。
- 多于一个分组的时候,避免使用ECB
- 针对CBC模式的padding oracle attack,在不知道秘钥的前提下,通过padding bytes尝试,还原明文。是一种边信道攻击
秘钥管理
基本原则:安全性依赖于秘钥复杂性,而不是算法保密性
难的是秘钥管理
秘钥管理常见错误,秘钥硬件编码。预防措施
- 通过DH交换体系,生成撕咬来完成秘钥分发
- 改善秘钥体系来保护秘钥
- 对于web应用,秘钥保存在配置文件或者数据库里面,程序读出秘钥并加载到内存,配置文件或者数据库实施严格的访问控制权限,
- 定期更换秘钥
- 只加载到内存,动态获取
伪随机数的问题
- 前面一次一密提到随机数增加安全性,但应防止一些伪随机。通过数学算法生成的随机,并非真的随机。真的随机是通过wuli系统生成的,如,电压,电磁波。。
- 弱伪随机会被遍历出来,具有安全的风险。web应用中,key,sessionID,token如果使用了弱伪随机,可能导致严重安全问题。
- 不要把时间函数当成随时数
- 使用安全的随机数
- 足够强壮的随机数生成算法
- 多个随机数的组合,增加复杂性
web安全关注
- 好的加密算法
- 秘钥管理
- 强壮的随机数