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!

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top