【发布时间】:2017-06-09 00:01:00
【问题描述】:
我在使用 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=
我的猜测是这与换行符的编码方式有关,但我不知道如何解决。
【问题讨论】: