HMACSHA1在JS和VB.Net之间提供不同的输出

时间:2014-06-30 09:02:52

标签: vb.net hmac hmacsha1

我试图将TOTP的JavaScript应用程序翻译为VB.Net:http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/

我在翻译HMAC部分时遇到了问题:

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

这是我在VB.Net中翻译的代码片段

'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

有谁知道我可能做错了什么?

1 个答案:

答案 0 :(得分:2)

哈希不会处理字符串 - 它们处理字符串的二进制表示。现在你使用UTF-8作为dotnet版本的编码,而JavaScript版本很可能不使用UTF-8 - 所以你得到不同的二进制表示,导致不同的哈希值。

在计算哈希值之前,使用webttolkit或hackish var utfstring = unescape(encodeURIComponent(rawstring));转换为UTF-8。