如何使用MySQL查询语句进行解密操作?
解决MySQL AES_DECRYPT返回十六进制的问题
别急,我来帮你搞定这个解密的困扰!首先我们先搞清楚为什么你用AES_DECRYPT会返回十六进制格式——因为AES_ENCRYPT生成的是二进制字符串,当你直接查询AES_DECRYPT的结果时,MySQL会默认把二进制数据以十六进制的形式展示,所以需要显式转换成字符类型才能看到明文密码。
正确的解密查询语句
针对你的表结构,直接用CAST或者CONVERT就能解决问题,这里给你两种可行的写法:
写法1:使用CAST转换为字符类型
SELECT username, CAST(AES_DECRYPT(password, 'key1234') AS CHAR) AS decrypted_password FROM user WHERE username = 'userx';
写法2:使用CONVERT指定字符集(更稳妥)
如果你的数据库用的是utf8mb4这类字符集,指定字符集转换能避免乱码问题:
SELECT username, CONVERT(AES_DECRYPT(password, 'key1234') USING utf8mb4) AS decrypted_password FROM user WHERE username = 'userx';
登录环节更安全的验证方式
其实在登录时,完全不需要解密密码——你可以把用户输入的密码用同样的AES_ENCRYPT加密后,直接和数据库里的密文对比,这样既避免了解密操作,也更安全:
SELECT * FROM user WHERE username = 'userx' AND password = AES_ENCRYPT('用户输入的密码', 'key1234');
如果查询返回结果,说明密码正确;反之则验证失败。
关于你提到的SHA1算法的注意点
你说事后选择了SHA1,这里要提醒你:SHA1是哈希算法,不是加密算法,它是不可逆的——也就是说,你无法对SHA1生成的哈希值进行“解密”操作。
如果用SHA1实现登录验证,逻辑是:
- 注册时:存储
SHA1('用户密码')到数据库 - 登录时:计算用户输入密码的SHA1哈希,和数据库里的值对比:
SELECT * FROM user WHERE username = 'userx' AND password = SHA1('用户输入的密码');
为什么你之前的CAST无效?
大概率是字符集不匹配的问题——比如你的password字段存储时用的字符集和CAST转换时默认的字符集不一致,换成CONVERT指定和数据库一致的字符集(比如utf8mb4)就能解决。
内容的提问来源于stack exchange,提问作者DDC
相关产品推荐
相关产品推荐

