https权威指南
github/bulletproof-tls
SSL Labs
作者blog - Ivan Ristić
SSL 和 TLS 傻傻分不清楚
SSL和TLS都是加密协议,旨在基于不安全的基础设施提供安全通信
非常不幸,本身相同的协议却有两个名称(各位读者可能不会注意到这些,那也没关系)
SSL: secure socket layer 安全套接字层
TLS: transport layer security 传输层安全
SSL1 Netscape公司开发
SSL2 Netscape 1994
SSL3 Netscape 1995
TLS 工作组成立, 开始将SSL从Netscape迁移至IETF 1996
TLS1.0 1999
TLS1.1 2006
TLS1.2 2008
TLS1.3 draft(草案) 19[8] 2017.3
PKI: public key infrastructure 公钥基础设施; SSL和TLS依赖PKI, 确保不能解密数据和篡改数据
osi: open systems interconnection 开放系统互联, 常见的两种说法 OSI 7层网络模型 + tcp/ip 4层网络模型
- 安全协议从哪里融入互联网基础设施
密码学
安全的三个核心需求:
- 保持秘密(机密性)
- 验证身份(真实性)
- 保证传输安全(完整性)
工作方式
- 各种加密基元cryptographic primitive, 完成特定功能(加密/完整性检查)
- 加密基元组合成方案(scheme)和协议(protocol)
- 方案/协议完成加密任务
加密时通常会使用到三个术语
- 明文(plaintext,即原始数据)
- 密钥(cipher,用于加密)
- 密文(ciphertext,即加密后的数据)
密码可以分为两大类
- 序列密码(stream cipher): 密钥 + 序列密码(比如 RC4) -> 密钥序列; 密钥序列 + 明文 -> 密文
- 分组密码(block cipher): 每次加密一整块数据(比如128位); 人们通过称为分组密码模式(block cipher mode)的加密方案来使用分组密码; 世界上最流行的分组密码是高级加密标准(advanced encryption standard,AES); 填充, 数据不足数据块大小(比如128位)的情况
散列函数(hash function)
- 将任意长度的输入转化为定长输出的算法
- 指纹、消息摘要,摘要
- SHA1(160位) -> SHA256
- 生日悖论(概率论中的常见问题)-> 散列函数的强度最多只是散列长度的一半
- 散列函数可以用于验证数据完整性: 消息验证代码(message authentication code,MAC) 基于散列的消息验证代码(hash-based message authentication code,HMAC)
分组密码模式
- 为了加密任意长度的数据而设计的密码学方案; ECB、CBC、CFB、OFB、CTR、GCM 等; ECB是设计一种分组加密模式的反面例子, CBC则仍是SSL和TLS的主要模式, GCM是TLS中相对较新(TLS1.2)的模式
- 电码本(electronic codebook,ECB)模式
- 加密块链接(cipher block chaining,CBC)模式, 为了解决ECB天生的确定性,CBC引入了初始向量(initialization vector,IV)的概念。即使输入相同,IV也可以使每次的输出都不相同
对称加密/非对称加密
- 对称加密(symmetric encryption), 又称私钥加密(private-key cryptography): 在高速处理大量数据方面做得非常好; 相同团体的成员必须共享相同的密钥; 为了更好的安全性,你可以在每两个人之间使用不同的密钥,但是这个方法不可扩展
(1+n)*n/2
- 非对称加密(asymmetric encryption)又称为公钥加密(public key cryptography): 公钥公开, 私钥自己保管; 公钥加密私钥解密 -> 加密数据; 私钥加密公钥解密 -> 数字签名
- RSA是目前最普遍部署的非对称加密算法, 现在推荐的RSA强度是2048位,强度等同于112位的对称密钥; 可以同时用于加密和数字签名
- 数字签名(digital signature): 验证一条电子消息或者一篇电子文档的真实性; 比如 RSA, DSA, ECDSA
随机数生成
- 计算机按指令执行 -> 可能做不好生成随机数这项工作 -> 真正的随机数只能通过观测特定的物理处理器才能得到 -> 没有的话,计算机将关注于收集少量的熵(entropy)
- 通过这种方式收集熵是一种真随机数生成器(true random number generator,TRNG) -> 你可能需要生成一个4096位的密钥,但是系统可能只有数百位的熵可用
- 基于上面的原因,我们在实际使用中依靠的是伪随机数生成器(pseudorandom number generator,PRNG) -> PRNG也要利用少量真正的随机数使系统运转起来。这个过程被称为种子设定(seeding) -> 普通用途的PRNG被常常用于编程,但它们并不适用于密码学 -> 加密安全伪随机数生成器(cryptographically secure pseudorandom number generator,CPRNG)是不可预测的PRNG
接下来还有什么
- 协议
- 公钥基础设施
- 攻击PKI
- http和浏览器问题
- 实现问题
- 协议攻击
- 部署
- 性能优化
- http严格传输安全/内容安全策略和钉扎
- openSSL