编码与加密
这一类的混乱几乎都来自名词:把 Base64 当加密、把 MD5 当加密、把「加密」当成一个动作而不是三类操作。实际上它们是三个不同的问题 —— 编码解决「怎么把字节变成文本」,哈希解决「这两个东西是不是同一个」,加密解决「别人能不能读到」。
把这三件事分清之后,剩下的是参数选择:AES 用哪个模式、密码哈希用哪个算法、密钥长度够不够。这些有明确答案,文章里都给了默认值和理由。
- Base64 不是加密:什么时候该用,什么时候不该用Base64 是可逆编码,不是加密算法。这篇讲清它的编码原理、体积开销、与 Base64URL 的区别,以及哪些场景可以用、哪些场景用了等于裸奔。
- 密码该用 bcrypt 还是 SHA-256SHA-256 每秒能算几十亿次,用它存密码等于没加密。讲清「慢哈希」为什么必须慢、bcrypt 的 cost 与 72 字节限制、加盐防的是什么,以及文件校验为什么反过来要用 SHA-256。
- MD5、SHA-1、SHA-256、SHA-512 到底该选哪个从碰撞攻击的工程现状出发,讲清 MD5/SHA-1/SHA-2/SHA-3 的安全边界、输出长度与适用场景,以及为什么密码必须改用 Argon2id 或 bcrypt 而不能用任何快速哈希。
- 怎么生成和保存一个真正安全的密码用信息熵解释为什么长度比符号重要,给出各类密码的熵对照表、NIST SP 800-63B 的关键建议、密码短语的生成代码,以及服务端应该用什么算法存、不该用什么算法存。
- 对称与非对称加密:什么时候用哪个AES 和 RSA 不是「新的替旧的」关系,它们解决不同问题。讲清对称加密的三种模式该怎么挑、非对称只适合做什么、混合加密为什么是现实标准,以及国密 SM2/SM4 的位置。
- UUID v4 和 v7 该选哪个做数据库主键从 RFC 9562 定义的位布局讲起,说明 UUIDv7 的时间前缀为什么能改善 B 树索引的写入局部性,以及它带来的时间泄露代价,并给出 PostgreSQL 18 与 MySQL 的具体落地写法。
- JWT 是什么?三分钟看懂并学会本地调试 Token用最直白的方式讲清 JWT 的结构、签名原理和常见安全隐患,并说明怎么在不泄露密钥的前提下本地解析和调试一个 Token。
这一类常见问题
我的场景到底该用哪一个?
问两个问题:数据需要还原吗(需要 → 加密,不需要 → 哈希);需要防止被篡改吗(需要 → 带认证的模式或签名)。密码是特例:既不是普通哈希也不是加密,而是「故意很慢的哈希」。
这些工具能直接处理生产密钥吗?
计算都在浏览器本地完成、不会上传,但浏览器标签页仍是共享环境。生产密钥建议用本地 CLI 处理,网页工具适合验证算法与排查「两边算出来不一样」。