2009-04-22 67 views
2

全部,在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中的二进制文件?

非常感谢提前!

回答

1

我记得我曾经在这种事情上甩头的日子。我建议你升级到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> 
0

我假设你有范围,以改变DB ......更具体的存储过程?

为什么不只是将散列接受为字符串,而是将它CAST到SProc中的varbinary?

进一步阅读,没有内置的字符串 - > VARBINARY功能在SQL Server中,但是this function已提供作为一个简单的解决方案,

+0

在VBScript中进行转换也很容易,并且您可以在升级到较新的UI技术时保持数据库接口清洁。 – 2009-04-22 11:59:16

0

也许有点风马牛不相及,但我想知道,如果你是在客户端腌制哈希,你如何保持盐的安全?

+1

我的理解是,保护盐并非至关重要 - 它会阻止任何人使用预先定义的散列密码列表来密码。换句话说,如果有人得到了我的盐,他们可以创建一个新的每个可能的密码+我的盐的哈希版本的字典,但这是非常耗时的,以致不值得付出努力。当然,我不是专家,所以请带上一点盐。 ;-) – mattstuehler 2009-10-22 18:06:40