密码学入门：对称加密、非对称加密与哈希

密码学入门：对称加密、非对称加密与哈希引言密码学听起来高深，但底层就三块拼图：对称加密、非对称加密、哈希。理解它们，就理解了 HTTPS、数字签名、密码存储的原理。一、对称加密：同一把钥匙加密和解密用同一把密钥。快、适合加密大量数据。代表算法：AES（推荐 AES-256-GCM，兼具加密与完整性）。 from cryptography.fernet import Fernet key = Fernet.generate_key() # 同一把密钥，需安全分发 token = Fernet(key).encrypt(b"secret") plain = Fernet(key).decrypt(token) 难点：密钥怎么安全传给对方？这就是“密钥分发问题”。二、非对称加密：公钥与私钥一对密钥：公钥可公开，私钥自己留。用公钥加密，只有私钥能解；用私钥签名，公钥可验。代表算法：RSA、ECC（更短密钥、更高效率）。加密：别人用你的公钥加密，只有你能用私钥解开。签名：你用私钥签名，别人用公钥验证“确实是你发的、且未被篡改”。密钥交换（解决分发问题） Diffie-Hellman / ECDHE 让双方在不安全信道上协商出一把临时对称密钥，即使被窃听也无法推导出密钥。这是 HTTPS 握手的关键。三、哈希：不可逆的“指纹” 把任意数据映射成固定长度摘要，单向不可逆。代表算法：SHA-256。用于完整性校验、密码存储（加盐）。 import hashlib print(hashlib.sha256(b"hello").hexdigest()) HMAC：用密钥参与哈希，既验证完整性又验证来源，常用于接口签名。四、它们如何协作（以 HTTPS/TLS 为例）握手：用非对称加密 / ECDHE 安全地协商出临时对称密钥（且前向安全）。传输：之后用这把对称密钥对称加密数据（快）。完整性：用 MAC/HMAC 防篡改。身份：服务器用数字证书（PKI） 证明自己不是冒充者。 TLS 1.3 进一步简化为单次往返，并禁用了不安全的旧套件。五、密码存储：别自己发明用 argon2 / bcrypt / PBKDF2 等慢哈希 + 随机盐。盐防止彩虹表；慢因子对抗暴力破解。永远不要明文、不要用纯 MD5/SHA（太快）。六、密钥管理再强的算法，密钥泄露就归零。要点：密钥分环境存储、定期轮换、用 KMS/密钥库、不要把密钥写进代码仓库。七、常见误区 “Base64 是加密”——它只是编码，可逆且无密钥。 “MD5 加盐就安全”——MD5 太快，仍易被暴力。 “自己写加密算法”——除非你是密码学专家，否则千万别。忽视前向安全：固定密钥被破解会牵连历史通信。八、量子威胁（前瞻） Shor 算法可攻破 RSA/ECC，Grover 可加速暴力破解。抗量子密码（PQC）正在标准化，长生命周期系统应开始关注。小结三句话记住：对称快、非对称解决密钥分发、哈希做指纹。三者 + PKI 组合，撑起了现代互联网的安全。下一篇聊身份与访问控制。延伸《Cryptography Engineering》下一篇：《身份认证与访问控制：从密码到 MFA》