2009-04-22 74 views
2

全部,在SQL Server和經典ASP中處理以varbinary存儲的哈希密碼

對不起 - 我是下面大多數主題(SQL,ASP)的新手。反正...

我有一個要求用戶提供用戶名和密碼登錄一個非常簡單的Web應用程序。

前端創建密碼的鹽漬SHA1哈希值,並將其發佈(與用戶名一起)的ASP頁面。

那ASP頁面獲取數據,調用在SQL Server數據庫的存儲過程,並通過用戶名和散列密碼;存儲過程將信息寫入「用戶」表。

表中的密碼列的類型是varbinary。

至於我可以告訴大家,當ASP獲取密碼(password =的Request.Form( 「密碼」)),它是一個字符串。

我可以 '絕招' 的SQL Server爲處理它作爲VARBINARY如果我創建查詢是這樣的:

查詢= 「EXEC sp_save_user @用戶名= '」 &用戶名& 「',@密碼= 0X」 &密碼

督察 - 我的前面加上「0X」的口令字符串。

不過,我讀過,這是一個更好的做法是使用參數化查詢:

例如:SET objParam = objCommand.CreateParameter( 「@密碼」,204,1,40,密碼)

但是,這是因爲該參數應該是二進制(204),但密碼是字符串。

那麼,如何將「4a5e6a8d521ed487b81c91e131cf27e8dae9b783」這樣的字符串轉換爲ASP中的二進制文件?

非常感謝提前!

回答

1

我記得我曾經在這種事情上甩頭的日子。我建議你升級到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("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

我假設你有範圍,以改變DB ......更具體的存儲過程?

爲什麼不只是將散列接受爲字符串,而是將它CAST到SProc中的varbinary?

進一步閱讀,沒有內置的字符串 - > VARBINARY功能在SQL Server中,但是this function已提供作爲一個簡單的解決方案,

+0

在VBScript中進行轉換也很容易,並且您可以在升級到較新的UI技術時保持數據庫接口清潔。 – 2009-04-22 11:59:16

0

也許有點風馬牛不相及,但我想知道,如果你是在客戶端醃製哈希,你如何保持鹽的安全?

+1

我的理解是,保護鹽並非至關重要 - 它會阻止任何人使用預先定義的散列密碼列表來密碼。換句話說,如果有人得到了我的鹽,他們可以創建一個新的每個可能的密碼+我的鹽的哈希版本的字典,但這是非常耗時的,以致不值得付出努力。當然,我不是專家,所以請帶上一點鹽。 ;-) – mattstuehler 2009-10-22 18:06:40