0

0

SQL 数据加密存储方法与案例

舞夢輝影

舞夢輝影

发布时间:2026-02-23 21:06:10

|

611人浏览过

|

来源于php中文网

原创

mysql中aes_encrypt返回blob导致乱码,需用to_base64()存储、from_base64()还原后解密;密钥长度必须为16/24/32字节,否则静默返回null;推荐使用确定性哈希辅助查询,避免加密字段直接where。

sql 数据加密存储方法与案例

MySQL 中用 AES_ENCRYPT 存敏感字段,但查出来是乱码?

不是加密失败,是默认返回 BLOB 类型,直接 SELECT 会显示十六进制或乱码。必须显式转成可读格式,比如用 HEX()TO_BASE64() 存,对应用 UNHEX() / FROM_BASE64() 解。

  • 存的时候别直接 INSERT INTO user (pwd) VALUES (AES_ENCRYPT('123', 'key')),而要写成 INSERT INTO user (pwd) VALUES (TO_BASE64(AES_ENCRYPT('123', 'key')))
  • 查的时候得先还原再解密:SELECT AES_DECRYPT(FROM_BASE64(pwd), 'key') FROM user
  • 密钥长度必须是 128/192/256 位(即 16/24/32 字节),传错长度会静默失败,返回 NULL —— 这是最常踩的坑
  • AES_ENCRYPT 默认用 AES-128-CBC,不带 IV;如果需要更安全的随机 IV,得自己生成并拼接存储,MySQL 原生不支持自动管理 IV

PostgreSQL 里 pgcrypto 的 encrypt() 总报 “wrong key length”

因为 encrypt() 要求密钥必须是二进制字节流,不是字符串。你传 'mykey',它按 UTF8 算长度是 5 字节,但 AES-128 要 16 字节,直接报错。

  • 正确做法是用 convert_to('mykey', 'utf8') + md5() 截取,或者更稳妥地用 digest('mykey', 'sha256') 得到 32 字节密钥
  • 加密函数推荐用 pgp_sym_encrypt(),它自动处理密钥派生、IV、填充和 Base64 编码,存出来就是可读字符串,不用手动转码
  • pgp_sym_encrypt('data', 'key', 'cipher-algo=aes256') 比裸用 encrypt() 更适合业务场景,但注意它依赖 pgcrypto 扩展已启用

SQLite 没内置加密函数,真要加怎么办?

官方 SQLite 不支持透明加密,sqlite3 命令行工具也无 AES_ENCRYPT。所谓“加密 SQLite”基本靠三类方案:应用层手动加解密、第三方扩展(如 SQLCipher)、或文件系统级加密。

Extjs简单版酒店管理系统  bulid 081016
Extjs简单版酒店管理系统 bulid 081016

该系统采用VS2005+SQL2000+Extjs2.0开发由于学extjs 一月不到 属初学者,项目有很多不足地方请见谅(注释不标准按自己想法随意注释了一下)数据库脚本:压缩包目录下.DB.sql便是该项目为双用户:管理员 与营业员 角色登陆显示不同信息数据库方面一小部分功能运用存储过程或者直接附加DB_51aspx下Sql数据库文件

下载
  • 别在 SQL 里写 ENCRYPT(data, key) —— 这语法根本不存在,会报 no such function: ENCRYPT
  • SQLCipher 是最常用选择,但它是独立编译版本,普通 pip install pysqlite3 不带它;要用就得装 sqlcipher3 包,并用 PRAGMA key = 'x'xx' 开启
  • 如果只是临时保护配置字段,建议在应用代码里用 Python 的 cryptography 库做 AES-GCM 加密,存进 TEXT 字段,比折腾数据库扩展更可控

加密后 WHERE 查询变慢,甚至没法走索引?

对加密字段做 WHERE encrypted_col = AES_ENCRYPT(?, ?) 看似合理,实际等于每次查询都重新加密一次,还无法利用索引 —— 因为加密结果依赖 IV 或随机盐,相同明文加密后值不同。

  • 想按加密字段查,唯一靠谱方式是确定性加密(如 AES-SIV 或 HMAC+AES),但主流数据库都不原生支持;MySQL 8.4+ 的 AES_ENCRYPTMODE=ECB 虽然确定性,但 ECB 极不安全,别用
  • 常见折中:把关键查询字段(如手机号)额外存一个加盐哈希(SHA2(CONCAT(phone, salt))),用于等值查找,加密字段只存完整敏感内容
  • 记住:加密不是索引友好操作。一旦字段加密了,就默认它只能做「取出来再解密后处理」,别指望在数据库里高效过滤

密钥轮换、字段粒度控制、加密与业务逻辑耦合程度——这些才是上线后真正卡住手脚的地方,比选哪个函数难得多。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1026

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

335

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

379

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1802

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

377

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1374

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

437

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1127

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9.6万人学习

Django 教程
Django 教程

共28课时 | 4.5万人学习

Excel 教程
Excel 教程

共162课时 | 18.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号