html tool

2019年2月19日星期二

python3对python2的hmac.new 转换中问题记录


源地址: https://www.cnblogs.com/xiaoxiao-niao/p/8266768.html
[popexizhi:
分析原文写法的好处,遇到的问题和解决过程很清晰,事后分析也很明确。
pope的问题?过程写的很细节没有整体概况,准确度和整体性如何协调,排版上如何可以好的体现??
]
第一次:python3传的是bytes不能是str。好吧,认了。我就传bytes吧
b= hmac.new('/admindevice/GetCameraSetting','adbaskjclas',sha1).hexdigest()
print(b)

 File "/usr/lib64/python3.6/hmac.py", line 42, in __init__
    raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__)
TypeError: key: expected bytes or bytearray, but got 'str'


第二次:看报错,悲催了吧。hmac.new说必须是string才行;
因为hmac.new是要求utf-8的编码
b= hmac.new(bytes('/admindevice/GetCameraSetting'),bytes('adbaskjclas'),sha1).hexdigest()
print(b)

  File "/usr/lib64/python3.6/hmac.py", line 93, in update
    self.inner.update(msg)
TypeError: Unicode-objects must be encoded before hashing

hamc.new的要求是UTF-8,我就来转UTF-8,终于成功了
b= hmac.new(bytes('/admindevice/GetCameraSetting','utf-8'),bytes('adbaskjclas','utf-8'),sha1).hexdigest()
print(b)
-------------
结果:792a09ad139522fe77771bc5cb5fbb44b44b40b3

这种处理方式也可以,将所有都转成Unicode的方式
a= hmac.new(bytes('/admindevice/GetCameraSetting','latin-1'), bytes('adbaskjclas','latin-1'),sha1).hexdigest()
print(a)
-------------
结果:792a09ad139522fe77771bc5cb5fbb44b44b40b3

base64.b64encode('value')也是相同问题,需要传bytes,然后再转回UTF-8,够恶心吧

原因:
Python 2 悄悄掩盖掉了 byte 到 unicode 的转换,只要数据全部是 ASCII 的话,所有的转换都是正确的,一旦一个非 ASCII 字符偷偷进入你的程序,那么默认的解码将会失效,从而造成 UnicodeDecodeError 的错误。py2编码让程序在处理 ASCII 的时候更加简单。你复出的代价就是在处理非 ASCII 的时候将会失败。

py3也有两种数据类型:str和bytes;  str类型存unicode数据,bytse类型存bytes数据



最长的例子:
quote(base64.b64encode(bytes(hmac.new(bytes(service_key_secret,'utf-8'), (bytes(verufy_url,'utf-8') +bytes("\n",'utf-8')+ bytes(str(self.timetamp),'utf-8')), sha1).hexdigest(),'utf-8')))

没有评论:

发表评论