我试图将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
有谁知道我可能做错了什么?
答案 0 :(得分:2)
哈希不会处理字符串 - 它们处理字符串的二进制表示。现在你使用UTF-8作为dotnet版本的编码,而JavaScript版本很可能不使用UTF-8 - 所以你得到不同的二进制表示,导致不同的哈希值。
在计算哈希值之前,使用webttolkit或hackish var utfstring = unescape(encodeURIComponent(rawstring));
转换为UTF-8。