一、加密
1.python2加密的时候使用str,加密后的数据也是str。
>>> import base64 >>> url = "https://www.baidu.com?a=23&b=中国" >>> b=base64.b64encode(url.decode('utf8').encode('utf-8')) >>> type(b) <type 'str'> >>> import sys >>> sys.getdefaultencoding() 'ascii'
>>> b=base64.b64encode(url.encode('utf-8')) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 29: ordinal not in range(128)
对加密的str,编码后,再使用base64加密,报错。why?
首先:
在python2中,字符串str默认采用的是ASCII编码。
因此在base64加密的时候,直接使用ascii的字符串str,加密即可。返回字符串str。
其次:
在python2中,使用unicode类型作为编码的基础类型。即
decode encode
str ---------> unicode --------->str
因此,如果要使用unicode,进行base64加密。
可以有两种方法,是正确的:
1.按照上面的步骤,先decode,再encode,这个时候字符串是默认的ascii。
>>> b=base64.b64encode(url.decode('utf8').encode('utf-8')) >>> type(b) <type 'str'>
2.将系统编码设置为utf8,直接encode()
>>> sys.getdefaultencoding() 'ascii' >>> reload(sys) <module 'sys' (built-in)> >>> sys.setdefaultencoding('utf8') >>> b=base64.b64encode(url.encode('utf-8')) >>> type(b) <type 'str'> >>> sys.getdefaultencoding() 'utf8'
2.python3的字符串在base64加密前,必须先编码为二进制。
>>> import base64 >>> url = "https://www.baidu.com?a=23&b=中国" >>> b=base64.b64encode(url.encode('utf-8')) >>> type(b) <class 'bytes'>
否则,抛出异常
>>> >>> b=base64.b64encode(url) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/base64.py", line 58, in b64encode encoded = binascii.b2a_base64(s, newline=False) TypeError: a bytes-like object is required, not 'str'
我们可以查看一下python3默认使用的编码
>>> import sys >>> sys.getdefaultencoding() 'utf-8'
总结:
- 在python3,base64加密前,必须先编码为bytes。
- 在python2,可能会混淆。因此:
- 不管系统编码为默认的ascii,还是已经改为utf8。先decode,再encode始终不会错。
b=base64.b64encode(url.decode('utf-8').encode('utf-8'))
- 如果可以全局确认,python2的系统编码始终是默认的ascii。就直接base64加密即可。
- 如果可以全局确认,python2的系统编码始终是默认的utf8。base64加密前,必须先encode。
- 不管系统编码为默认的ascii,还是已经改为utf8。先decode,再encode始终不会错。