🗄️ 第六章 运用数据库-旨在安全运用
📄 一句话概括

加密=把明文按密钥搅成看不懂的乱码,解密=凭同一把密钥搅回来——密码、身份证号这类敏感数据不该以明文躺在库里。

📝 本节和前面几节的关系

6-4 权限防「不该看的人看」,但权限不是万能的:转储文件被拷走(6-7)、运维误看、库被拖走——数据本身裸奔时,谁都挡不住。加密是最后一层:就算整库被偷,没有密钥拿到的也是乱码。这也是本章「安全运用」拼图的最后一块实体防线。

一、两种场景

场景 做法 特点
可逆(要读回来) 加密存储,用时解密 密码外的敏感字段:身份证、银行卡、住址
不可逆(只需比对) 哈希后存储 登录密码:登录时把你输的也哈希一下,比对的两个哈希值相等即通过

密码为什么要哈希而不是加密:系统根本不需要知道你的原密码;可逆存储意味着密钥泄露=全部密码泄露,不可逆则偷到库也没用。

二、哈希的三个性质

  1. 同一输入必得同一输出(所以能比对)
  2. 输出看不出输入(乱码即乱码)
  3. 差之毫厘、输出面目全非(改一位密码,哈希值整个变)

三、动手 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」?——它存得着明文,说明根本没哈希,快跑。

五、常见误区

自测三问 1. 密码为什么用哈希不用加密?(系统只需比对无需还原;不可逆则密钥泄露也不泄密) 2. 哈希三性质中,「比对成立」靠哪一条?(同一输入必得同一输出) 3. 什么样的字段适合可逆加密?(身份证号等需要读回原文使用、但不能明文存储的敏感字段)

相关笔记