2013-08-23 50 views
1

我繼承了一個我需要支持的程序,並且我被告知使用SHA1哈希將密碼存儲在MSSQL數據庫中。當我嘗試從數據庫中讀取數據時,我只能看到「System.Byte []」。vb.net,我如何驗證SHA1哈希密碼?

程序會要求用戶輸入密碼,我能夠用下面創建一個SHA1哈希:

Public Function GetSHA1HashData(data As String) As String 

     Dim cBase64 As String 
     Dim objSHA1 As New SHA1CryptoServiceProvider() 
     Dim abBytesToHash() As Byte 
     Dim cHash As String 

     cBase64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(data)) 
     abBytesToHash = System.Text.Encoding.ASCII.GetBytes(cBase64) 
     cHash = BitConverter.ToString(objSHA1.ComputeHash(abBytesToHash)) 
     cHash = Replace(cHash, "-", "") 

     Return cHash 

End Function 

所以我的問題是,如何比較新創建的哈希與價值,我拉出數據庫以查看它們是否相同?我需要做什麼「System.Byte []」把它變成我能讀的東西?

謝謝。

+0

您是否在使用.ToString或類似的東西從數據庫中拉出來時?如果是這樣,那可以解釋爲什麼你得到的是價值的類型,而不是實際的價值。如果以字節的形式存儲在數據庫中,則可能需要通過其他方法將其轉換爲字符串。 –

+0

是的,我正在使用MessageBox.Show(value.toString())來獲取System.Byte []消息,但這只是試圖看看那裏有什麼。 – user2018388

回答

1

您可以使用您的函數創建SHA-1哈希,但是如果填充數據庫的人確實使用了相同的函數,那麼這是值得商榷的。目前,你已經是base 64編碼數據,它已經是一個字符串,只是爲了檢索字符編碼。這個人更可能直接獲得了字符編碼 - 我是在這裏猜測 UTF-8 - 並計算出SHA-1值。

Public Function GetSHA1HashData(data As String) As Byte() 
    Dim objSHA1 As New SHA1CryptoServiceProvider() 
    return objSHA1.ComputeHash(System.Text.Encoding.UTF8.GetBytes(data)); 
End Function 

好的,現在你將有一個從數據庫中的字節數組和一個從用戶密碼計算出來的字節數組。你可以直接比較這些字節數組。幸運的是,你可以依靠StackOverflow和Jon Skeet來獲得an answer on how to do this