1. MySQL密码加密与查询解决方案深度解析
在数据库安全管理中,密码字段的处理一直是开发者的重点关注领域。最近接手一个用户管理系统改造项目时,我发现原有系统竟然采用明文存储用户密码,这种"裸奔"式的存储方式让我惊出一身冷汗。本文将分享我在MySQL中实现密码安全存储与验证的完整解决方案,这套方案已在多个生产环境稳定运行三年以上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 密码存储方案选型
2.1 常见加密方式对比
在MySQL中处理密码字段时,我们主要有以下几种选择:
-
单向哈希(推荐):
- 使用SHA2、MD5等算法(MD5已不推荐)
- 特点:不可逆,相同输入永远产生相同输出
- 适用场景:仅需验证密码正确性时
-
双向加密:
- 使用AES_ENCRYPT/AES_DECRYPT函数
- 特点:可逆加密,需要密钥管理
- 适用场景:需要还原原始密码时
-
加盐哈希:
- 哈希值+随机盐值组合
- 特点:防彩虹表攻击
- 适用场景:高安全性要求的系统
重要提示:除非业务特殊要求,否则永远不要存储可还原的密码!大多数情况下应选择单向哈希方案。
2.2 生产环境推荐方案
基于OWASP最新建议,我采用的组合方案是:
sql复制SHA2(CONCAT(password, salt), 256)
其中salt是每个用户注册时随机生成的16位字符串,与哈希结果一起存储。这种方案有效防御了:
- 彩虹表攻击(通过唯一salt)
- 碰撞攻击(使用SHA2-256)
- 重放攻击(每次登录生成新token)
3. 具体实现步骤
3.1 数据库表设计
sql复制CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL,
`password_hash` CHAR(64) NOT NULL COMMENT 'SHA2-256结果',
`salt` CHAR(16) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY
