Python3中进行MD5加密,遇到编码问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import hashlib from urllib.parse import urlencode, quote_plus import urllib
def verfy_ac(private_key):
item = { "Action" : "CreateUHostInstance", "CPU" : 2, "ChargeType" : "Month", "DiskSpace" : 10, "ImageId" : "f43736e1-65a5-4bea-ad2e-8a46e18883c2", "LoginMode" : "Password", "Memory" : 2048, "Name" : "Host01", "Password" : "VUNsb3VkLmNu", "PublicKey" : "ucloudsomeone%40example.com1296235120854146120", "Quantity" : 1, "Region" : "cn-bj2", "Zone" : "cn-bj2-04" }
params_data = "" import pdb;pdb.set_trace() for key, value in item.items(): params_data = params_data + str(key) + str(value) params_data = params_data + private_key params_data_en = quote_plus(params_data)
sign = hashlib.sha1() sign.update(params_data_en.encode('utf8')) signature = sign.hexdigest()
return signature
print(verfy_ac("46f09bb9fab4f12dfc160dae12273d5332b5debe"))
|
这是ucloud官方的API教程,想根据此教程生成签名,教程中的代码是基于Python2.7编写,我将其改成了Python3.但是在执行时报错:
1 2
| TypeError: Unicode-objects must be encoded before hashing
|
排错后发现python3中字符对象是unicode对象,不能直接加密,需要编码后才能进行update。
就是改成如下即可:
1
| sign.update(params_data_en.encode('utf8'))
|