爬虫中的常见加密算法

基础知识

什么是加密和解密

  1. 加密(Encryption): 将明文数据变换为密文的过程
  2. 解密(Decryption): 加密的逆过程,即由密文恢复出原明文的过程

加密和解密算法的操作通常都是在一组密钥的控制下进行的,分别成为是加密密钥(Encryption Key)和解密密钥(Decryption Key)


加密与解密示意图.png

而加密算法当中又分为是对称加密和非对称加密以及散列算法,其中

  1. 对称加密:
    即加密与解密时使用的是相同的密钥,例如RC4、AES、DES等加密算法
  2. 非对称加密:
    即加密与解密时使用不相同的密钥,例如RSA加密算法等
  3. 散列算法:
    又称为是哈希函数。对不同长度的输入消息产生固定的输出,该输出值就是散列值

加密算法

1. Base64

Base64严格意义上来说不算做事加密的算法,只是一种编码的方式,它是一种用64个字符,分别是A-Z、a-z、0-9、+、/这64个字符,实现对数据的编码,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

import base64

# Base64编码实现
url = "www.baidu.com"
bytes_url = url.encode("utf-8")
str_url = base64.b64encode(bytes_url)  # 被编码的参数必须是二进制数据
print(str_url)

# 输出结果为:b'd3d3LmJhaWR1LmNvbQ=='
#Base64解码实现

url = "d3d3LmJhaWR1LmNvbQ=="
str_url = base64.b64decode(url).decode("utf-8")
print(str_url)

#输出结果为:www.baidu.com

1. MD5

MD5是一种被广泛使用的线性散列算法,且加密之后产生的是一个固定长度(32位或者是16位)的数据,由字母和数字组成,大小写统一。其最后加密生成的数据是不可逆的,也就是说不能够轻易地通过加密后的数据还原到原始的字符串,除非是通过暴力破解的方式。


#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())


#输出结果为
#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

AES的全称是Advanced Encryption Standard,是DES算法的替代者,也是当今最流行的对称加密算法之一。

其中有三个基本概念:

  1. 密钥

密钥可以当作是一把钥匙,既可以用其来进行上锁,可以用其来进行解锁。AES支持三种长度的密钥:128位、192位以及256位。

  1. 填充

要了解填充,我们需要对AES的分组加密的特性进行了解

  1. 模式

AES的工作模式,体现在了把明文块加密成密文块的处理过程中,主要有五种不同的工作模式,分别是CBC、ECB、CTR、CFB以及OFB模式,同样地,如果在AES加密过程当中使用了某一种工作模式,解密的时候也必须采用同样地工作模式


import base64
#安装python的Crypto包有坑可以搜索解决
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')

至于其他的加密算法,我们后面继续进行了解,先对以上的base64、MD5、AES这些先掌握,后面我们探讨一下,DES、3DES,RAS、BASE58等等内容

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 介绍 数字签名、信息加密 是前后端开发都经常需要使用到的技术,应用场景包括了用户登入、交易、信息通讯、oau...
    luckyYU阅读 10,676评论 1 6
  • 1. 前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。 所...
    python追求者阅读 1,016评论 0 0
  • 在项目开发过程中,当我们利用数据库存储一些关于用户的隐私信息,诸如密码、帐户密钥等数据时,需要加密后才向数据库写入...
    witchiman阅读 2,717评论 0 0
  • 对称加密算法和非对称加密算法 对称加密算法: 加密方和解密方共享一个密匙,通过密匙可以看到密文和明文,密匙就是加密...
    walker_liu_fei阅读 815评论 0 0
  • 简介 本文总结了在爬虫中常见的各种加密算法、编码算法的原理、在 JavaScript 中和 Python 中的基本...
    K哥爬虫阅读 584评论 0 0