2

全部,

提前抱歉 - 我是以下大多数主题(SQL、ASP)的新手。反正...

我有一个非常简单的网络应用程序,它要求用户使用用户名和密码登录。

前端创建密码的加盐 SHA1 哈希,并将其(连同用户名)发布到 ASP 页面。

该 ASP 页面获取数据,调用 SQL Server 数据库中的存储过程,并传递用户名和散列密码;存储过程将信息写入“用户”表。

表中密码列的类型是 varbinary。

据我所知,当 ASP 获得密码 (password = Request.Form("password")) 时,它是一个字符串。

如果我以这种方式创建查询,我可以“欺骗”SQL Server 将其作为 varbinary 处理:

query = "EXEC sp_save_user @username='" & 用户名 & "', @password=0x" & 密码

IOW - 我在密码字符串前面加上“0x”。

但是,我读过使用参数化查询是一种更好的做法:

例如: SET objParam = objCommand.CreateParameter("@password",204, 1, 40, 密码)

但是,这会失败,因为参数应该是二进制 (204),但密码是字符串。

那么,如何在 ASP 中将“4a5e6a8d521ed487b81c91e131cf27e8dae9b783”之类的字符串转换为二进制文件?

提前谢谢了!

4

3 回答 3

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("0123456789ABCDEF", strDigit1) - 1
        byteDigit2 = InStr("0123456789ABCDEF", 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>
于 2009-04-22T11:29:01.527 回答
0

我假设您有更改数据库的范围......更具体地说是存储过程?

为什么不直接接受哈希作为字符串并将其转换为 SProc 中的 varbinary?

进一步阅读,SQL Server 中没有内置的 String -> Varbinary 函数,但这个函数是作为一个简单的解决方案提供的,

于 2009-04-22T11:43:40.603 回答
0

也许有点无关,但我想知道,如果你在客户端上加盐,你是如何保证盐安全的?

于 2009-10-22T08:24:31.380 回答