在SQL Server和经典ASP中处理以varbinary存储的哈希密码
全部,在SQL Server和经典ASP中处理以varbinary存储的哈希密码
对不起 - 我是下面大多数主题(SQL,ASP)的新手。反正...
我有一个要求用户提供用户名和密码登录一个非常简单的Web应用程序。
前端创建密码的盐渍SHA1哈希值,并将其发布(与用户名一起)的ASP页面。
那ASP页面获取数据,调用在SQL Server数据库的存储过程,并通过用户名和散列密码;存储过程将信息写入“用户”表。
表中的密码列的类型是varbinary。
至于我可以告诉大家,当ASP获取密码(password =的Request.Form( “密码”)),它是一个字符串。
我可以 '绝招' 的SQL Server为处理它作为VARBINARY如果我创建查询是这样的:
查询= “EXEC sp_save_user @用户名= '” &用户名& “',@密码= 0X” &密码
督察 - 我的前面加上“0X”的口令字符串。
不过,我读过,这是一个更好的做法是使用参数化查询:
例如:SET objParam = objCommand.CreateParameter( “@密码”,204,1,40,密码)
但是,这是因为该参数应该是二进制(204),但密码是字符串。
那么,如何将“4a5e6a8d521ed487b81c91e131cf27e8dae9b783”这样的字符串转换为ASP中的二进制文件?
非常感谢提前!
我记得我曾经在这种事情上甩头的日子。我建议你升级到ASP.Net,但在平均时间将下面的代码(VBScript)的应该做你想要什么:
<%
Dim result
main()
function main()
Dim userName : userName = "Martin"
Dim data : data = "4a5e6a8d521ed487b81c91e131cf27e8dae9b783"
Dim db: Set db = Server.CreateObject("ADODB.Connection")
db.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=password1;Initial Catalog=Test;Data Source=(local)"
Dim cmd : Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = db
cmd.CommandText = "dbo.[sp_save_user]"
cmd.CommandType = 4
cmd.Parameters.Append cmd.CreateParameter("@UserName", 200, 1, 50, userName)
Dim bytes : bytes = stringToBinary(data)
cmd.Parameters.Append cmd.CreateParameter("@Password", 204, 1, LenB(bytes), bytes)
cmd.Execute()
db.Close
result = "done"
end function
function stringToBinary(str)
dim ahex
for i=0 to len(str) - 1 step 2
Dim strDigit1
Dim strDigit2
strDigit1 = Ucase(Mid(str, i+1, 1))
strDigit2 = Ucase(Mid(str, i+2, 1))
Dim byteDigit1
Dim byteDigit2
byteDigit1 = InStr("ABCDEF", strDigit1) - 1
byteDigit2 = InStr("ABCDEF", strDigit2) - 1
ahex = ahex & ChrB((byteDigit1 * 16) + byteDigit2)
next
stringToBinary = ahex
end function
%>
<html>
<head>
<title>Test</title>
</head>
<body>
<h1><%= result %></h1>
</body>
</html>
我假设你有范围,以改变DB ......更具体的存储过程?
为什么不只是将散列接受为字符串,而是将它CAST到SProc中的varbinary?
进一步阅读,没有内置的字符串 - > VARBINARY功能在SQL Server中,但是this function已提供作为一个简单的解决方案,
也许有点风马牛不相及,但我想知道,如果你是在客户端腌制哈希,你如何保持盐的安全?
我的理解是,保护盐并非至关重要 - 它会阻止任何人使用预先定义的散列密码列表来密码。换句话说,如果有人得到了我的盐,他们可以创建一个新的每个可能的密码+我的盐的哈希版本的字典,但这是非常耗时的,以致不值得付出努力。当然,我不是专家,所以请带上一点盐。 ;-) – mattstuehler 2009-10-22 18:06:40
在VBScript中进行转换也很容易,并且您可以在升级到较新的UI技术时保持数据库接口清洁。 – 2009-04-22 11:59:16