爬虫圈,常见的加密手段,你应该了解一下

news2024/9/22 15:37:25

常见加密手段

实验介绍

本实验为大家介绍一下常见的加密技术,掌握之后,可以在反爬时加入各加密算法,从而提高爬虫采集难度,本实验为大家介绍三类加密,其一是消息摘要算法/签名算法,其二是对称加密,最后一种是非对称加密,每一类型,都通过 Python 代码进行实践。特别提醒,本实验内容不会对加密算法底层逻辑进行解析,学习重点在应用层。

知识点

  • 消息摘要算法/签名算法实践
  • 对称加密算法实践
  • 非对称加密算法实践

消息摘要算法/签名算法

md5 加密

md5 信息摘要算法,是最常用的密码散列函数,其可以产生 128 位的散列值,也就是 128 个 0 和 1 的二进制串,由于长度太长,故将二进制转换成了 16 进制,每 4 位表示一个十六进制,因此常见的 md5 都是 32 位。

在实践中还存在 16 位的 md5 值,该值是将 32 位 md5 去掉前 8 位,去掉后 8 位得到。

Code 目录建立 15_demo 文件夹,然后创建 md5_demo.py 文件,示例代码如下所示:

import hashlib

my_str = '梦想橡皮擦'
hl = hashlib.md5()
hl.update(my_str.encode("utf8"))
hl_my_str = hl.hexdigest()

# 加密之后的数据
print(hl_my_str)

# 加入参数,防止被撞库
hl2 = hashlib.md5(bytes('加盐', encoding='utf-8'))
hl2.update(my_str.encode("utf-8"))
hl2_str = hl2.hexdigest()
print(hl2_str)

md5 信息摘要算法其不可逆,并且有如下特点:

  • 压缩性:任意长度的数据,计算出 md5 长度固定;

  • 易计算:md5 模块使用便捷,计算方便;

  • 抗修改:md5 的原始数据做任何修改,都会导致 md5 发生变化;

  • 抗碰撞:加参数之后,被撞库的概率极低。

写python爬虫,你永远绕不过去代理问题

SHA1 加密

SHA1 安全哈希算法,是一种数字签名算法,其基于 md5 ,加密后会产生一长度 160 位的散列值,比 md5 多了 32 位,故安全性更高,但速度较慢。

import hashlib

str = "梦想橡皮擦"

a = hashlib.sha1(str.encode("utf-8")).hexdigest()
print("sha1 加密前,字符串为",str)

print("sha1 加密后,字符串为",a)

对称加密算法

DES 加密

DES 是一种比较传统的数据加密标准,属于对称加密,即通过密钥可以还原密码为明文。

在 Python 中可以通过 pyDes 库实现,使用命令 pip3 install pyDes 安装库。

创建 des_demo.py,代码如下所示:

import base64
from pyDes import *

Des_Key = "xiangpia" # 自定义 Key,长度为 8

Des_IV = "12345678" # 自定义 IV 向量


# 加密函数
def DesEncrypt(code, key=None, iv=None):
    if key is None:
        key=Des_Key
    if iv is None:
        iv=Des_IV

    k = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5)
    EncryptStr = k.encrypt(code)
    return base64.b64encode(EncryptStr)

# 解密函数
def DesDecrypt(encode, key=None, iv=None):
    if key is None:
        key=Des_Key
    if iv is None:
        iv=Des_IV

    k = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5)
    b64str = base64.b64decode(encode)
    return k.decrypt(b64str)


if __name__ == '__main__':
    ret = DesEncrypt("hello lanqiao")
    print(ret)

运行代码,得到下述输出:

图片描述

上述代码中比较重要的内容如下所示:

# 加密核心函数
k = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5)

其中 key 相当于是加密盐,CBC 是加密模式,iv 是加密向量,pad 填充值,padmode 是填充方式,具体说明如下:

初始向量

初始向量缩写为 iv,一般也称作初始变数,它可以与密钥结合使用,为固定长度的值,在实战中一般使用随机数初始化。

加密模式

目前主流的加密和数字认证算法,基本都采用块加密,即将明文分成大小相等的数据块,然后执行加密算法,常见的模式说明如下所示,有兴趣的可以单独进行深入学习:

  • ECB:电子密码本模式,密文被分隔成长度相等的块,单独进行加密;

  • CBC:密码块连接模式,使用循环的形式,将前一块的密文和当前块异或之后再加密;

  • CFB:密码反馈模式,翻转的 CBC 模式;

  • OFB:输出反馈模式;

  • CTR:计数器模式。

填充方式 padmode

由于 des 需要将明文分成大小相等的数据块,所以最后一块数据在加密前需要进行填充,常见的填充形式有:

  • PKCS7:假设数据长度需要填充 n 个字节,那就填充 n 个字节,并且每个字节的大小都是 n;

  • PKCS5:PKCS7 的子集,块大小固定为 8 字节;

  • ZeroPadding:所有字节填充为 0;

  • ISO10126:填充字节为随机数值。

AES 加密

AES 是一种高级加密标准,一般情况下用来替代 DES,故二者逻辑基本一致,实现该加密算法,需要使用 Crypto 库实现,先用命令 pip3 install pycryptodome 进行安装。

建立 aes_demo.py 文件,然后导入模块并定义全局变量。

import base64
from Crypto.Cipher import AES

iv = '1234567887654321'
key = 'xiangxiangxiang1'

data = 'hello lanqiao'

代码说明如下:

  • iv:初始向量;

  • key:密钥,长度是 128 bit,故使用长度为 16 的字符串;

  • data:待加密数据。

接下来编写加密函数:

import base64
from Crypto.Cipher import AES

iv = '1234567887654321'
key = 'xiangxiangxiang1'  # 长度为 16
data = 'hello lanqiao'


# 由于 AES 区块固定为 128 bit,所以字节长度最低需要16位
def pad(data):
    pad_data = data
    for i in range(0, 16 - len(data)):
        pad_data = pad_data + ' '
    return pad_data


# 实现 AES 加密
def aes_encode(key, data):

    # 将长度补齐到 16 位
    if len(data) < 16:
        data = pad(data)
    # 初始化 aes 对象,模式为 CBC
    aes_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
    # 执行加密方法
    aes_en_str = aes_obj.encrypt(data.encode("utf-8"))
    # 进行 base64编码
    aes_en_str = base64.b64encode(aes_en_str)
    # 转换成字符串
    aes_en_str = aes_en_str.decode("utf-8")
    return aes_en_str


if __name__ == '__main__':
    data = aes_encode(key, data)
    print(data)

密文解码函数如下所示:

def aec_de(key, data):
    # 密文进行二进制编码
    data = data.encode("utf-8")
    # 解 base64 编码
    data = base64.b64decode(data)

    aes_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
    # 解密
    aes_de_str = aes_de_obj.decrypt(data)
    # 去空格
    aes_de_str = aes_de_str.strip()
    # 明文解码
    aes_de_str = aes_de_str.decode("utf-8")
    return aes_de_str


if __name__ == '__main__':
    data = aes_encode(key, data)
    ret = aec_de(key, data)
    print(ret)

非对称加密算法

采用两个密钥进行加密和解密,对应的分别是公钥和私钥,如使用公钥对数据加密,则必须使用私钥解密。

RSA 加密算法

RSA 加密算法时常见的 非对称加密算法,该算法效率比较低,所以一般用于重要数据加密,在 Python 中可以使用 Crypto 库实现该算法,上文已经对该库进行了安装。

下面优先生成公钥和私钥。

from Crypto import Random
from Crypto.PublicKey import RSA

# 生成伪随机数
random_gen = Random.new().read
# 生成秘钥对实例对象,其中 1024 是秘钥的长度

rsa = RSA.generate(1024, random_gen)
# 获取私钥,保存到文件

private_pem = rsa.exportKey()
with open('private.pem', 'wb') as f:
    f.write(private_pem)
# 获取公钥,保存到文件
public_pem = rsa.publickey().exportKey()
with open('public.pem', 'wb') as f:
    f.write(public_pem)

公钥创建完毕之后,就可以使用其进行加密了,代码如下。

import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

msg = "梦想橡皮擦"
# 读取公钥
key = open('public.pem').read()
public_key = RSA.importKey(key)
# 加密
pk = PKCS1_v1_5.new(public_key)
encrypt_text = pk.encrypt(msg.encode())
# 加密后进行 base64 编码
result = base64.b64encode(encrypt_text)
# 转换成字符串
result_str = bytes.decode(result)
print(result)
print(result_str)

运行代码得到如下结果:

图片描述

解密需要通过私钥进行,从 private.pem 读取私钥,然后调用 PKCS1_v1_5.new(private_key).decrypt() 方法即可实现,示例代码如下所示:

import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from Crypto import Random

key = open('private.pem').read()
private_key = RSA.importKey(key)

cipher = PKCS1_v1_5.new(private_key)

# random_generator = Random.new().read
# 待解密字符串:lwiHsq3ZCa6+AogrAm5fMAJrkFvWu5aT2D9znAo3JqnLez3GLvhofQzmI2QaNL5ToCxp9SnngsLiG4weE4V/tavy9q0hVjzHofWOPri4ZfdMFtKWsRUUZwR3ifNaJTmDcmGBX6su5ES3KgL7wGUF1qQgQcpEaY/aKKb/IP5fPJw=
text = cipher.decrypt(base64.b64decode("lwiHsq3ZCa6+AogrAm5fMAJrkFvWu5aT2D9znAo3JqnLez3GLvhofQzmI2QaNL5ToCxp9SnngsLiG4weE4V/tavy9q0hVjzHofWOPri4ZfdMFtKWsRUUZwR3ifNaJTmDcmGBX6su5ES3KgL7wGUF1qQgQcpEaY/aKKb/IP5fPJw="), None)
print(text.decode('utf8'))

运行代码可以得到前文加密内容,临摹该案例注意公钥和私钥的搭配使用。

Base64 编码

Base64 是一种常见 8 位字节编码方式,由于 Base64 编码不可读,所以其也会被用于加密,在 Python 中,可以使用内置 base64 模块进行编码和解码,注意只能用包含 ASCII 的字符或二进制数据进行编码。

示例代码如下所示:

import base64

a = base64.b64encode(b"hello world")
print(a)

b = base64.b64decode(b'aGVsbG8gd29ybGQ=')
print(b)

运行代码输出结果如下所示:

b'aGVsbG8gd29ybGQ='
b'hello world'

Base 64 编码经常出现在其它加密代码中,所以是必备技能。

总结

本实验为大家介绍了三大类加密方式,每种加密方式下都包含多种加密实现,学习不同的加密算法,并将其合理的应用到自己的站点中,可以整体提高爬取难度。

在后续的学习中,可以对每种加密算法进行深入学习,了解其原理和实现,从而在实战项目中,将多种加密手段搭配使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/341621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十四、MySQL 约束详解

文章目录一、定义完整性约束1.1 实体完整性1.1.1 主键约束1.1.2 自增列&#xff1a;AUTO_INCREMENT1.1.3 候选键约束或唯一约束(UNIQUE KEY)1.2 用户定义完整性1.2.1 非空约束1.2.2 CHECK约束1.2.3 DEFAULT约束1.3 参照完整性1.3.1 FOREIGN KEY 约束的作用1.3.2 主表(父表)从表…

趣味三角——第10章——(sinx)/x

第10章 函数(sinx)/x I call our world Flatland, not because we call it so, but to make its nature clear to you, my happy readers, who are privileged to live in Space. (我称我们的世界为平面国&#xff0c;这样称呼它并不是我的本意&#xff0c;而是为了让你们明…

【Linux】Rsync基于rsync-daemon认证的使用(rsync服务端与客户端发配置、排错思路、使用示例、优缺点及使用场景)

一、Rsync基于rsync-daemon认证的使用与 ssh 认证不同&#xff0c;rsync 协议认证不需要依赖远程主机的 sshd 服务&#xff0c;但需要远程主机开启 rsyncd 服务&#xff0c;本地 rsyncd 服务可不必开启。另外&#xff0c;rsync 协议认证不是直接使用远程主机的真实系统账号&…

【C++之容器篇】造轮子:list的模拟实现与使用

目录前言一、关于list1. 简介2. 成员类型二、默认成员函数1. 构造函数1. list()2. list(size_t n,const T& val T())和list(InputIterator first,InputIterator last)2. 拷贝构造函数3. 析构函数4. 赋值运算符重载函数三、迭代器1. 普通对象的正向迭代器2. const对象的正向…

多线程

标题创建多线程方式一&#xff1a;继承线程中常用方法和优先级多窗口卖票创建多线程方式二&#xff1a;实现Runnable接口多窗口卖票&#xff08;使用Runable方式&#xff09;进程的生命周期同步代码块解决实现Runable的线程安全问题方法一方法二使用同步方法处理实现Runable的线…

结构体熟练掌握--实现通讯录

魔王的介绍&#xff1a;&#x1f636;‍&#x1f32b;️一名双非本科大一小白。魔王的目标&#xff1a;&#x1f92f;努力赶上周围卷王的脚步。魔王的主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王.&#x1f525;&#x1f525;&#x1f525; ❤️‍&#x1…

帮助中心在线制作工具推荐这4款,很不错哟!

根据用户咨询问题是否解决的情景&#xff0c;分为三个部分&#xff0c;首先帮助中心恰好有用户需要咨询的问题&#xff0c;用户可以通过点击相关问题即可解决自己的问题&#xff0c;其次&#xff0c;用户第一眼没有在帮助中心解决问题&#xff0c;有个搜索框&#xff0c;用户的…

为什么开发人员应该在 2023 年学习 Docker 和 Kubernetes

开发者你好&#xff0c;如果你想在 2023 年学习新的工具和技术&#xff0c;那么你应该考虑学习 Docker 和 Kubernetes&#xff0c;这是在这个微服务和云计算时代创建和管理容器的两个最重要的工具。随着微服务和云计算的兴起&#xff0c;Docker 和 Kubernetes 已经成为软件开发…

gg又来深圳

我们都喜欢的DGGgg是我在TCL的朋友&#xff0c;刚毕业的我们在TCL度过了一段非常欢快的时光&#xff0c;gg也是我们几十人中在TCL呆的特别久的&#xff0c;先是在深圳&#xff0c;然后转去了惠州&#xff0c;后面在惠州买房、结婚、定居、生娃。前几年举家回了西安、也从TCL离职…

ChatGPT到底是个啥 - 它甚至会和狗说话

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

2023.2.12(总结)

今天主要就是下午进行了一个测试&#xff0c;有三个困难版的题目我没有写出来&#xff0c;打算今天晚上好好磨磨&#xff0c;这里主要就只放一个题目。 C - Don’t be cycle Editorial / Time Limit: 2 sec / Memory Limit: 1024 MB Score : 300300 points Problem Statemen…

Spring缓存指定Redis做为缓存中间件Demo笔记

文档地址D:/Test10/redisdemo和springcachedemo E:/FTPshangchuang/smbms 一下是SpringBoot整合Redis的初略配置,引入Redis依赖 想自己测试的话 链接&#xff1a;https://pan.baidu.com/s/14hdBzdjtFu0lYmZUhy_DuA 提取码&#xff1a;j0m8 Redis配置文件 package com…

总览 Java 容器--集合框架的体系结构

前言 我们在讲 Java 的数据类型的时候&#xff0c;单独介绍过数组&#xff0c;数组也确实是开发程序中常用的内存类型之一&#xff0c;不过 Java 内置的数组限制颇多&#xff0c;所以此后扩展出了List这种结构&#xff0c;与之类似的Set、Queue 这些内存中的容器都被放在了 Co…

浅谈明暗水印

前言 水印&#xff08;Watermark&#xff09;是一种能让人识别纸上图案的技术&#xff0c;当光线照射纸张时&#xff0c;纸张上会显现出各种不同阴影&#xff0c;这些阴影组成的图案就是水印。 水印常常起到验证货币、护照、邮票、政府文件或者其他纸制文件的真实性的作用。 …

什么是热迁移?90%的企业都理解错误

科技的发展&#xff0c;新冠的冲击&#xff0c;让市场竞争愈发激烈。尽管云计算服务为企业免除了基础硬件的建设和维护成本&#xff0c;当企业需要进行业务跨架调整、升级维护、环境测试等场景而进行云迁移&#xff0c;其过程中所带来的停机时间&#xff0c;就变得尤为头疼了。…

清亡之路(4):最受误解的东南互保

很多人一提“东南互保”&#xff0c;就认为是东南是在反叛。如果仔细看&#xff0c;其实根本谈不上造反&#xff0c;反而是更像是一种“遵旨行事”。本文就是说说这个问题。宣战是来真的吗&#xff1f;1900年6月21日&#xff0c;慈禧忍无可忍&#xff0c;决定和各公使馆翻脸&am…

给你的边框加点渐变

目录前言border-imageborder-image实现background父子divbackgorund一个div一个伪元素background-clip&#x1f9e8;&#x1f9e8;&#x1f9e8; 大家好&#xff0c;我是搞前端的半夏 &#x1f9d1;&#xff0c;一个热爱写文的前端工程师 &#x1f4bb;. 如果喜欢我的文章&…

spring cloud

文章目录 目录 文章目录 前言 一、spring cloud 二、ribbon负载均衡 三、openfeign 总结 前言 微服务就是一种将一个单一应用程序拆分为一组小型服务的方法&#xff0c;拆分完成后&#xff0c;每一个服务都运行在独立的进程中&#xff0c;服务于服务之间采用轻量级的通信机制来…

我不允许你还不知道CSS的filter的drop-shadow阴影用法以及与box-shadow的区别详解

这里有两个图片的阴影&#xff0c;你觉得哪个好看&#xff1f; 一个是使用box-shadow另一个是使用filter: drop-shadow 一、我们来了解一下CSS的filter&#xff08;过滤器&#xff09; 该CSS的filter属性可以实现很多效果 &#xff08;一&#xff09;filter: blur(5px) // 高…

Elasticsearch索引库和文档的相关操作

前言&#xff1a;最近一直在复习Elasticsearch相关的知识&#xff0c;公司搜索相关的技术用到了这个&#xff0c;用公司电脑配了环境&#xff0c;借鉴网上的课程进行了总结。希望能够加深自己的印象以及帮助到其他的小伙伴儿们&#x1f609;&#x1f609;。 如果文章有什么需要…