SQL Server 및 클래식 ASP에서 varbinary로 저장된 해시된 암호 처리
-
13-09-2019 - |
문제
모두,
미리 죄송합니다. 저는 아래 주제(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 함수가 없지만 이 기능 쉬운 솔루션으로 제공되었습니다.
약간 관련이 없을 수도 있지만 클라이언트에서 해시를 솔팅하는 경우 정확히 어떻게 솔트를 안전하게 유지하고 있는지 궁금합니다.