【MySQL】MySQL数据库中密码加密和查询的解决方案

本篇博客是为了记录自己在遇到password函数无法生效时的解决方案。通过使用AES_ENCRYPT(str,key)和AES_DECRYPT(str,key)进行加密和解密。

一、问题

自己想创建一个user表,user表中有一个password属性列,自己想对密码进行加密后再存入数据库,于是想到了之前学到的一个函数password函数,但在使用时给我报了下面这个奇怪的错误:

一开始我还觉得是不是我的插入的sql语句写的有问题,后来才知道在 MySQL 8.0中,PASSWORD()函数已被弃用于是又查了自己系统中的MySQL版本,发现果然是8.0以后的版本。

二、解决方案

为了实现在MySQL数据库中保存加密后的密码,自己使用了AES_ENCRYPT(str,key)函数进行加密,在存入数据库的时候,转成十六进制。str:要加密的字符串,key:用于加密的密钥字符串。AES_ENCRYPT()函数返回一个二进制字符串,表示加密后的密文。如果参数为NULL,则返回NULL

下面是一段实例代码:

cpp 复制代码
bool insert(Json::Value &user) // 注册时新增用户
    {
        Json::Value val;
        //用户查找函数,如果用户已经存在了就不再插入数据库
        bool ret = select_by_name(user["username"].asCString(), val);
        if(ret)
        {
            //日志打印函数
            LOG(DEBUG, "user %s exists!, insert failed\n", user["username"].asCString());
            return false;
        }
        char sql[1024] = {0};
        #define INSERT_T "insert into user values(null, '%s',hex(aes_encrypt(('%s'),'mima')), 1000, 0, 0);"
        sprintf(sql, INSERT_T, 
        user["username"].asCString(), user["pass"].asCString());
        //封装的mysql执行函数
        ret = mysql_util::mysql_exec(_mysql, sql);
        if(!ret)
        {
            LOG(ERROR, "insert user failed\n");
            return false;
        }
        return true;
    }

密码就被加密后转换成十六进制存入数据库了。

解密函数 AES_DECRYPT(str,key),AES_DECRYPT和AES_ENCRYPT的key要相同,解密之前先用huhex函数转一次。然而,这里有一个问题:AES_DECRYPT返回的是二进制数据,而你可能希望看到解密后的明文字符串。由于MySQL的字符串处理函数通常期望输入是有效的字符编码,直接显示二进制数据可能会导致乱码。为了解决这个问题,你可以将解密后的二进制数据转换为十六进制字符串进行查看(但这不是真正的解密后的明文),你看到的实际上也就是十六进制数据。

如果你只是想在MySQL中查看解密后的明文(假设明文是有效的UTF-8),你可以尝试使用CONVERT()函数将二进制数据转换为字符类型,但这只有在解密后的数据确实是有效的字符编码时才会工作:

sql 复制代码
SELECT CONVERT(AES_DECRYPT(UNHEX(pass), '112233') USING utf8) AS deccrypted_pass_str from user where username='小彬';

using utf8部分应该与你的数据库或表的字符集设置相匹配。如果解密后的数据不是有效的UTF-8编码,这个查询可能会失败或返回乱码。

相关推荐
rising start7 小时前
二、全面理解MySQL架构
mysql·架构
星星也在雾里8 小时前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
candyTong8 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
bqq198610268 小时前
MySQL性能优化
mysql·mysql优化
GetcharZp9 小时前
GitHub 2.4 万 Star!D2 正在重新定义程序员画图方式
后端
雨辰AI9 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城202410 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有10 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao10 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_7488394910 小时前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库