문제

모두,

미리 죄송합니다. 저는 아래 주제(SQL, ASP) 대부분의 초보자입니다.그래도...

사용자가 사용자 이름과 비밀번호로 로그인해야 하는 매우 간단한 웹 앱이 있습니다.

프런트 엔드는 암호의 솔트된 SHA1 해시를 생성하고 이를 사용자 이름과 함께 ASP 페이지에 게시합니다.

해당 ASP 페이지는 데이터를 가져와 SQL Server 데이터베이스의 저장 프로시저를 호출하고 사용자 이름과 해시된 암호를 전달합니다.저장 프로시저는 'users' 테이블에 정보를 씁니다.

테이블의 비밀번호 열 유형은 varbinary입니다.

내가 알 수 있는 한, ASP가 비밀번호(password = Request.Form("password"))를 얻으면 문자열입니다.

다음과 같은 방식으로 쿼리를 생성하면 SQL Server를 varbinary로 처리하도록 '속일' 수 있습니다.

쿼리 = "EXEC sp_save_user @username='" & 사용자 이름 & "', @password=0x" & 비밀번호

IOW - 비밀번호 문자열 앞에 "0x"를 추가합니다.

그러나 매개변수화된 쿼리를 사용하는 것이 더 낫다는 내용을 읽었습니다.

예:SET objParam = objCommand.CreateParameter("@password",204, 1, 40, 비밀번호)

그러나 매개변수는 바이너리(204)여야 하는데 비밀번호는 문자열이기 때문에 이는 실패합니다.

그렇다면 "4a5e6a8d521ed487b81c91e131cf27e8dae9b783"과 같은 문자열을 ASP에서 바이너리로 어떻게 변환합니까?

미리 감사드립니다!

도움이 되었습니까?

해결책

이런 일로 머리를 세게 때리던 시절이 생각납니다.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>

다른 팁

DB를 변경할 수 있는 범위가 있다고 가정합니다.더 구체적으로 저장 프로시저?

해시를 문자열로 받아들이고 SProc 내의 varbinary로 CAST하면 어떨까요?

더 자세히 읽어보면 SQL Server에는 내장된 String -> Varbinary 함수가 없지만 이 기능 쉬운 솔루션으로 제공되었습니다.

약간 관련이 없을 수도 있지만 클라이언트에서 해시를 솔팅하는 경우 정확히 어떻게 솔트를 안전하게 유지하고 있는지 궁금합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top