我在使用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=
我的猜测是它与换行符的编码方式有关,但我无法弄清楚如何解决它。
答案 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