当前位置: 首页 > 后端技术 > Python

Python爬虫中常用的加密算法盘点

时间:2023-03-25 21:35:21 Python

相信大家在抓取数据的时候,都会遇到很多加密参数,比如“token”、“sign”等,今天就带大家盘点一下吧看看数据抓取过程中的这些主流加密算法,它们有什么特点,加密方式有哪些等等,了解这些,对我们逆向破解这些加密参数有帮助!基本常识首先我们需要了解的是,什么是加密和解密?顾名思义,加密(Encryption):将明文数据转化为密文的过程。解密(Decryption):加密的逆过程,即从密文中恢复出原始明文的过程。加密和解密算法的运算通常是在一组密钥的控制下进行的,这组密钥称为加密密钥(EncryptionKey)和解密密钥(DecryptionKey),如下图所示,加密算法分为分为对称加密、非对称加密和哈希算法,其中对称加密:即加密和解密使用相同的密钥,如RC4、AES、DES等加密算法非对称加密:即加密和解密解密都不是同一个密钥,比如哈希算法比如RSA加密算法:也叫哈希函数。为不同长度的输入消息生成固定输出。输出值为哈希值Base64伪加密。严格来说,Base64并不是一种用于加密的算法。它只是一种编码方法。就是A-Z、a-z、0-9、+、/这64个字符,实现了数据的编码,可以用来在HTTP环境下传输长标识信息。base64编码是不可读的,需要解码后才能读取。我们使用Python对任意URL进行Base64编码操作。代码如下importbase64#如果要将字符串转成base64,首先要将字符串转成二进制数据url="www.baidu.com"bytes_url=url.encode("utf-8")str_url=base64.b64encode(bytes_url)#编码后的参数必须是二进制数据print(str_url)outputb'd3d3LmJhaWR1LmNvbQ=='那么同样的,我们也可以解码,代码如下url="d3d3LmJhaWR1LmNvbQ=="str_url=base64.b64decode(url).decode("utf-8")print(str_url)outputwww.baidu.comMD5加密MD5是一种广泛使用的线性哈希算法,加密后生成的是定长(32位或16位))由大小写统一的字母和数字组成的数据。最终加密生成的数据是不可逆的,也就是说加密后的数据不能轻易恢复成原来的字符串,除非被暴力破解。让我们在Python中实现MD5加密importhashlibstr='thisisamd5demo.'hl=hashlib.md5()hl.update(str.encode(encoding='utf-8'))print('BeforeMD5encryptionFor:'+str)print('MD5afterencryption:'+hl.hexdigest())MD5加密前的输出:这是一个md5演示。它的安全性可以通过暴力破解来降低。因此,在实际运行过程中,我们会加入盐值(Salt)或双重MD5加密来增加其可靠性。代码如下#post传入的params="123456"#加密后要拼接的盐值(Salt)salt="asdfkjalksdncxvm"defmd5_encrypt():m=md5()m.update(params.encode('utf8'))sign1=m.hexdigest()返回sign1defmd5_encrypt_with_salt():m=md5()m.update((md5_encrypt()+salt).encode('utf8'))sign2=m.hexdigest()returnsign2AES/DES对称加密首先我们说说DES加密,全称是DataEncryptionStandard,即数据加密标准,在对称加密中比较常见,也就是加密和解密过程中使用的密钥是一样的,所以想要破解的话,需要使用暴力枚举,只要计算能力够强就可以破解。AES的全称是AdvancedEncryptionStandard,是DES算法的替代者,是当今最流行的对称加密算法之一。要理解AES算法,首先要理解三个基本概念:key、padding、mode。密钥我们之前已经谈过很多关于密钥的内容。你可以把它想象成一把钥匙,可以用来上锁和解锁。AES支持三种密钥长度:128位、192位和256位。填充关于填充的概念,我们需要了解AES块加密的特点,如下图所示。简单的说,AES算法在加密明文的时候,并不是把整个明文加密成一整段密文。,而是将明文分割成单独的明文块,每个明文块的长度为128位。这些明文块经过AES加密器处理后,生成独立的密文块,将这些密文块拼接在一起,得到最终的AES加密结果。那么这里就有问题了。如果有一段明文,长度为196位,如果按照128位的明文块拆分,第二个明文块只有64位,小于128位怎么办?这时候就轮到padding发挥作用了。默认的填充方法是PKCS5Padding和ISO10126Padding。但是AES加密中使用了某种填充方式,解密时也必须使用相同的填充方式。模式AES的工作模式体现在将明文块加密成密文块的过程。有五种不同的工作模式,即CBC、ECB、CTR、CFB和OFB模式。同样,如果在AES加密过程中采用了某种工作模式,那么在解密时也必须采用相同的工作模式。最后我们使用Python实现AES加密importbase64fromCrypto.CipherimportAESdefAES_encrypt(text,key):pad=16-len(text)%16text=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)返回encrypt_text.decode('utf-8')或者你也可以看看网上其他AES加密算法的实现过程。他们基本上是一样的。由于篇幅有限,暂时先介绍到这里。如果大家有兴趣,我稍后再分享。其他加密算法的实现原理和特点。以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能收到海量学习资料,涵盖Python电子书和教程,数据库编程、Django、爬虫、云计算等。或者去编程学习网了解更多编程技术知识。