📄 一句话概括
加密=把明文按密钥搅成看不懂的乱码,解密=凭同一把密钥搅回来——密码、身份证号这类敏感数据不该以明文躺在库里。
📝 本节和前面几节的关系
6-4 权限防「不该看的人看」,但权限不是万能的:转储文件被拷走(6-7)、运维误看、库被拖走——数据本身裸奔时,谁都挡不住。加密是最后一层:就算整库被偷,没有密钥拿到的也是乱码。这也是本章「安全运用」拼图的最后一块实体防线。
一、两种场景
| 场景 | 做法 | 特点 |
|---|---|---|
| 可逆(要读回来) | 加密存储,用时解密 | 密码外的敏感字段:身份证、银行卡、住址 |
| 不可逆(只需比对) | 哈希后存储 | 登录密码:登录时把你输的也哈希一下,比对的两个哈希值相等即通过 |
密码为什么要哈希而不是加密:系统根本不需要知道你的原密码;可逆存储意味着密钥泄露=全部密码泄露,不可逆则偷到库也没用。
二、哈希的三个性质
- 同一输入必得同一输出(所以能比对)
- 输出看不出输入(乱码即乱码)
- 差之毫厘、输出面目全非(改一位密码,哈希值整个变)
三、动手 Demo:密码哈希的纸面演示
-- 建用户表,密码列存哈希不存明文
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
pwd_hash TEXT -- 存的是哈希值,不是密码
);
-- 注册:应用层把 'mypassword' 哈希后存入(示意值)
INSERT INTO users VALUES (1, '波仔', 'a3f5e9...');
-- 登录:把你现在输的密码同样哈希,比对
-- 输 'mypassword' → 哈希 = 'a3f5e9...' → 相等 → 通过
-- 输 'MyPassword' → 哈希 = '77b2c0...' → 不等 → 拒绝(性质3:差一位全变)
SELECT * FROM users WHERE name = '波仔' AND pwd_hash = 'a3f5e9...';
【准备块】在线 SQLite 运行器可跑表结构与比对查询;真正的哈希计算在应用层(如 Python hashlib),SQL 里只存结果。
四、30 秒实验
在任一「MD5 在线计算器」输入 abc,再输入 abd:输出天差地别——亲手验证性质 3。再想:为什么网站发邮件说「您的密码是 XXX」?——它存得着明文,说明根本没哈希,快跑。
五、常见误区
- 「加密了就绝对安全」:密钥丢了/弱了/写进代码里上传了,加密形同虚设;密钥管理与算法同等重要
- 「哈希=加密的一种」:哈希不可逆,没有「解密哈希」这回事;所谓「MD5 破解」其实是拿彩虹表撞库
- 「只加密数据库文件就行」:整库加密(透明加密)与字段级加密是两道不同的锁,常需要配合使用
自测三问
1. 密码为什么用哈希不用加密?(系统只需比对无需还原;不可逆则密钥泄露也不泄密) 2. 哈希三性质中,「比对成立」靠哪一条?(同一输入必得同一输出) 3. 什么样的字段适合可逆加密?(身份证号等需要读回原文使用、但不能明文存储的敏感字段)- ☐ 下一节(6-9 版本升级-更新操作系统和软件的版本)
相关笔记
- 用户、权限-根据用户更改允许访问的范围 —— 权限之外的第二道实体防线
- 转储、还原-迁移数据 —— 明文转储文件的存在让加密更有必要
- 版本升级-更新操作系统和软件的版本 —— 下一节:补丁里常包括安全修复
- 🗄️ 数据库基础 · 索引 —— 全课路线图