我毫无疑问做了一些愚蠢的事情,但我在这里挣扎!
升级用户表的安全性。使用内置hashbytes pw的sql转换所有现有密码,现在不使用salt,直到我可以使用它。
表:admin有4条记录
当前密码:admin.password ='test'
update admin
set passwordenc = hashbytes('SHA2_256', password);
passwordenc
的类型为varbinary(50)
。
立即进入:
admin.passwordenc is 0x9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08
这就是我想要的。
我有一个带登录名的.net cshtml网站,有些代码:
var uname = Request["username"];
var upass = Request["password"];
var adsql = "select user_id, firstname, surname, profile, username from admin where username=@0 and passwordenc= hashbytes('SHA2_256', @1) ";
找不到记录。
在Chrome中的开发工具中,我可以看到“admin”传递用户名,“test”用于输入密码。
SQL Server Profiler显示:
exec sp_executesql N'select user_id, firstname, surname, profile, username from admin where username=@0 and passwordenc= hashbytes(''SHA2_256'', @1) ',
N'@0 nvarchar(5),@1 nvarchar(4)',@0=N'admin',@1=N'test'
在我的应用中,如果我试试这个:
var adsql = "select user_id, firstname, surname, profile, username from admin where username=@0 and passwordenc=hashbytes('SHA2_256', '"+ upass+"') ";
有效。
个人资料日志
exec sp_executesql N'select user_id, firstname, surname, profile, username from admin where username=@0 and passwordenc=hashbytes(''SHA2_256'', ''test'') ',N'@0 nvarchar(5),@1 nvarchar(4)',@0=N'admin',@1=N'test'
同样,如果我这样做
var adsql = "select user_id, firstname, surname, profile, username from admin where username=@0 and passwordenc= 0x9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08 ";
传递硬编码哈希它也有效。
因此,在非参数化中传递'test'是有效的,检查哈希也是如此,但@ 1没有,并且在分析器中看不到现在的错误。尝试过使用转换函数,尝试使用二进制文件检查字符串但得到相同的结果。
我做错了什么蠢事?