【问题标题】:Handling hashed passwords stored as varbinary in SQL Server and classic ASP处理在 SQL Server 和经典 ASP 中存储为 varbinary 的散列密码
【发布时间】:2009-04-22 04:37:45
【问题描述】:

全部,

提前抱歉 - 我是以下大多数主题(SQL、ASP)的新手。总之……

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

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

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

表中密码列的类型为varbinary。

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

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

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

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

但是,我了解到使用参数化查询是一种更好的做法:

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

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

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

非常感谢!

【问题讨论】:

    标签: sql-server asp-classic vbscript passwords varbinary


    【解决方案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>
    

    【讨论】:

      【解决方案2】:

      我假设您可以更改数据库...更具体地说是存储过程?

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

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

      【讨论】:

      • 在 VBScript 中进行转换同样容易,这样您就可以在升级到更新的 UI 技术时保持数据库界面整洁。
      【解决方案3】:

      可能有点不相关,但我想知道,如果您在客户端上对哈希进行加盐处理,您是如何确保加盐安全的?

      【讨论】:

      • 我的理解是,保护盐的安全并不重要——加盐密码的关键在于它会阻止任何人使用预定义的散列密码列表。换句话说,如果有人得到了我的盐,他们可以创建一个新字典,其中包含每个可能的密码 + 我的盐的散列版本,但这非常耗时,以至于不值得付出努力。当然,我不是专家,所以对此持保留态度。 ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2010-09-23
      • 1970-01-01
      • 2014-03-09
      相关资源
      最近更新 更多