考虑数据加密处理问题,避免网络上数据被截取、被盗取使用等情况。
数据加密
加密方式,是对二进制编码的格式Bytes进行加密
bytes和str的相互转换
# Description:python中的str、byte对象之间的切换操作
import binascii # binay ASCII 利用binascii模块可以将十六进制显示的字节转换成我们在加解密中更常用的显示方式:
str1 = "wood"
b1 = b'wood' # 声明一个byte对象
# 第一种方法
# 如何将str对象转换成byte对象
s_to_b = bytes(str1, encoding="utf-8")
print(s_to_b)
# 需要将byte对象转换成str对象
b_to_s = str(b1, encoding="utf-8")
print(b_to_s)
# 通过python内置函数完成:str自带的encode方法、bytes对象自带的decode方法
s_to_b_1 = str.encode(str1)
print(s_to_b_1)
b_to_s_1 = bytes.decode(b1)
print(b_to_s_1)
# 第二种方法,如果声明一个汉字
str2 = "司麦狸狸"
get_byte = str.encode(str2)
# 将byte对象转换成十六进制数
get_hex_byte = binascii.b2a_hex(get_byte)
print(get_hex_byte)
# 如果需要将其转换成str对象
print(bytes.decode(binascii.a2b_hex(get_hex_byte)))
输出结果如下:
Base64编码
base16,base32,base64 都是编码方式或加密方式,算法的运算方式和 编码表格是公开,编码原理都一样,区别在于:
- 一个字符所对应表格中的下标的 bit 位是多少个
- 对应的编码表格是多少
Base编码原理
例如要被编码的字符串是:wood
A.将每个字符转为Ascii 编码值,w=119 o=111 o=111 d=100
B.将Ascii 值转为二进制格式,必须是8 个 bit,不足8比特位高位补0。wood的转化结果如下:
w----01110111 o----01101111 d---01100100
C.根据base X(这里的 X 代表 16,32,64等编号) 编码算法中所指定的y 个 bit 位为一个字符在表格中的下标 的规则,对第2步的进行划分。例如 base 16的规则要求,4位作为一个下标对应一个字符,即每4个位为一部分
此处使用base64编码,则使用6位作为下标对应一个字符;所以
wood整个二进制值为:
01110111 01101111 01101111 01100100
划分结果为:
011101 110110 111101 101111 011001 000000
29 54 61 47 25 0
d 2 9 v Z A
base64编码表如下:
说明
- 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
- 数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
- 不断进行,直到全部输入数据转换完成。
- 如果最后剩下两个输入数据,在编码结果后加1个“=”。
- 如果最后剩下一个输入数据,编码结果后加2个“=”。
- 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的
正确性。
所以wood进行base64加密后的数据结果为:b'd29vZA=='
示例
# Description:base编码原理说明
import base64
str1 = "wood"
# 加密传入的参数必须是bytes对象
print(base64.b64encode(str.encode(str1)))
# 加密过程:1.将wood四个字符实现ASCII码转换:w=119 o=111 o=111 d=100
# 2.分别将对应的字符转换成二进制格式;假设使用八位进行表示定义,高位不足八位则补位操作
# w----01110111 o----01101111 d---01100100
# 3.根据指定的base X编码算法进行指定多少个bit位完成一个字符表格的下标;
# 将上述值转换成十进制
print(int("0b011101", base=0))
print(int("0b110110", base=0))
# 011101 110110 111101 101111 011001 00
print(int("0b111101", base=0))
print(int("0b101111", base=0))
print(int("0b011001", base=0))
# 4.根据每组转换得到的十进制数查找对应的编码表
# 假设16编码0111 0111
# 第一组值0111得到的十进制数
print(int("0b0111", 0))
get_base16 = base64.b16encode(str.encode(str1))
# 解密
print(base64.b16decode(get_base16))
MD5
消息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
在python3的标准库中,hashlib标准库中hash加密算法,如SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。
特点
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
- 容易计算:从原数据计算出MD5值很容易。
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
- 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
- 不可逆性:每个人都有不同的指纹,看到这个人,可以得出他的指纹等信息,并且唯一对应,但你只看一个指纹,是不可能看到或读到这个人的长相或身份等信息。
示例
#FileName: MD5Test.py
import hashlib
import binascii
str1="wood"
#创建md5加密对象
get_md5=hashlib.md5()
#对数据进行加密操作;必须传入的对象是bytes对象
get_md5.update(str.encode(str1))
print(get_md5.hexdigest()[8:-8]) #md5的十六位加密值:实际也是通过此种方式完成,只不过十六位取值是取三十二位的中间十六位
#上述hexdigest实际就是封装了以下代码
print(binascii.b2a_hex(get_md5.digest()))
get_md51=hashlib.md5()
get_md51.update(str.encode("admin888"))
print(get_md51.hexdigest())