我正在尝试将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。