1.数据安全
-- 数据时代为了保证数据安全性,防止数据泄露,往往需要对数据进行加密;
-- 对于敏感数据,加密措施更加令人发指
- 加密: 是最常用的安全保密手段,利用技术手段把重要的数据变为乱码传输;
- 解密:到达目的后,再利用相同手段或者不同手段还原
2.概念
-- 对称加密
数据加密与解密使用相同的密钥
-- 非对称加密
加密与解密用两把不同的密钥,
公钥用于加密数据
私钥用于解密数据
-- 单向加密
只能加密不能解密
3.hash结构
-- hash因为不可逆性,只能进行单项加密
hash:
散列函数,一般译为哈希,
把输入任意长度的数据通过散列函数进行转化,变成一个长度固定的值(散列值);这个值是唯一的
hash算法中的一种将任意长度的数据变成一个长度固定的数据的函数
特点:
不可逆:无法根据散列值来还原原来的数据
定长输出: 无论原始数据有多长,结果长度相同
抗修改性:输入的微小改变哪怕只有一个字符,会引起结果的巨大改变
强碰撞性:很难找到两端内容相同的的数据,使他们产生hash值相同一致几乎不可能。
4. hashlib模块API
hashlib模块提供了许多供我们调用的hash算法,主要有:
1.md5
2.SHA系列:sha1, sha224, sha256, sha384, sha512
方法 | 作用 | 补充 | 注 |
---|---|---|---|
hashlib.new(name,data) | 生成一个hash对象 | 方法名name上面介绍了; 数据data是二进制数据(可 encode编码) | 不常用 |
hashlib.hash算法名(data) | 生成一个使用该算法的hash对象 | 数据data是二进制数据(可 encode编码), | data是用于加密混淆的,可写可不写 |
hash对象.update(arg) | 添加需要加密数据 | arg也是二进制数据(可 encode编码) | |
hash对象.disget() | 返回hash算法加密后的值(bytes类型) | ||
hash对象.hexdisget() | 返回hash算法加密后的值(str类型) |
5.案例
import hashlib
obj = hashlib.md5()
obj.update("小马过河".encode("utf-8"))
print(obj,type(obj))
# -------------------结果:
# <md5 HASH object @ 0x000002FC55869A20>
# <class '_hashlib.HASH'>
import hashlib
obj = hashlib.md5()
obj.update("小马过河".encode("utf-8"))
# print(obj,type(obj))
print(obj.digest()) # b'$\xf6{\x0fm\x02\xad\xc8\x86}a.\x0e\x0f\xc4\n'
print(obj.hexdigest()) # 24f67b0f6d02adc8867d612e0e0fc40a
import hashlib
obj = hashlib.md5("mcw@xiaoma@aaaafffff".encode("utf-8")) # 添加一些内容,提高加密复杂度。此处的字符串也要先编码,
obj.update("小马过河".encode('utf-8'))
result = obj.hexdigest()
print(result) # b11740508f28e04837f2c0e3a58cf990
经典案例:登录注册,数据一致性校验
6.扩展:hmac模块
hmac模块的加密方式,与hashlib类似
# 还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密:
import hmac
h = hmac.new('天王盖地虎'.encode('utf8')) # hmac必须要加盐
h.update('hello'.encode('utf8'))
print(h.hexdigest()) # 1abaae8f65f68f2695a8545c5bc8e738
# 要想保证hmac最终结果一致,必须保证:
# 1:hmac.new括号内指定的初始key一样
# 2:无论update多少次,校验的内容累加到一起是一样的内容
# 下面单重方式得到的结果是一样的
import hmac
h1=hmac.new(b'tom') # 初始值必须保证一致,最终得到的结果就会不一样
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest())
h2=hmac.new(b'tom') # 初始值必须保证一致,最终得到的结果就会不一样
h2.update(b'helloworld')
print(h2.hexdigest())
h3=hmac.new(b'tomhelloworld') # 初始值不一样,所以与上面两种的结果不一样
print(h3.hexdigest())
'''
0426ccec3b134e8c18fdcefee841ef25
0426ccec3b134e8c18fdcefee841ef25
ff1214d895bbaf5f1847db4ebae8212e
'''