hmacsha1 output hex strings different between vb.net and python

六眼飞鱼酱① 提交于 2019-12-11 08:19:20

问题


I am using HMACSHA1 in vb.net for message authentication in a webrequest. After getting a "(403) Forbidden" message from the server, I decided to see if my signature calculation in VB matched the calculation in the sample python code I was given. The hex strings were ever so similar, but not quite exactly the same. Note the two extra 0s in the py signature but not in the vb indicated by * below. I'm assuming the py example code is good and returns correct output, so getting the vb to match may solve my problem, so what is the diff?

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

Here is py code, based on pseudo-code at (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()

And here is vb code:

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:


Your VB output doesn't correctly pad the hex digits for values smaller than 16; the byte 0x02 is represented as just 2, not 02, and the 0x0E byte is included as e, not 0e.

You need to add a .PadLeft() call:

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

or use string formatting:

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


来源:https://stackoverflow.com/questions/21615322/hmacsha1-output-hex-strings-different-between-vb-net-and-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!