Manipulação de senhas hash armazenados como varbinary no SQL Server e ASP clássico
-
13-09-2019 - |
Pergunta
All,
Desculpe antecipadamente - Eu sou um novato na maioria dos tópicos abaixo (SQL, ASP). Enfim ...
Eu tenho uma aplicação web muito simples que requer os usuários façam login com um nome de usuário e senha.
A extremidade dianteira cria um hash SHA1 salgado da senha e mensagens de TI (juntamente com o nome do usuário) para uma página ASP.
Isso ASP página leva os dados, chama um procedimento armazenado no banco de dados SQL Server, e passa o nome de usuário e senha hash; o procedimento armazenado escreve a informação para a mesa 'usuários'.
O tipo da coluna Password na tabela é varbinary.
Tanto quanto eu posso dizer, quando o ASP recebe a senha (password = Request.Form ( "password")), é uma cadeia.
eu posso 'truque' SQL Server para manuseá-lo como um varbinary se eu criar a consulta desta forma:
query = "EXEC sp_save_user @ username = '" & nome de usuário & "', @ senha = 0x" e senha
IOW -. Estou prepending um "0x" a seqüência de senha
No entanto, eu li que é uma prática melhor usar uma consulta parametrizada:
Ex .: SET objParam = objCommand.CreateParameter ( "@ senha", 204, 1, 40, password)
No entanto, esta falha porque o parâmetro é suposto ser binário (204), mas a senha é uma string.
Então, como faço para converter uma string como "4a5e6a8d521ed487b81c91e131cf27e8dae9b783" a um binário no ASP?
Muito obrigado antecipadamente!
Solução
Eu me lembro dos dias em que eu usei para bater minha cabeça sobre este tipo de coisa. Eu sugiro que você receber um upgrade para ASP.Net, mas nesse meio tempo o código a seguir (VBScript) deve fazer o que quiser:
<%
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>
Outras dicas
Eu suponho que você tem espaço para mudar o DB ... mais especificamente o procedimento armazenado?
Porque não basta aceitar o hash como uma string e lançá-lo aos varbinary dentro do sproc?
leitura adicional, não há built-in String -> função Varbinary no SQL Server, mas esta função foi oferecido como uma solução fácil,
Talvez um pouco independentes, mas eu estou querendo saber, se você está salga o hash no cliente, como você está exatamente manter o sal é seguro?