核心概念:明文、密文、密钥、加密算法
说实话,我第一次正式接触加密,是刚工作那会儿维护一个老系统。那个系统直接把用户身份证号存在数据库里,连个模糊处理都没有。老板问我:“这算不算明文?” 我说:“算,而且是裸奔的那种。”
后来我花了很大力气去补这块知识。今天咱们就把加密最底层的四个概念捋清楚。你懂了这四个,加密的大门就算踹开了。
明文与密文:数据的两副面孔
明文(Plaintext)是可读的原始数据。任何你能看得懂的,都叫明文。比如一段文本“Hello World”,一个字段“13800138000”,或者一张图片的像素值。
密文(Ciphertext)是加密后的产物。它看起来像一堆乱码。不可读,不可用。只有拿着正确的密钥才能把它变回去。
我经常跟团队说:“明文是裸奔,密文是穿盔甲。”
举个例子:
- 明文:用户邮箱
alice@example.com - 加密后变成密文:
7c4a8d09ca3762af61e59520943dc26494f8941b
前者谁都能看懂。后者...你试试看?别说看懂了,连它是邮箱还是手机号都猜不出来。这就是密文的意义。
加密算法:核心的转换规则
加密算法定义了怎么把明文变成密文。它是一组数学操作和逻辑规则。
没有算法,你没法加密。但算法本身不是秘密。真正现代加密体系里,算法通常是公开的。比如 AES、RSA、SM4,这些算法标准都在网上挂着,谁都能看。
你可能会问:“算法都公开了,那加密还有什么用?” 好问题。答案就在下一个概念里。
密钥:真正的秘密
算法决定“怎么转换”,密钥决定“转换成什么样子”。
同一个算法,用不同的密钥加密同样的明文,会得到完全不同的密文。
我举个例子:
- 明文:
“123456” - 算法:AES-256
- 密钥 A:
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 - 密钥 B:
z9y8x7w6v5u4t3s2r1q0p9o8i7u6y5t4
加密结果:
| 密钥 | 密文(Base64 编码) |
|---|---|
| 密钥 A | U2FsdGVkX1+6G5Q8z3P9vA== |
| 密钥 B | U2FsdGVkX1+2bQ7p4M6r9w== |
看到了吧?明文相同,算法相同,但密文完全不同。这就是密钥的作用。你想想看,密钥就是打开保险箱的那把钥匙。保险箱本身(算法)所有人都知道构造,但你没钥匙就是打不开。
加密与解密:互逆的过程
加密:明文 + 密钥 → 密文
解密:密文 + 密钥 → 明文
这两个过程是对称的。用同一个密钥把明文锁起来,再用同一个密钥打开。
来,看代码
下面是个最简单的例子。我用 Python 的 cryptography 库,演示 AES 对称加密的完整流程:
from cryptography.fernet import Fernet
# 生成密钥(这一步只做一次)
key = Fernet.generate_key()
cipher = Fernet(key)
# 明文
plaintext = b"Hello, field-level encryption!"
# 加密
ciphertext = cipher.encrypt(plaintext)
print("密文:", ciphertext)
# 解密
decrypted_text = cipher.decrypt(ciphertext)
print("解密后:", decrypted_text.decode())
输出:
密文: b'gAAAAABmYzVh...(一堆乱码)'
解密后: Hello, field-level encryption!
你看,加密后的密文完全不可读。解密后一切又恢复原样。整个流程干净利落。给字段加密,说白了就是上面这几步。
回到字段级加密的场景
在数据库里做字段级加密,通常是什么样子?我拿一个具体的用户表来举例:
| 字段 | 原始值(明文) | 加密后(密文示例) |
|---|---|---|
| alice@example.com | 7c4a8d09ca3762af61e59520943dc26494f8941b | |
| phone | 13800138000 | e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4 |
| id_card | 110101199001011234 | d41d8cd98f00b204e9800998ecf8427e22c6c3f4 |
应用层拿着密钥,可以解密某个字段。数据库本身存的永远是密文。哪怕 DBA 直接把表导出,看到的也只是乱码。这就是字段级加密的实质。
一个完整的加密解密流程图
我画了张图,把整个流程串起来。你一看就明白了。
这四者的关系,我帮你理一下
- 明文:你来保护的数据,比如用户身份证、手机号、银行卡号。
- 密文:经过加密后的混淆形态,别人拿到也没用。
- 加密算法:转换规则,公开透明,经得起考验。
- 密钥:真正的秘密。算法可以公开,密钥必须保密。
我曾经见过一个项目,开发人员直接用“HelloWorld”作为加密密钥。密钥就硬编码在代码里。这叫啥?这叫守着金库开大门。你既然花了功夫做加密,就别在密钥管理上偷懒。后边我会专门讲怎么生成和保管密钥,这里你先记住:密钥的质量,直接决定你的加密效果。