2014-06-30 79 views
1

我試着翻譯TOTP到VB.Net一個JavaScript應用程序之間的不同的輸出:http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/HMACSHA1給JS和VB.Net

我見HMAC-部分的翻譯過程中遇到的一個問題:

//Javascript: 
var hmacObj = new jsSHA("Hello World!", 'HEX'); 
var hmac = hmacObj.getHMAC("secret", 'HEX', 'SHA-1', "HEX"); 

這是我翻譯的在VB.Net一codesnippet

'VB.Net: 
Dim hmacObjTest As New HMACSHA1(System.Text.Encoding.UTF8.GetBytes("secret")) 
Dim hmacTest As Byte() = hmacObjTest.ComputeHash(System.Text.Encoding.UTF8.GetBytes("Hello World!")) 
Dim hmacHexTest As New StringBuilder() 

    For i As Integer = 0 To hmacTest.Length - 1 
     hmacHexTest.Append(hmacTest(i).ToString("x2")) 
    Next i 

Dim strTest As String = "HMAC = " & hmacHexTest.ToString() 

的問題是,我從兩種語言不同的輸出:

Output JS: 5efed98b0787c83f9cb0135ba283c390ca49320e //Tested from jsSha demo: http://caligatio.github.io/jsSHA/ 
Output VB.Net: 87b0154b8420c0b58869ca103f481e824d8876ea 

輸出是不是都一樣像他們這樣一個問題:hmacsha1 output hex strings different between vb.net and python

有誰知道我可能是做錯了什麼?

回答

2

散列對字符串不起作用 - 它們處理字符串的二進制表示。現在,您使用UTF-8作爲dotnet版本的編碼,而JavaScript版本很可能不使用UTF-8 - 因此您會得到不同的二進制表示,從而產生不同的哈希值。

使用webttolkit或黑客var utfstring = unescape(encodeURIComponent(rawstring));在計算散列之前轉換爲UTF-8。

+0

謝謝你的回答。 JavaScript代碼具有我正在尋找的輸出,所以我不需要更改該代碼。你知道JavaScript的getHMAC中使用的編碼標準嗎?任何方式改爲在VB.Net正確的標準呢? – Encrypto94

+0

使用的編碼由'System.Text.Encoding.UTF8.GetBytes()'定義,在這種情況下顯然是UTF-8。你可以在這裏使用你選擇的編碼。 –