2009-04-22 3 views
2

Все,Handling хэшируются пароли хранятся в виде VARBINARY в SQL Server и классический ASP

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

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

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

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

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

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

я могу 'трюк' SQL Server в обращении с ним как VARBINARY, если я создать запрос таким образом:

запрос = "EXEC sp_save_user @ имя пользователя = '" & имя пользователя & "', @ пароль = 0x" & пароль

IOW - Я добавляю строку «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

Я предполагаю, что у вас есть возможности для изменения БД ... более конкретно Хранимая процедура?

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

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

+0

Так же легко сделать преобразование в VBScript, и таким образом вы получите, чтобы ваш интерфейс базы данных был чистым, когда вы переходите на новую технологию пользовательского интерфейса. –

0

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

+1

Мое понимание заключается в том, что не обязательно защищать соль - точку соления паролей, чтобы она не позволяла кому-либо использовать предопределенный список хешированных паролей.Другими словами, если кто-то получил мою соль, они могли бы затем создать НОВЫЙ словарь хешированных версий всех возможных паролей + моя соль, но это достаточно трудоемко, чтобы не стоило усилий. Конечно, я не эксперт, поэтому возьмите это с солью. ;-) – mattstuehler

Смежные вопросы