置信大家在数据抓取的时候,会碰到很多加密的参数,例如像是“token”、“sign”等等,明天小编就带着大家来盘点一下数据抓取过程中这些支流的加密算法,它们有什么特色、加密的形式有哪些等等,晓得了这些之后对于咱们逆向破解这些加密的参数会起到不少的帮忙!
根底常识
首先咱们须要明确的是,什么是 加密和解密?顾名思义
- 加密(Encryption): 将明文数据变换为密文的过程
- 解密(Decryption): 加密的逆过程,即由密文复原出原明文的过程。
加密和解密算法的操作通常都是在一组密钥的管制下进行的,别离成为是加密密钥 (Encryption Key) 和解密密钥(Decryption Key),如下图所示
而加密算法当中又分为是对称加密和非对称加密以及散列算法,其中
- 对称加密:即加密与解密时应用的是雷同的密钥,例如 RC4、AES、DES 等加密算法
- 非对称加密:即加密与解密时应用不雷同的密钥,例如 RSA 加密算法等
- 散列算法:又称为是哈希函数。对不同长度的输出音讯产生固定的输入,该输入值就是散列值
Base64 伪加密
Base64
严格意义上来说不算做事加密的算法,只是一种编码的形式,它是一种用 64 个字符,别离是 A-Z
、a-z
、0-9
、+
、/
这 64 个字符,实现对数据的编码,可用于在 HTTP
环境下传递较长的标识信息。采纳 Base64
编码具备不可读性,须要解码后能力浏览。咱们应用 Python
来对任意网址进行 Base64
的编码操作,代码如下
import base64
# 想将字符串转编码成 base64, 要先将字符串转换成二进制数据
url = "www.baidu.com"
bytes_url = url.encode("utf-8")
str_url = base64.b64encode(bytes_url) # 被编码的参数必须是二进制数据
print(str_url)
output
b'd3d3LmJhaWR1LmNvbQ=='
那么同样地,咱们也能够对其进行解码的操作,代码如下
url = "d3d3LmJhaWR1LmNvbQ=="
str_url = base64.b64decode(url).decode("utf-8")
print(str_url)
output
www.baidu.com
MD5 加密
MD5
是一种被宽泛应用的线性散列算法,且加密之后产生的是一个固定长度 (32 位或者是 16 位) 的数据,由字母和数字组成,大小写对立。其最初加密生成的数据 是不可逆的,也就是说不可能轻易地通过加密后的数据还原到原始的字符串,除非是通过暴力破解的形式。
咱们在 Python 当中来实现一下 MD5
加密
import hashlib
str = 'this is a md5 demo.'
hl = hashlib.md5()
hl.update(str.encode(encoding='utf-8'))
print('MD5 加密前为:' + str)
print('MD5 加密后为:' + hl.hexdigest())
output
MD5 加密前为:this is a md5 demo.
MD5 加密后为:b2caf2a298a9254b38a2e33b75cfbe75
就像上文提到的,针对 MD5 加密能够通过暴力破解的形式来升高其安全性,因而在实操过程当中,咱们会增加盐值 (Salt) 或者是双重 MD5 加密等形式来减少其可靠性,代码如下
# post 传入的参数
params = "123456"
# 加密后需拼接的盐值(Salt)
salt = "asdfkjalksdncxvm"
def md5_encrypt():
m = md5()
m.update(params.encode('utf8'))
sign1 = m.hexdigest()
return sign1
def md5_encrypt_with_salt():
m = md5()
m.update((md5_encrypt() + salt).encode('utf8'))
sign2 = m.hexdigest()
return sign2
AES/DES 对称加密
首先咱们来讲 DES
加密,全称是 Data Encryption Standard
,即数据加密规范,在对称性加密当中比拟常见的一种,也就是加密和解密过程当中应用的密钥是雷同的,因而想要破解的话,通过暴力枚举的形式,只有计算的能力足够强还是能够被破解的。AES
的全称是 Advanced Encryption Standard
,是DES
算法的替代者,也是当今最风行的对称加密算法之一。想要弄清楚 AES
算法,首先就得弄明确三个根本的概念:密钥、填充和模式。
密钥
密钥咱们之前曾经说了很多了,大家能够将其设想成是一把钥匙,既能够用其来进行上锁,能够用其来进行解锁。AES 反对三种长度的密钥:128 位、192 位以及 256 位。
填充
而至于 填充
这一概念,AES 的分组加密的个性咱们须要理解,具体如下图所示
简略来说,AES
算法在对明文加密的时候,并不是把整个明文一股脑儿地加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块的长度为 128 比特。这些明文块通过 AES
加密器的简单解决之后,生成一个个独立的密文块,将这些密文块拼接到一起就是最终的 AES
加密的后果了。那么这里就有一个问题了,要是有一段明文的长度是 196 比特,如果依照每 128 比特一个明文块来拆分的话,第二个明文块只有 64 比特了,有余 128 比特该怎么办呢?这个时候就轮到 填充
来发挥作用了,默认的填充形式是 PKCS5Padding
以及ISO10126Padding
。不过在 AES 加密的时候应用了某一种填充形式,解密的时候也必须采纳同样的填充形式。
模式
AES
的工作模式,体现在了把明文块加密成密文块的处理过程中,次要有五种不同的工作模式,别离是 CBC
、ECB
、CTR
、CFB
以及 OFB
模式,同样地,如果在 AES 加密过程当中应用了某一种工作模式,解密的时候也必须采纳同样地工作模式。最初咱们用 Python
来实现一下 AES
加密
import base64
from Crypto.Cipher import AES
def AES_encrypt(text, key):
pad = 16 - len(text) % 16
text = text + pad * chr(pad)
text = text.encode("utf-8")
encryptor = AES.new(key.encode('utf-8'), AES.MODE_ECB)
encrypt_text = encryptor.encrypt(text)
encrypt_text = base64.b64encode(encrypt_text)
return encrypt_text.decode('utf-8')
或者大家也能够看一下网上其余的 AES
加密算法的实现过程,基本上也都是大同小异的,因为篇幅无限,明天临时就先介绍到这里,前面要是大家感兴趣的话,会去分享一下其余加密算法的实现原理与特色。
以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python 编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩 Python 电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。