Skip to content

03 · 密码学基础 ​

不造轮子、只做选型:对称 / 非对称 / 哈希 / 签名这四个原语各解决什么问题、什么时候用哪个,以及为什么"自己实现加密"几乎总是错的。

速览卡 ​

项内容
一句话定位四个密码学原语的直觉与选型,以及"别自己造"的边界
核心内容对称/非对称/哈希/签名、密钥交换、选型决策、防坑清单
读完能回答密码哈希和加密是一回事吗?签名能代替加密吗?
相关板块S02 认证授权 | N05 TLS | C16 安全纵深

一、四个原语先记一句话 ​

原语一句话比喻
对称加密一把钥匙加密+解密同一把锁的钥匙
非对称加密公钥加密、私钥解密投信口(公钥)+ 信箱钥匙(私钥)
哈希内容 → 固定长度指纹,不可逆指纹 / 摘要
签名私钥签名、公钥验签私章 + 验章

二、对称加密:快,但共享密钥难 ​

项说明
代表AES
特点快、适合大批量数据
难题密钥怎么安全地交给对方

心智模型:对称加密像"同一把钥匙开同一把锁"。好用,但"怎么把钥匙安全送过去"是核心难题——于是需要非对称。


三、非对称加密:解决密钥分发 ​

角色能力
公钥加密、验签,可公开
私钥解密、签名,必须保密
代表用途
RSA老牌,加密/签名都行
ECDSA签名(更短更快)
ECDH协商出共享密钥

心智模型:别人用你的公钥"投信",只有你的私钥能开。TLS 握手正是用它安全协商出对称密钥。


四、哈希:指纹不是加密 ​

text
密码存储:hash(password) 存指纹,不存明文
完整性:hash(文件) 对比,发现是否被改
项说明
特性定长、不可逆、雪崩效应
代表SHA-256(完整性)、bcrypt/argon2(密码)
误区SHA-256 不是密码哈希,密码要用慢哈希(加盐)

密码为什么不能存 SHA-256:它太快,暴力破解很容易。密码哈希用 bcrypt/argon2/scrypt,内置盐且故意慢。


五、签名与 MAC:防篡改 + 认证来源 ​

机制谁来解决什么
数字签名私钥签名,公钥验签认证来源 + 防抵赖
HMAC共享密钥双方通信防篡改

区别:签名用于"我能证明这是某人发的"(公开验证),HMAC 用于"共享密钥的双方确认没被改"。


六、怎么选:一张决策表 ​

需求选什么别用什么
传输保密TLS(对称+非对称组合)自己拼加密
密码存储bcrypt / argon2SHA-256 / 明文
文件完整性SHA-256无
验证来源/防抵赖数字签名只哈希
双方防篡改HMAC对称加密裸用

七、为什么"别自己造" ​

风险说明
模式错误ECB 模式、无 IV、固定盐…
未知未知你不知道你不知道什么
维护负担密钥、轮换、标准演进

正确姿势:用标准库/成熟库(如 Node crypto、Python cryptography、Java JCA)的高层 API,不手工拼原语。


八、自检清单 ​

  • [ ] 能一句话说清四个原语各解决什么
  • [ ] 能解释"为什么需要非对称来解决对称的密钥分发"
  • [ ] 知道密码哈希与完整性哈希的区别
  • [ ] 能说出签名与 HMAC 的差异
  • [ ] 面对需求能落到"选哪个库/哪个原语"

九、常见误区 ​

误区事实
"哈希就是加密"哈希不可逆,加密可逆
"SHA-256 适合存密码"太快,要用慢哈希+盐
"签名能加密"签名只防篡改/认证来源,不保密
"自己实现更放心"密码学安全靠经过审计的标准实现
"公钥不能给别人"公钥本来就该公开,私钥才要保密

十、动手练习 ​

练习 A:看标准库用法 ​

用 Python cryptography 或 Node crypto 分别实现一次 AES 加密与一次签名,对比 API 和参数。

练习 B:验证慢哈希 ​

对同一个密码分别用 SHA-256 与 bcrypt 哈希,对比耗时,体会"为什么密码要用慢哈希"。

练习 C:找反例 ​

搜索一次"自研加密被破解"的公开案例,总结它踩了哪个模式/原语的坑。


相关文档 ​

本区 ​

其他域 ​