关于SSL,TLS,对称加密,非对称(公私钥)加密等的学习笔记。
密码学基础
大纲:
- 对称加密
- 非对称加密
- 混合加密HTTPS
- 哈希算法
- 国密
- 数字签名和CA认证
词汇表
名称 | 中文 | 说明 |
---|---|---|
ciphertext | 密文 | 编码后的数据, 非用户可读 |
encryption | 加密 | 把明文转换成密文的过程 |
decryption | 解密 | 把密文转换成明文的过程 |
key | 密钥 | 使用改密钥加密敏感数据(必须被私密保存,不能被知晓) |
nonce | 随机数 | 必须唯一且只被使用一次,通常是随机数或伪随机数 |
plaintext | 明文 | 用户可读数据 |
public key | 公钥 | 用公钥加密消息; 验证签名 |
private key | 私钥 | 解密消息; 创建签名 |
prime | 素数 | |
asymmetric cryptography | 非对称加密 | 加密和解密用不同的key |
symmetric cryptography | 对称加密 | 加密和解密用相同的key |
MAC | Message Authentication Code | 消息认证码,基于密钥的一个签名 |
HMAC | MAC based on hash function | 数据签名,确保数据没有被修改和替换 |
MITM(Man In The Middle) Attack | 中间人攻击 | |
ECC | Elliptic Curve Crypto systems | 椭圆曲线密码体制 |
对称加密/分组加密
也称作共享密钥加密,即用相同的密钥加密和解密。双方需要保证共享密钥的传输不被截获(会用到密钥交换算法)。
每次处理固定长度的明文/Block Cipher(加密固定长度blocks),过长的内容需要用一定工作模式加密。
经典算法
- 不够安全的 DES(Data Encryption Standard),3DES
- AES(Advanced Encryption Standard): 适用于大数据量加解密,需提前分发密钥
- 块128位,密钥128+
- AES-128-CBC
工作模式
常用的工作模式有:
- EBC (Electronic Code Book Mode) 把stream分为多个blocks
- encryption oracle - 可能被有限次尝试后破解
- 密文分组链接/CBC (Cipher Block Chaining)
- 明文块和前一个加密块XOR
- IV(Initialization Vectors ) 和第一个明文块XOR : 随机数
- 需要不可预知
- 不一定保密,通常以明文形式添加到密文
- 必须保证攻击者在IV给出前不能提前预知
- 不能使用密钥做IV
- TLS 1.0 使用
- 计数器/CTR
工作模拟用到的一些算法和概念:
XOR
用相同的one-time pad加密
- 两条消息: 两个密文直接XOR,可得出明文
- 几条消息: 如果猜出一个明文,则可以知道key是什么
- 猜到部分cribs,可以根据上下文语境等猜出更多
Padding/填充
- PKCS5/PKCS7
- PKCS5只讨论了8字节(64位)块的加密填充
- AES等算法把块大小扩充到16字节, 如果采用PKCS5实质上采用的是PKCS7
非对称加密
即公私钥对加解密,私钥是钥匙,而公钥是锁,可以把锁公开出去,让别人把数据锁起来发给我;而钥匙一定要留在自己手里,用于解锁。
两种用途:
-
加密:把公钥发布出去用于加密,只有自己的私钥可以解密,保证了数据的机密性;
-
数字签名,把公钥发布出去后,用私钥加密数据作为签名,以证明该数据由私钥持有者所发送。
-
RSA加解密算法:公钥加密、私钥解密。
-
DH密钥交换算法:生成共享密钥K,交换的安全性基于求有限域上离散对数的难度。
-
数字签名算法:生成摘要,然后对摘要签名。
注: 椭圆曲线算法/ECC,一般适用于签名或密钥协商,不适用于大量数据的加解密:
密钥交换算法
一定程度解决密钥配送问题,但是无法验证核实通信方的身份,可能受到中间人攻击。所以执行密钥交换算法之前一般要核实对方身份,比如使用数字签名。
常用算法:
- 不够安全的RSA: 大素数分解,利用极大因数分解的计算量极大这一特点
- Diffie-Hellman Key Exchange
- DHE/EDH 是DH的Ephemeral(临时)增强形式
- ECDH是基于ECC的DH( Diffie-Hellman)密钥交换算法,交换双方可以在不共享任何秘密的情况下协商出一个密钥
安全性对比:
名称 | 安全性 | 备注 |
---|---|---|
RSA | 低,有RSA私钥就可以解密 | 已有公私钥,只执行一次模幂 |
DHE | 较高,RSA私钥泄露不影响 | 每次随机生成大素数,模幂两次 |
ECDHE | 很高 | 每次生成大数,计算椭圆方程的乘法两次,得到公钥 |
说明:
- 如果开启完全正向保密协议/perfect forward secrecy,客户端和服务端会使用Diffie-Hellman (DH)协商一个共享会话密钥; 服务端私钥只用来签名.
- 如果不支持完全正向保密协议(假定服务端使用RSA密钥), 客户端会使用服务端公钥加密共享会话密钥, 同理也就可以使用服务端私钥解密(被服务端或Wireshark).
数字签名
证实完整性和来源(不可抵赖)
签名算法:
- RSA
- DSA/(Digital Signature Algorithm)
- ECDSA: 数字签名算法DSA的变体
工具
安全
磁盘
- Windows: bitlocker
- Mac: FileVault
- VeraCrypt: 磁盘加密,基于 TrueCrypt,支持全系统
- 消息文件加密: PGP
Java
# JDK默认限制密码算法密钥长度,需要使用无限制权限策略文件替换JDK相关策略文件后本密码基础套件才可正常运行
# 出错信息
Caused by: java.security.InvalidKeyException: could not encrypt message
# 路径
/usr/java/jdk1.8.0_92/jre/lib/security
扩展阅读
- crypto101
- jsrsasign:JavaScript 加密库
- 非对称加密(RSA、DH密钥交换算法、数字签名)