2016-07-28 79 views
0

我在使用HMAC-SHA1算法密钥开发安全访问python脚本时陷入了python。Python HMAC-SHA1计算布莱恩错误

我有python版本2.7,它已经包含HMAC-SHA1库。使用库我试图用下面提到的方式编写脚本。但不幸的是,当我执行脚本时,计算的密钥与给予我的预期密钥不同。

---------------代码开始--------------------------

from hashlib import sha1 
import hmac 
import base64 
import hashlib, binascii 
SecurityConst_key = "121a3ace5827a3b6" #(0x12 1A 3A CE 58 27 A3 B6) 
msg = "4272696C6C69616E63655F6175746F21" # Brilliance_auto! 
key = hmac.new(SecurityConst_key, msg, sha1).digest() 
key = base64.b64encode(key) 
print binascii.hexlify(key) 

---------------- Code End ----------------------

Key calculated是:4d416963747a41737a546f774530464373536e4d646b6c323972673d

这与最左边的128位不同。

预期主要是:0x15 4A ED 59 CF B3 2E DC 37 8D 30 6B 0F 02 AB 6B (截断的160位结果输出的HMAC的最左边128位,这是关键)

能有人帮我解决可能的问题。

回答

0

所以,你需要非常小心的是理解某些东西是字节串还是十六进制串。在python中,大多数加密和mac和sha都采用二进制字符串。所以你的行:

SecurityConst_key = "121a3ace5827a3b6" #(0x12 1A 3A CE 58 27 A3 B6) 

是不正确的。那实际上是0x31 32 31 ...您需要首先获取您的数据。在传入密钥和数据之前,尝试十六进制解码。“121a3ace5827a3b6”.decode(“hex”)。

另一方面,对于数据,您可以使用原始字符串。

其次你也是base64编码你的mac的输出之前打印关闭十六进制。这似乎 - 错了。你要么base64,要么看它,要么对它进行十六进制编码,然后看看。 Base64设计是ascii-printable(对于散列,你传统上用十六进制打印)