2009-04-22 6 views
2

Alle,Handhabung gehasht Passwörter als varbinary in SQL Server gespeichert und klassischen ASP

leider im Voraus - ich bin ein Neuling in den meisten der unten aufgeführten Themen (SQL, ASP). Anyway ...

Ich habe eine ziemlich einfache Web-App, die Benutzer mit einem Benutzernamen und einem Passwort anmelden müssen.

Das Front-End erstellt einen gesalzenen SHA1-Hash des Kennworts und sendet es (zusammen mit dem Benutzernamen) an eine ASP-Seite.

Diese ASP-Seite übernimmt die Daten, ruft eine gespeicherte Prozedur in der SQL Server-Datenbank auf und übergibt den Benutzernamen und das Hash-Kennwort; Die gespeicherte Prozedur schreibt die Informationen in die Tabelle 'Benutzer'.

Der Typ der Kennwortspalte in der Tabelle ist varbinary.

Soweit ich sagen kann, wenn der ASP das Passwort (Passwort = Request.Form ("Passwort") erhält), ist es ein String.

ich kann 'Trick' SQL Server in sie als varbinary Handhabung, wenn ich die Abfrage auf diese Weise erstellen:

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

IOW - ich bin eine "0x" vor der Passwort-Zeichenfolge.

Allerdings habe ich gelesen, dass es eine bessere Praxis ist eine parametrisierte Abfrage zu verwenden:

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

Dies schlägt jedoch fehl, weil der Parameter binär (204) sein soll, aber das Passwort eine Zeichenkette ist.

Also, wie konvertiere ich eine Zeichenfolge wie "4a5e6a8d521ed487b81c91e131cf27e8dae9b783" in eine binäre in ASP?

Vielen Dank im Voraus!

Antwort

1

Ich erinnere mich an die Tage, als ich mir bei solchen Dingen den Kopf zerbrach. Ich schlage vor, Sie ein Upgrade auf ASP.Net, aber in der Zwischenzeit den folgenden Code (VBScript) sollte das tun, was Sie wollen:

<% 

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

Ich nehme an, Sie haben den Umfang DB zu ändern ... genauer gesagt die Gespeicherte Prozedur?

Warum akzeptieren Sie nicht einfach den Hash als Zeichenfolge und CAST es zu varbinary innerhalb der SProc?

weiter Lesen, gibt es keine integrierte String -> Varbinary-Funktion in SQL Server, aber this function hat als einfache Lösung angeboten,

+0

Es ist genauso einfach, die Konvertierung in VBScript durchzuführen, und auf diese Weise können Sie Ihre Datenbankschnittstelle sauber halten, wenn Sie auf eine neuere UI-Technologie aktualisieren. –

0

Vielleicht ein bisschen nicht verwandten, aber ich frage mich, wenn Sie den Hash auf dem Client salzen, wie halten Sie das Salz gerade sicher?

+1

Mein Verständnis ist, dass es nicht kritisch ist, das Salz zu sichern - der Punkt des Salzens von Passwörtern es, dass es jemanden daran hindert, eine vordefinierte Liste von Hash-Passwörtern zu verwenden.Mit anderen Worten, wenn jemand mein Salz bekommen würde, könnten sie dann ein NEUES Wörterbuch von Hash-Versionen jedes möglichen Passwortes und meines Salzes erstellen, aber das ist ausreichend zeitaufwendig, um es die Mühe nicht wert zu machen. Natürlich bin ich kein Experte, also nimm das mit einem Körnchen Salz. ;-) – mattstuehler

Verwandte Themen