在VB.NET中为HMAC SHA1编码换行符

时间:2017-06-08 15:20:42

标签: vb.net oauth newline hmac

我在使用OAuth验证API时遇到问题。我可以在Python中使用它,但在VB.Net中则不行。我意识到问题是SHA1算法在Python和VB.NET中返回一个不同的值,我认为是相同的消息。只有在有换行符时才会出现这种情况" \ n"在消息中(必须有API调用)。使用Environment.NewLine似乎无济于事。

我使用的代码(基于this answer)在这里,带有我从Python程序获得的预期值:

Public Sub Main()           
    ' Expect D/5B78PD9pFhmqZQi3eenPBy6ks=
    ' Get    D/5B78PD9pFhmqZQi3eenPBy6ks=
    console.writeline(getHash("a", "msg"))

    ' Expect yuuq6RwtwkoJ6n3PquGFx60MLas=
    ' Get    uv4AwQjvYeCTajhHw7EFtPlJfCE=
    console.writeline(getHash("a", "msg\n"))

    ' Expect yuuq6RwtwkoJ6n3PquGFx60MLas=       
    ' Get efRfAnmIN/C/YX/UPHVPFY5VjJg=
    console.writeline(getHash("a", "msg" + Environment.NewLine))

End Sub

Public Function getHash(ByVal key As String, ByVal msg As String) As String
    Dim myEncoder As New System.Text.UTF8Encoding
    Dim keyBytes() As Byte = myEncoder.GetBytes(key)
    Dim msgBytes() As Byte = myEncoder.GetBytes(msg)

    Dim myHMACSHA1 As New System.Security.Cryptography.HMACSHA1(keyBytes)
    Dim HashCode As Byte() = myHMACSHA1.ComputeHash(msgBytes)

    Return Convert.ToBase64String(HashCode)
End Function

如果它有用,我的Python程序是:

import base64
import hashlib
import hmac

key = "a"
msg = "msg\n"
key_byte = key.encode('utf-8')
msg_byte = msg.encode('utf-8')

h = hmac.new(key_byte, msg_byte, hashlib.sha1)
print base64.b64encode(h.digest())   # yuuq6RwtwkoJ6n3PquGFx60MLas=

我的猜测是它与换行符的编码方式有关,但我无法弄清楚如何解决它。

1 个答案:

答案 0 :(得分:1)

首先,我想指出VB.NET中的import {key, key2} from 'module.js';不代表新行字符。它实际上只会变成\n

Environment.NewLine适应当前的操作系统。不同的操作系统使用不同的行结尾。这里的问题是Python代码使用Line Feed字符(\n)作为新的行指示符,但由于\n适应操作系统,它将返回Windows的行结尾,是Carriage Return + 换行Environment.NewLine)。

因此,如果您希望它与Python代码匹配,您必须确保插入换行符 。例如:

\r\n