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



我正在尝试将TOTP的JavaScript应用程序翻译为VB。净: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中翻译的代码草图。净

'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输出十六进制字符串在vb.net和python之间不同

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

哈希对字符串不起作用——它们对字符串的二进制表示起作用。现在您使用UTF-8作为dotnet版本的编码,而JavaScript版本很可能不使用UTF-8 -因此您得到不同的二进制表示,从而产生不同的哈希值。

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

相关内容

  • 没有找到相关文章

最新更新