hmacsha1输出vb.net和python之间不同的十六进制字符串

时间:2014-02-06 22:20:59

标签: python vb.net hmacsha1

我在vb.net中使用HMACSHA1在webrequest中进行消息身份验证。从服务器收到“(403)Forbidden”消息后,我决定看看我在VB中的签名计算是否与我给出的示例python代码中的计算相匹配。十六进制字符串非常相似,但不完全相同。请注意py签名中的两个额外0,但不在下面*表示的vb中。我假设py示例代码很好并且返回正确的输出,所以让vb匹配可以解决我的问题,那么差异是什么?

vb sig returns: a729e16e5c4a444a302a72c3d44544fe58aa90
py sig returns: a729e16e5c4a444a3002a72c3d44544f0e58aa90
.................................*..............*.......

这是py代码,基于(http://apiaxle.com/docs/signing-requests/)的伪代码:

import hmac
from hashlib import sha1
from time import time
key =    'ba1d92...'    #32 bit hex number (string)
secret = '2a3759...'    #128 bit hex number (string)
curr_time = str(int(time()))
concat = curr_time+key
# hmac expects byte, so convert
concatB = (concat).encode('utf-8')
secretB = secret.encode('utf-8')
h1 = hmac.new(secretB, concatB, sha1)
# h1 is byte, so convert to hex
api_sig = h1.hexdigest()

这是vb代码:

Dim uTime As Integer = (DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds
Dim api_sig As String = ""
Using myhmac As New HMACSHA1(System.Text.Encoding.UTF8.GetBytes(secret))
  Dim hashValue As Byte() = myhmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(String.Concat(uTime.ToString, key)))
  Dim i As Integer
  For i = 0 To (hashValue.Length - 1)
    api_sig = api_sig + Hex(hashValue(i))
  Next i

1 个答案:

答案 0 :(得分:1)

您的VB输出未正确填充小于16的值的十六进制数字;字节0x02仅表示为2,而不是02,0x0E字节包含在e中,而不是0e

您需要添加.PadLeft()来电:

api_sig = api_sig + Hex(hashValue(i)).PadLeft(2, "0"c)

或使用字符串格式:

api_sig = api_sig + String.Format("{0:X2}", hashValue(i))