Обработка хешированных паролей, хранящихся как varbinary в SQL Server и классическом ASP - PullRequest
2 голосов
/ 22 апреля 2009

All

Извините заранее - я новичок в большинстве тем ниже (SQL, ASP). Во всяком случае ...

У меня есть довольно простое веб-приложение, которое требует от пользователей входа в систему с именем пользователя и паролем.

Внешний интерфейс создает соленый SHA1-хэш пароля и публикует его (вместе с именем пользователя) на странице ASP.

Эта ASP-страница принимает данные, вызывает хранимую процедуру в базе данных SQL Server и передает имя пользователя и хешированный пароль; хранимая процедура записывает информацию в таблицу 'users'.

Тип столбца пароля в таблице - varbinary.

Насколько я могу судить, когда ASP получает пароль (password = Request.Form ("password")), это строка.

Я могу «обмануть» SQL Server для обработки его как varbinary, если я создаю запрос следующим образом:

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

IOW - я добавляю "0x" к строке пароля.

Однако я читал, что лучше использовать параметризованный запрос:

Например: SET objParam = objCommand.CreateParameter ("@ пароль", 204, 1, 40, пароль)

Однако это не удается, поскольку параметр должен быть двоичным (204), а пароль - строка.

Итак, как мне преобразовать строку типа "4a5e6a8d521ed487b81c91e131cf27e8dae9b783" в двоичный файл в ASP?

Заранее большое спасибо!

Ответы [ 3 ]

1 голос
/ 22 апреля 2009

Я помню те дни, когда я бился головой об этом. Я предлагаю вам обновить до 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>
0 голосов
/ 22 октября 2009

Может быть, это немного не связано, но мне интересно, если вы солите хэш на клиенте, как вы в точности сохраняете соль?

0 голосов
/ 22 апреля 2009

Полагаю, у вас есть возможность изменить БД ... точнее, хранимую процедуру?

Почему бы просто не принять хеш в виде строки и передать его в varbinary внутри SProc?

Читая далее, в SQL Server нет встроенной функции String -> Varbinary, но эта функция была предложена как простое решение,

...