在数据库中“对 Column(列)加密”通常有几种做法,取决于你用的数据库类型、安全需求和性能要求。下面我按常见场景系统讲一下。
原理:在写入数据库前,在应用代码里加密;读取后再解密。
// 加密
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
byte[] encrypted = cipher.doFinal(plainText.getBytes());
// 存储 encrypted(BLOB / VARCHAR)
✅ 优点
❌ 缺点
ALTER TABLE user ENCRYPTION='Y';
⚠️ 这是对“整个表”加密,不是单列。
SELECT AES_ENCRYPT('123456', 'key');
❌ 密钥容易泄露,不安全和不规范。
CREATE EXTENSION pgcrypto;
INSERT INTO user (phone)
VALUES (pgp_sym_encrypt('13800000000', 'key'));
SELECT pgp_sym_decrypt(phone, 'key') FROM user;
✅ 优点:数据库内加密
❌ 缺点:密钥管理麻烦
CREATE COLUMN MASTER KEY ...
CREATE COLUMN ENCRYPTION KEY ...
CREATE TABLE User (
Phone VARCHAR(20)
ENCRYPTED WITH (
ENCRYPTION_TYPE = Deterministic,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
COLUMN_ENCRYPTION_KEY = CEK1
)
);
✅ 数据库也看不到明文
✅ 支持部分查询(Deterministic)
ALTER TABLE user
MODIFY (phone ENCRYPT USING 'AES256');
⚠️ 只防“硬盘被盗”,不防 DBA 看数据
| 场景 | 推荐方案 |
|---|---|
| 高安全、合规 | 应用层加密(SM4/AES) |
| SQL Server | Always Encrypted |
| PostgreSQL | pgcrypto |
| 只是防磁盘丢失 | TDE |
| 手机号 / 身份证 | 加密 + 脱敏 |
如果你告诉我:
我可以直接给你可落地的 SQL + 代码方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。