加密解密操作
什么是加密:将一个明文数据,按照指定的算法,运算得到一个其他的可以隐藏真实信息的密文数据,这个过程称为加密;处理的算法称为加密算法;用到的关键数据称为密钥。
什么是解密:按照指定的算法和关键数据,将一个密文数据进行逆向运算得到正确的明文数据的过程成为解密操作。
加密操作步骤
- 原始 明文数据 s = “hello”
- 编码->字节数据,s = s.encode(“utf-8”)
- md5/shax(字节数据)->密文对象,x = hashlib.md5(s)
- 密文对象.update(密钥/盐值/混淆码)-> 更新之后的密文对象,x.update(‘^#@JDDf’)
- 得到混淆之后的密文数据,x.hexdigest(),得到密文》‘ba65a656f6b12312ab12d23’
单向加密算法:只能加密,不能解密的算法
如:用户账号密码(单向加密)存储,此时任何人都不能查看该用户的明文密码。流程->用户输入明文密码->加密->和存储的密文密码进行比较->相等-成功。
python中的加密操作:hashlib。
单向散列算法加密:比较经典的有MD5加密[数字指纹], Returns a md5 hash object。
from hashlib import md5
a = "明文"
m = md5()
m.update(a)
Traceback (most recent call last):
File "D:\conda\lib\site-packages\IPython\core\interactiveshell.py", line 2961, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-49-6aa158bc3233>", line 1, in <module>
m.update(a)
TypeError: Unicode-objects must be encoded before hashing
## 设置编码
m.update(a.encode('utf8'))
m
Out[51]: <md5 HASH object @ 0x00000224EAF52F30>
m.hexdigest()
Out[52]: 'e6c2860f3a8fa2aa6224ab17e9fac946'
m.digest()
Out[53]: b'\xe6\xc2\x86\x0f:\x8f\xa2\xaab$\xab\x17\xe9\xfa\xc9F'
##
md5(a.encode('utf8')).hexdigest()
Out[54]: 'e6c2860f3a8fa2aa6224ab17e9fac946'
##
import hashlib
hashlib.new('md5', a.encode('utf8')).hexdigest()
Out[56]: 'e6c2860f3a8fa2aa6224ab17e9fac946'
hmac加密
import hmac
# hmac加密,这种方法使用了对称加密和hash,安全性更高
def hmac_by_md5(pwd):
# 参数:加密字符、盐值、加密方式
return hmac.new(pwd.encode('utf-8'), MD5_SALT.encode("utf-8"), "MD5").hexdigest()
单项哈希加密算法-> SHAX加密。
双向加密算法:可以加密,加密的数据可以解密得到明文数据
使用在更多的场景;数据进行加密传输->目标地址->解密得到明文数据进行处理。
对称加密:加密和解密使用相同的秘钥;
python标准库(standand library):base64,一般称它为编码解码,不称它为加密解密。经常出现在web中。
>>> import base64
>>> dir(base64)
['MAXBINSIZE', 'MAXLINESIZE', '_85encode', '_A85END','_A85START',
'__all__', '__builtins__', '__cached__','__doc__', '__file__',
'__loader__', '__name__','__package__', '__spec__', '_a85chars',
'_a85chars2','_b32alphabet', '_b32rev', '_b32tab2', '_b85alphabet',
'_b85chars', '_b85chars2', '_b85dec', '_bytes_from_decode_data',
'_input_type_check','_urlsafe_decode_translation',
'_urlsafe_encode_translation','a85decode', 'a85encode', 'b16decode',
'b85decode', 'b85encode', 'binascii', 'bytes_types', 'decode',
'main', 're', 'standard_b64decode', 'standard_b64encode', 'struct',
'test', 'urlsafe_b64decode', 'urlsafe_b64encode']
>>>
>>> help(base64.b64encode)
Help on function b64encode in module base64:
b64encode(s, altchars=None)
Encode the bytes-like object s using Base64 and return a bytes object.
Optional altchars should be a byte string of length 2 which specifies an
alternative alphabet for the '+' and '/' characters. This allows an
application to e.g. generate url or filesystem safe Base64 strings.
>>>
base64案例:
>>> import base64
>>> src = "明文数据"
>>> tgt = base64.b64encode(src.encode('UTF-8')) #编码->like 加密
>>> tgt # 查看
b'5piO5paH5pWw5o2u'
>>>
>>> src = base64.b64decode(tgt).decode('utf-8')
>>> src # 查看
'明文数据'
>>>
非对称加密:加密和解密使用不同的秘钥;如HTTPS传输数据。