python3中遇到'TypeError Unicode-objects must be encoded before hashing'

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
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
TypeError: Unicode-objects must be encoded before hashing

排错后发现python3中字符对象是unicode对象,不能直接加密,需要编码后才能进行update。

就是改成如下即可:

1
sign.update(params_data_en.encode('utf8'))

-------------The End-------------

本文标题:python3中遇到'TypeError Unicode-objects must be encoded before hashing'

文章作者:cloud sjhan

发布时间:2018年08月20日 - 22:08

最后更新:2018年09月28日 - 10:09

原始链接:https://cloudsjhan.github.io/2018/08/20/python-md5-err-md/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

cloud sjhan wechat
subscribe to my blog by scanning my public wechat account
坚持原创技术分享,您的支持将鼓励我继续创作!
0%
;