前言
任何一个收集以及存储客户数据的公司,就算是初创公司,都应该认真对待这个问题。在圈内我们常说,不是系统会不会黑,数据会不会被盗,而是何时被黑被盗的问题。那么此时必然会考虑数据加密处理问题,避免网络上数据被截取、被盗取使用等情况发生。
Python数据加密
而我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。在了解python中的Bytest对象之前,首先了解str对象、bytes对象之间的转换关系以及区别:
bytes(一堆二进制的数字,如:b'11001010')主要是给在计算机看的,string主要是给人看的
中间有个桥梁就是编码规则,现在大趋势是utf8
bytes对象是二进制,很容易转换成16进制,例如\x64
string就是我们看到的内容,例如'abc'
string经过编码encode,转化成二进制对象,给计算机识别
bytes经过反编码decode,转化成string,让我们
bytes和str的相互转换
#-*- coding:utf-8 -*-##-------------------------------------------------------------------------#ProjectName: Python2020#FileName: ByteObject.py#Author: mutou#Date: 2020/6/16 21:18#Description:python中的str、byte对象之间的切换操作#--------------------------------------------------------------------------import binascii #binay ASCII 利用binascii模块可以将十六进制显示的字节转换成我们在加解密中更常用的显示方式:str1="wood"#声明一个byte对象b1=b'wood'#第一种方法#如何将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 都是编码方式,对应有各自的一套编码算法。但是有人经常称它们是加密,例如 base64 加密。其实这种说法不算全对。因为默认的 base16,base32,base64 的各种信息都是公开的,公开的包含有:
算法的运算方式
编码表格
16,32和64它们编码原理都是一样的,不同的地方在以下区别:
一个字符所对应表格中的下标的 bit 位是多少个
对应的编码表格是多少
Base编码原理
例如要被编码的字符串是:wood
A.将 wood字符串中的每个字符转为对应于Ascii 编码表的值,w=119 o=111 o=111 d=100
B.将第一步中的 Ascii 值分别转为对应的二进制格式,要求必须是形成8 个 bit,不足8比特位高位补0。例如:1 的二进制是 1,明显不够8位,最终应该显示为:0000 0001。wood的转化结果如下:
w----01110111 o----01101111 d---01100100
C.根据base X(这里的 X 代表 16,32,64等编号) 编码算法中所指定的y 个 bit 位为一个字符在表格中的下标 的规则,对第2步的进行划分。例如 base 16的规则要求,4位作为一个下标对应一个字符,即每4个位为一部分;如果是base32的话,则5位作为一个下标对应一个字符;如果是base64则6位作为下标对应一个字符;
此处使用base64编码,则使用6位作为下标对应一个字符;所以
wood整个二进制值为:
01110111 01101111 01101111 01100100
划分结果为:
011101 110110 111101 101111 011001 00000029 54 61 47 25 0d 2 9 v Z A
base64编码表如下:
说明
转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
不断进行,直到全部输入数据转换完成。
如果最后剩下两个输入数据,在编码结果后加1个“=”。
如果最后剩下一个输入数据,编码结果后加2个“=”。
如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的
正确性。
所以wood进行base64加密后的数据结果为:b'd29vZA=='
代码实例如下:
#-*- coding:utf-8 -*-##-------------------------------------------------------------------------#ProjectName: Python2020#FileName: BaseTest.py#Author: mutou#Date: 2020/6/16 21:43#Description:base编码原理说明#--------------------------------------------------------------------------import base64str1="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 00print(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的标准库中,已经移除了md5,而关于hash加密算法都放在hashlib这个标准库中,如SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。
特点
压缩性:任意长度的数据,算出的MD5值长度都是固定的。
容易计算:从原数据计算出MD5值很容易。
抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
不可逆性:每个人都有不同的指纹,看到这个人,可以得出他的指纹等信息,并且唯一对应,但你只看一个指纹,是不可能看到或读到这个人的长相或身份等信息。
使用示例
#-*- coding:utf-8 -*-##-------------------------------------------------------------------------#ProjectName: Python2020#FileName: MD5Test.py#Author: mutou#Date: 2020/6/16 22:12#Description:#--------------------------------------------------------------------------import hashlibimport binasciistr1="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())
运行结果如下:
了解更多信息关注公众号