为什么unhex(十进制的原密码)之后,密码验证通过,而用unhex(16进制的加密密码)...

为什么unhex(十进制的原密码)之后,密码验证通过,而用unhex(16进制的加密密码)...

为什么unhex(十进制的原密码)之后,密码验证通过,而用unhex(16进制的加密密码),密码验证不通过?

unhex里不是应该放十六进制数吗?

import mysql.connector
config={
   "host":"localhost",
   "port":"3306",
   "user":"root",
   "password":"111111",
   "database":"vega"
}
con=mysql.connector.connect(**config)
# username="1 or 1=1"
# password="1 or 1=1"

username="admin"
password="123456"
sql="select count(*) from t_user where user_name=%s"\
   " and aes_decrypt(unhex(password),'HelloWorld')=%s";
cursor=con.cursor()
cursor.execute(sql,(username,password))
#execute传入的第二个参数是元组
# print(cursor.fetchone())
print(cursor.fetchone()[0])
con.close()

http://img1.sycdn.imooc.com//climg/5ed8b44409ad02d313380845.jpghttp://img1.sycdn.imooc.com//climg/5ed8b4a60902d89815330743.jpghttp://img1.sycdn.imooc.com//climg/5ed8b47d0946f88c15100570.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学,你好。表中存储的password是加密之后的数据,在sql语句中根据查询到的password解密后与传入的password进行判断,值并不相等,因此是取不到对应数据的。

http://img1.sycdn.imooc.com//climg/5ed8c03309ae5b5208380105.jpg

同学在查询时去掉解密语句,直接使用提供的password查询即可

http://img1.sycdn.imooc.com//climg/5ed8c1000983c7cf07950272.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

  • 慕粉1504263447 提问者 #1
    没看懂。AES_DECRYPT不是解密吗?sql语句没有加密而是解密啊。使用AES_DECRYPT函数不是解密吗? 然后这里也不理解,把十进制的123456转成非16进制,再进行解密,这是什么操作? password="123456" sql="select count(*) from t_user where user_name=%s"\ " and aes_decrypt(unhex(password),'HelloWorld')=%s";
    2020-06-04 17:56:52
好帮手慕美 2020-06-04 18:27:14

同学,你好。

1、AES_DECRYPT是解密,非常抱歉,已对之前的回答进行修改

2、aes_decrypt(unhex(password),'HelloWorld')是表中查询的用户名对应的password,在存储时是十六进制的,需要使用unhex()转换为二进制后再进行解密,根据解密后的数据与传入的password参数值判断是否相等。传入的password值是等号右边的值,而不是等号左边的

http://img1.sycdn.imooc.com//climg/5ed8cc7e09beefdb08240144.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

  • 提问者 慕粉1504263447 #1
    明白了,谢谢老师耐心回复
    2020-06-04 18:36:43
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师