Python 中的url,Base64和MD5编码解码的使用

1.encode()和decode()

我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes(字节)
所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错。
将字符串和Bytes互相转换可以使用encode()和decode()方法。
如下所示:

# 方法中不传参数则是以默认的utf-8编码进行转换
str_encode = "解除隔离吧!上帝".encode("utf-8")
print(str_encode)

str_decode = str_encode.decode("utf-8")
print(str_decode)

运行结果:

b'\xe8\xa7\xa3\xe9\x99\xa4\xe9\x9a\x94\xe7\xa6\xbb\xe5\x90\xa7\xef\xbc\x81\xe4\xb8\x8a\xe5\xb8\x9d'
解除隔离吧!上帝

2.binascii模块

binascii模块主要用于二进制和ASCII互相转换(Convert between binary and ASCII ),在编码和解码领域通常将十六进制显示的字节转换成我们在加解密中更常用的显示方式。
常用的方法:

函数 描述
b2a_hex(data) 将二进制数据转换成16进制的表现形式
a2b_hex(data) 将16进制的格式数据转换成二进制形式
a2b_base64(string) 将base64的数据转换为二进制数据,并返回该二进制数据
b2a_base64(string) 将二进制数据转换成base64格式的数据

更详细可以参考博客:Python binascii模块

代码演示:

import binascii

str_encode = "解除隔离吧!上帝".encode("utf-8")
bin_hex = binascii.b2a_hex(str_encode)
print("bin_hex :", bin_hex)

a2b_hex = binascii.a2b_hex(bin_hex)
print("a2b_hex:", a2b_hex)

v = binascii.a2b_hex(bin_hex).decode("utf-8")
print(v)
b = str_encode.decode("utf-8")
print(b)

测试结果:

bin_hex : b'e8a7a3e999a4e99a94e7a6bbe590a7efbc81e4b88ae5b89d'
a2b_hex: b'\xe8\xa7\xa3\xe9\x99\xa4\xe9\x9a\x94\xe7\xa6\xbb\xe5\x90\xa7\xef\xbc\x81\xe4\xb8\x8a\xe5\xb8\x9d'
解除隔离吧!上帝
解除隔离吧!上帝

3.URL编码

3.1 简介
正常的URL中是只能包含ASCII字符的,也就是字符、数字和一些符号。而URL编码就是一种浏览器用来避免url中出现特殊字符(如汉字)的编码方式。其实就是将超出ASCII范围的字符转换成带%的十六进制格式。

3.2 URL为何要编码、解码

通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如Size过大,包含隐私数据。对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义。

例如,Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。

又如,Url的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,例如中文。否则如果客户端浏览器和服务端浏览器支持的字符集不同的情况下,中文可能会造成问题。

方法 说明
urllib.quote(url) 对url进行编码
urllib.unquote(deurl) 对已经url编码的解码

代码演示:

from urllib import parse

a = parse.quote("赶紧解封吧!")
print(a)
b = parse.unquote(a)
print(b)

运行结果:

%E8%B5%B6%E7%B4%A7%E8%A7%A3%E5%B0%81%E5%90%A7%EF%BC%81
赶紧解封吧!

4.Base64编码

4.1简介

Base64是一种用64个字符来表示任意二进制数据的方法。

Base64编码可以成为密码学的基石。可以将任意的二进制数据进行Base64编码。所有的数据都能被编码为并只用65个字符就能表示的文本文件。( 65字符:A~Z a~z 0~9 + / = )编码后的数据~=编码前数据的4/3,会大1/3左右。

4.2 Base64编码的原理

  • 将所有字符转化为ASCII码。
  • 将ASCII码转化为8位二进制 。
  • 将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位。
  • 统一在6位二进制前补两个0凑足8位。
  • 将补0后的二进制转为十进制。
  • 从Base64编码表获取十进制对应的Base64编码。

4.3 Base64编码的说明

  • 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
  • 数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
  • 不断进行,直到全部输入数据转换完成。
  • 如果最后剩下两个输入数据,在编码结果后加1个“=”。
  • 如果最后剩下一个输入数据,编码结果后加2个“=”。
  • 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。

4.4 Python的Base64使用

Python内置的base64模块可以直接进行base64的编解码
注意:用于base64编码的,要么是ASCII包含的字符,要么是二进制数据

import base64
str11 = "赶紧解封吧!"
en_str = base64.b64encode(str11.encode())
print(en_str)

de_str = base64.b64decode(en_str).decode()
print(de_str)

输出:

b'6LW257Sn6Kej5bCB5ZCn77yB'
赶紧解封吧!

5.MD5(信息-摘要算法)

5.1 简述
message-digest algorithm 5(信息-摘要算法)。经常说的“MD5加密”,就是它→信息-摘要算法。

md5,其实就是一种算法。可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。这个串,基本上是唯一的。

5.2 不可逆性

每个人都有不同的指纹,看到这个人,可以得出他的指纹等信息,并且唯一对应,但你只看一个指纹,是不可能看到或读到这个人的长相或身份等信息。

5.3 特点

  • 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
  • 容易计算:从原数据计算出MD5值很容易。
  • 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
  • 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

5.4 Python的MD5使用

import hashlib

# 待加密信息
str = '赶紧解封吧!'
# 创建md5对象,
# md5对象,md5不能反解,但是加密是固定的,就是关系是一一对应,所以有缺陷,可以被对撞出来
hl = hashlib.md5()
# 要对哪个字符串进行加密,就放这里
# 此处必须声明encode
# 若写法为hl.update(str)  报错为: Unicode-objects must be encoded before hashing
hl.update(str.encode(encoding='utf-8'))

print('MD5加密前为 :' + str)
# hl.hexdigest()) # 拿到加密字符串
print('MD5加密后为 :' + hl.hexdigest())

hash3 = hashlib.md5(bytes('abd', encoding='utf-8'))
'''
如果没有参数,所以md5遵守一个规则,生成同一个对应关系,如果加了参数,
就是在原先加密的基础上再加密一层,这样的话参数只有自己知道,防止被撞库,
因为别人永远拿不到这个参数
'''
hash3.update(bytes("admin", encoding="utf-8"))
print(hash3.hexdigest())  # 9aea3c0a6c51555c1a4d0a5e9b689ded

运行结果:

MD5加密前为 :赶紧解封吧!
MD5加密后为 :3d2d2e10bcd07a1d5d94a7d35c0b7c79
9aea3c0a6c51555c1a4d0a5e9b689ded

MD5不仅仅是上面这个例子这样用来处理字符串,还有更广泛的用途:

  • 加密网站注册用户的密码。
  • 网站用户上传图片 / 文件后,计算出MD5值作为文件名。(MD5可以保证唯一性)
  • key-value数据库中使用MD5值作为key。
  • 比较两个文件是否相同。(大家在下载一些资源的时候,就会发现网站提供了MD5值,就是用来检测文件是否被篡改)

5.5 MD5长度

md5的长度,默认为128bit,也就是128个0和1的二进制串。这样表达是很不友好的。所以将二进制转成了16进制,每4个bit表示一个16进制,所以128/4 = 32 换成16进制表示后,为32位了。

为什么网上还有md5是16位的呢?
其实16位的长度,是从32位md5值来的。是将32位md5去掉前八位,去掉后八位得到的。

猜你喜欢

转载自blog.csdn.net/weixin_38819889/article/details/107100877