密码学基础
对称 vs 非对称加密
| 类型 | 密钥模型 | 速度 | 使用场景 | 算法 |
|---|---|---|---|---|
| 对称加密 | 同一密钥加密/解密 | 快 | 大量数据加密 | AES-256、ChaCha20 |
| 非对称加密 | 公钥加密,私钥解密 | 慢 | 密钥交换、数字签名 | RSA-2048+、ECDSA、Ed25519 |
| 混合加密 | 非对称交换对称密钥 | 快+安全 | TLS、PGP、Signal | RSA/ECDH + AES |
哈希函数参考
| 算法 | 输出大小 | 状态 | 适用 |
|---|---|---|---|
| MD5 | 128 位 | 已破解 | 仅用于校验和(非安全场景) |
| SHA-1 | 160 位 | 已废弃 | 仅遗留系统 |
| SHA-256 | 256 位 | 安全 | 数据完整性、JWT、证书 |
| SHA-512 | 512 位 | 安全 | 高安全级别完整性校验 |
| bcrypt | 60 字符 | 安全(慢速) | 密码哈希 |
| Argon2id | 可变 | 密码最佳选择 | 密码哈希(OWASP 推荐) |
| BLAKE3 | 256 位 | 安全 | 快速通用哈希 |
Go 中的 AES 加密
// AES-256-GCM(认证加密)
func encrypt(plaintext, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key) // key 必须是 32 字节(AES-256)
if err != nil { return nil, err }
gcm, err := cipher.NewGCM(block)
if err != nil { return nil, err }
nonce := make([]byte, gcm.NonceSize())
if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
return nil, err
}
return gcm.Seal(nonce, nonce, plaintext, nil), nil
}
TLS 握手概述
| 步骤 | 说明 |
|---|---|
| 1. ClientHello | 客户端发送支持的 TLS 版本、加密套件、随机数 |
| 2. ServerHello | 服务端选择 TLS 版本、加密套件,发送证书 |
| 3. 证书验证 | 客户端对照可信 CA 验证服务端证书 |
| 4. 密钥交换 | ECDHE 生成共享密钥而不传输它 |
| 5. 完成 | 双方派生会话密钥;开始加密通信 |