常见的爬虫算法
1.base64加密
base64是什么
Base64编码,是由64个字符组成编码集:26个大写字母AZ,26个小写字母az,10个数字0~9,符号“+”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节,然后根据Base64的对应表,得到对应的编码数据。
当原始数据凑不够三个字节时,编码结果中会使用额外的**符号“=”**来表示这种情况。
base64原理
每一个base64的字符会对应有一个索引值(0-63)

将you进行base64编码过程如下:

小于3个字符为一组的编码方式如:

ASCII表:

base64代码演示
加密过程
# 将you进行加密
import base64# 1.先将字符串编码成二进制
data = 'you'.encode("utf-8")
print(data) # 打印结果:b'you'# 2.再将二进制编码成base64的二进制,再由二进制进行解码成字符串
bs = base64.b64encode(data).decode('utf-8')
print(bs) # 打印结果:eW91# 3.如果不够4位加密,则换成等号
data1 = 'y'.encode("utf-8")
bs1 = base64.b64encode(data1).decode("utf-8")
print(bs1) # 打印结果:eQ==
解密过程
# 将eW91进行解密
import base64data = 'eW91'
bs1 = base64.b64decode(data).decode()
print(bs1)data1 = 'eW91eQ=='
bs2 = base64.b64decode(data1).decode()
print(bs1)# 必须是4的倍数
s = "eW91eQ"
# 填充为4的倍数
s += ("=" * (4 - len(s) % 4))
print("填充后", s)
ret = base64.b64decode(s).decode()
print(ret)
js常见的加密方式
- 加密在前端开发和爬虫中是经常遇见的。掌握了加密、解密算法也是你从一个编程小白到大神级别质的一个飞跃。且加密算法的熟练和剖析也是很有助于帮助我们实现高效的js逆向。下述只把我们常用的加密方法进行总结。不去深究加密的具体实现方式。
- 常见的加密算法基本分为这几类,
- 线性散列算法(签名算法)MD5
- 对称性加密算法 AES DES
- 非对称性加密算法 RSA
2.Md5加密(不可逆)
- MD5是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整的一致性。且MD5加密之后产生的是一个固定长度(32位或16位)的数据。
- 结论:一旦看到了一个长度为32位的密文数据,该数据极有可能是通过md5算法进行的加密!
- 解密:
- 常规讲MD5是不存在解密的。但是理论上MD5是可以进行反向暴力破解的。暴力破解的大致原理就是用很多不同的数据进行加密后跟已有的加密数据进行对比,由此来寻找规律。理论上只要数据量足够庞大MD5是可以被破解的。但是要注意,破解MD5是需要考虑破解的成本(时间和机器性能)。假设破解当前的MD5密码需要目前计算能力最优秀的计算机工作100年才能破解完成。那么当前的MD5密码就是安全的。
- 增加破解成本的方法(方法很多,这里只说我常用的)。
- 使用一段无意义且随机的私匙进行MD5加密会生成一个加密串,我们暂且称之为串1
- 将要加密的的数据跟串1拼接,再进行一次MD5,这时会生成串2
- 将串2再次进行MD5加密,这时生成的串3就是我们加密后的数据。
- 我们在注册账号时的密码一般都是用的MD5加密。
Python中使用MD5加密
from hashlib import md5obj = md5()
obj.update("bobo".encode("utf-8"))bs = obj.hexdigest()
print(bs)
JS中使用MD5加密
- JS版本:下载安装crypto-js(npm install crypto-js)
- 前提要安装node.js
var CryptoJS = require('crypto-js'); // 原始数据 var data = '123456'; // 生成MD5摘要 var md5Digest = CryptoJS.MD5(data).toString();console.log(md5Digest);
3.DES/AES加密(可逆)
-
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的算法。该加密算法是一种对称加密方式,其加密运算、解密运算需要使用的是同样的密钥(一组字符串)即可。
-
注意:
- 现在用AES这个标准来替代原先的DES。
- AES和DES的区别:
- 加密后密文长度的不同:
- DES加密后密文长度是8的整数倍
- AES加密后密文长度是16的整数倍
- 应用场景的不同:
- 企业级开发使用DES足够安全
- 如果要求高使用AES
- 加密后密文长度的不同:
-
DES算法的入口参数有三个:
- Key、Data、Mode,padding、iv。
- Key为DES算法的工作密钥;
- Data为要被加密或被解密的数据;
- Mode为DES的工作模式。最常用的模式就是 CBC 模式和 ECB模式
- ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
- CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或后再加密,这样做的目的是增强破解难度。
- padding为填充模式,如果加密后密文长度如果达不到指定整数倍(8个字节、16个字节),填充对应字符
- iv:参数中的iv主要用于CBC模式,确保即使加密相同的明文,每次产生的密文也不相同,增强加密的安全性。iv通常是一个16字节的随机字符串。这个字符串在解密时也需要用到,因此需要妥善保存。
- Key、Data、Mode,padding、iv。
-
Python版本:
-
环境安装:
pip install pycryptodome
-
python加密代码:
```
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
import os
key_value = os.getenv('KEY')key = '0123456789abcdef'.encode() # 秘钥: 必须16字节
iv = b'abcdabcdabcdabcd' # 偏移量:16位/字节(字节类型)
text = 'alex is a monkey!' # 加密内容
# 设置加密内容的长度填充(位数为16的整数倍)
text = pad(text.encode(), 16)
# 创建加密对象
aes = AES.new(key, AES.MODE_CBC, iv) # 创建一个aes对象en_text = aes.encrypt(text) # 加密明文
print("aes加密数据:::", en_text) # 返回二进制类型数据# 二进制密文转换成字符串格式
en_text = base64.b64encode(en_text).decode() # 将返回的字节型数据转进行base64编码
print(en_text)
```
python解密
```
from Crypto.Cipher import AES
import base64
from Crypto.Util.Padding import unpadkey = '0123456789abcdef'.encode()
iv = b'abcdabcdabcdabcd'
aes = AES.new(key, AES.MODE_CBC, iv)
# 需要解密的文本
text = 'X/A0fy9S7+kUI3HYQRKO46WTlid6T1DBhXutwmPdboY='.encode()
# 将密文数据转换为二进制类型
ecrypted_base64 = base64.b64decode(text)source = aes.decrypt(ecrypted_base64) # 解密
# 未填充数据
print("aes解密数据:::", source.decode())
# 取消填充数据
print("aes解密数据:::", unpad(source, 16).decode())
```
js加密
const CryptoJS = require("crypto-js")// 密钥(128位,16字节)
var key = CryptoJS.enc.Utf8.parse('0123456789abcdef');// 初始化向量(IV)(128位,16字节)
var iv = CryptoJS.enc.Utf8.parse('1234567890abcdef');// 待加密的数据
var plaintext = 'Hello, bobo!';// 进行AES-128加密,使用CBC模式和PKCS7填充
var encrypted = CryptoJS.AES.encrypt(plaintext, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7
});// 获取加密后的密文
var ciphertext = encrypted.toString();console.log(ciphertext);
js解密
const CryptoJS = require("crypto-js")// 密钥(128位,16字节)
var key = CryptoJS.enc.Utf8.parse('0123456789abcdef');// 初始化向量(IV)(128位,16字节)
var iv = CryptoJS.enc.Utf8.parse('1234567890abcdef');// 密文数据
var encrypText = 'GYc9oxlZB/PeyfFG3ppK6Q==';// 进行加密,使用CBC模式和PKCS7填充
var decrypted = CryptoJS.AES.decrypt(encrypText, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7
});// 解密
var plaintext = decrypted.toString(CryptoJS.enc.Utf8);console.log(plaintext);
4.RSA加密(可逆)
- RSA加密:
- RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。
- 非对称加密算法:
- 非对称加密算法需要两个密钥:
- 公开密钥(publickey:简称公钥)== 数据加密
- 私有密钥(privatekey:简称私钥)==数据解密
- 公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
- 非对称加密算法需要两个密钥:
- 注意:
- 使用时都是使用公匙加密使用私匙解密。公匙可以公开,私匙自己保留。
- 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。
- 使用流程和场景介绍
- 通过公匙加密,使用私匙解密。私匙是通过公匙计算生成的。假设ABC三方之间相互要进行加密通信。大家相互之间使用公匙进行信息加密,信息读取时使用各自对应的私匙进行信息解密
- 用户输入的支付密码会通过RSA加密
- 公钥私钥生成方式:
- 公私匙可以在线生成
- http://web.chacuo.net/netrsakeypair
- 公私匙可以在线生成
- 环境安装:npm install jsencrypt
js加密、解密
window = globalThis;const JSEncrypt = require('jsencrypt');var PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALyBJ6kZ/VFJYTV3vOC07jqWIqgyvHulv6us/8wzlSBqQ2+eOTX7s5zKfXY40yZWDoCaIGk+tP/sc0D6dQzjaxECAwEAAQ==-----END PUBLIC KEY-----';//私钥
var PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvIEnqRn9UUlhNXe84LTuOpYiqDK8e6W/q6z/zDOVIGpDb545NfuznMp9djjTJlYOgJogaT60/+xzQPp1DONrEQIDAQABAkEAu7DFsqQEDDnKJpiwYfUE9ySiIWNTNLJWZDN/Bu2dYIV4DO2A5aHZfMe48rga5BkoWq2LALlY3tqsOFTe3M6yoQIhAOSfSAU3H6jIOnlEiZabUrVGqiFLCb5Ut3Jz9NN+5p59AiEA0xQDMrxWBBJ9BYq6RRY4pXwa/MthX/8Hy+3GnvNw/yUCIG/3Ee578KVYakq5pih8KSVeVjO37C2qj60d3Ok3XPqBAiEAqGPvxTsAuBDz0kcBIPqASGzArumljkrLsoHHkakOfU0CIDuhxKQwHlXFDO79ppYAPcVO3bph672qGD84YUaHF+pQ-----END PRIVATE KEY-----';
//使用公钥加密
var encrypt = new JSEncrypt();//实例化加密对象
encrypt.setPublicKey(PUBLIC_KEY);//设置公钥
var encrypted = encrypt.encrypt('hello bobo!');//对指定数据进行加密
console.log(encrypted);//使用私钥解密// 使用私钥解密
var decrypt = new JSEncrypt();
decrypt.setPrivateKey(PRIVATE_KEY);//设置私钥
var uncrypted = decrypt.decrypt(encrypted);//解密
console.log(uncrypted);
python中RSA创建公钥、私钥
from Crypto.PublicKey import RSA# 通过相关算法生成唯一秘钥,生成密钥对
rsakey = RSA.generate(1024)
# 将秘钥保存到文件中
with open("rsa.public.pem", mode="wb") as f:# 公钥:rsa.public.pemf.write(rsakey.publickey().exportKey())with open("rsa.private.pem", mode="wb") as f:# 私钥:rsa.private.pemf.write(rsakey.exportKey())
python中RSA加密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64# 加密
data = "我喜欢你"
with open("rsa.public.pem", mode="r") as f:pk = f.read()rsa_pk = RSA.importKey(pk)# 基于公钥创建加密对象rsa = PKCS1_v1_5.new(rsa_pk)result = rsa.encrypt(data.encode("utf-8"))# 处理成b64方便传输b64_result = base64.b64encode(result).decode("utf-8")print(b64_result)
python中RSA解密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64data = 'IIw+I9D3YhccQDBpH6mwmPT5MExW7NUlrrcrXaEEBF54NYPVfaV5Mb+ps3CCictOiCZMv4jSETZp6H1b3tW3FwHFCojxtFnMSn/RpH0HTfFrJQm7yVwF+qoQQqz8Fj5/qdQk2ejruXkvK21CYwl1REiFY1+1Req4WMChRB1bWuw='
# 解密
with open("rsa.private.pem", mode="r") as f:prikey = f.read()rsa_pk = RSA.importKey(prikey)# 创建解密对象rsa = PKCS1_v1_5.new(rsa_pk)result = rsa.decrypt(base64.b64decode(data), None)print("rsa解密数据:::", result.decode("utf-8"))
相关文章:
常见的爬虫算法
1.base64加密 base64是什么 Base64编码,是由64个字符组成编码集:26个大写字母AZ,26个小写字母az,10个数字0~9,符号“”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节,然后…...
Numpy常用库方法总结
numpy的底层是ndarray,也就是矩阵结构 对于ndarray结构来说,里面所有的元素必须是同一类型的 如果不是的话,会自动的向下进行转换 list [1,2,3,4,5] array np.array(list) array输出:array([1, 2, 3, 4, 5]) 1.1 ndarray基本…...
YOLOV8 OBB 海思3516训练流程
YOLOV8 OBB 海思3516训练流程 目录 1、 下载带GPU版本的torch(可选) 1 2、 安装 ultralytics 2 3、 下载pycharm 社区版 2 4、安装pycharm 3 5、新建pycharm 工程 3 6、 添加conda 环境 4 7、 训练代码 5 9、配置Ymal 文件 6 10、修改网络结构 9 11、运行train.py 开始训练模…...
[MySQL] 事务管理(二) 事务的隔离性底层
事务的隔离性底层 1.数据库并发的场景2.读-写2.1MVCC三个变量2.1.1 3个记录隐藏列字段2.1.2 undo日志 模拟MVCCselect 的读取2.1.3 Read View(读视图) 3.RR与RC的区别 1.数据库并发的场景 读-读:不存在问题,也不需要并发控制读-写…...
20、.NET SDK概述
.NET SDK(Software Development Kit) 是微软提供的一套开发工具包,用于构建、运行和管理基于 .NET 平台的应用程序。它包含了一组丰富的工具、库和运行时环境,支持开发者在多种操作系统(如 Windows、Linux 和 macOS&am…...
Go:包和 go 工具
引言 通过对关联特性分类,组成便于理解和修改的单元,使包与程序其他包保持独立,助力大型程序的设计与维护 。模块化让包可在不同项目共享、复用、发布及全球范围使用。 每个包定义不同命名空间作为标识符,关联具体包,…...
18-21源码剖析——Mybatis整体架构设计、核心组件调用关系、源码环境搭建
学习视频资料来源:https://www.bilibili.com/video/BV1R14y1W7yS 文章目录 1. 架构设计2. 核心组件及调用关系3. 源码环境搭建3.1 测试类3.2 实体类3.3 核心配置文件3.4 映射配置文件3.5 遇到的问题 1. 架构设计 Mybatis整体架构分为4层: 接口层&#…...
冒泡排序、插入排序、快速排序、堆排序、希尔排序、归并排序
目录 冒泡排序插入排序快速排序(未优化版本)快速排序(优化版本)堆排序希尔排序归并排序各排序时间消耗对比 冒泡排序 冒泡排序核心逻辑就是对数组从第一个位置开始进行遍历,如果发现该元素比下一个元素大,则交换位置,如果不大,就…...
Docker Compose 中配置 Host 网络模式
在 Docker Compose 中配置 Host 网络模式时,需通过 network_mode 参数直接指定容器使用宿主机的网络栈。以下是具体配置方法及注意事项: 1. 基础配置示例 在 docker-compose.yml 文件中,为需要启用 Host 模式的服务添加 network_mode: "…...
HTML、CSS 和 JavaScript 常见用法及使用规范
一、HTML 深度剖析 1. 文档类型声明 HTML 文档开头的 <!DOCTYPE html> 声明告知浏览器当前文档使用的是 HTML5 标准。它是文档的重要元信息,能确保浏览器以标准模式渲染页面,避免怪异模式下的兼容性问题。 2. 元数据标签 <meta> 标签&am…...
Elasticsearch 索引数据量激增的应对与优化:从原理到部署实践
Elasticsearch(ES)作为一款强大的分布式搜索和分析引擎,广泛应用于日志分析、全文搜索和实时数据处理等场景。然而,随着数据量激增,索引可能面临性能瓶颈,如写入变慢、查询延迟高或存储成本上升。如何有效应…...
CD27.【C++ Dev】类和对象 (18)友元和内部类
目录 1.友元 友元函数 几个特点 友元类 格式 代码示例 2.内部类(了解即可) 计算有内部类的类的大小 分析 注意:内部类不能直接定义 内部类是外部类的友元类 3.练习 承接CD21.【C Dev】类和对象(12) 流插入运算符的重载文章 1.友元 友元函数 在CD21.【C Dev】类和…...
QT安装详细步骤
下载 清华源 : 清华源 1. 2. 3. 4....
Unity游戏多语言工具包
由于一开始的代码没有考虑多语言场景,导致代码中提示框和UI显示直接用了中文,最近开始提取代码的中文,提取起来太麻烦,所以拓展了之前的多语言包,降低了操作复杂度。最后把工具代码提取出来到单独项目里面,…...
实验三 I/O地址译码
一、实验目的 掌握I/O地址译码电路的工作原理。 二、实验电路 实验电路如图1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器, Y0:280H~287H&…...
视觉语言导航(VLN):连接语言、视觉与行动的桥梁
文章目录 1. 引言:什么是VLN及其重要性?2. VLN问题定义3. 核心挑战4. 基石:关键数据集与模拟器5. 评估指标6. 主要方法与技术演进6.1 前CLIP时代:奠定基础6.2 后CLIP时代:视觉与语言的统一 7. 最新进展与前沿趋势 (202…...
计算机网络中科大 - 第7章 网络安全(详细解析)-以及案例
目录 🛡️ 第8章:网络安全(Network Security)优化整合笔记📌 本章学习目标 一、网络安全概念二、加密技术(Encryption)1. 对称加密(Symmetric Key)2. 公钥加密࿰…...
2026《数据结构》考研复习笔记一(C++基础知识)
C基础知识复习 一、数据类型二、修饰符和运算符三、Lambda函数和表达式四、数学函数五、字符串六、结构体 一、数据类型 1.1基本类型 基本类型 描述 字节(位数) 范围 char 字符类型,存储ASCLL字符 1(8位) -128…...
XCTF-web(四)
unserialize3 需要反序列化一下:O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;} php_rce 题目提示rce漏洞,测试一下:?s/Index/\think\app/invokefunction&functioncall_user_func_array&vars[0]phpinfo&vars[1][]1 flag࿱…...
在Vue项目中查询所有版本号为 1.1.9 的依赖包名 的具体方法,支持 npm/yarn/pnpm 等主流工具
以下是 在Vue项目中查询所有版本号为 1.1.9 的依赖包名 的具体方法,支持 npm/yarn/pnpm 等主流工具: 一、使用 npm 1. 直接过滤依赖树 npm ls --depth0 | grep "1.1.9"说明: npm ls --depth0:仅显示直接依赖…...
若依微服务版启动小程序后端
目录标题 本地启动,dev对应 nacos里的 xxx-xxx-dev配置文件 本地启动,dev对应 nacos里的 xxx-xxx-dev配置文件...
莒县第六实验小学:举行“阅读世界 丰盈自我”淘书会
4月16日,莒县第六实验小学校园内书香四溢、笑语盈盈,以“阅读世界 丰盈自我”为主题的第二十四届读书节之“淘书会”活动火热开启。全校师生齐聚一堂,以书会友、共享阅读之乐,为春日校园增添了一抹浓厚的文化气息。 活动在悠扬的诵…...
国产数据库与Oracle数据库事务差异分析
数据库中的ACID是事务的基本特性,而在Oracle等数据库迁移到国产数据库国产中,可能因为不同数据库事务处理机制的不同,在迁移后的业务逻辑处理上存在差异。本文简要介绍了事务的ACID属性、事务的隔离级别、回滚机制和超时机制,并总…...
C++学习记录:
今天我们来学习一门新的语言,也是C语言最著名的一个分支语言:C。 在C的学习中,我们主要学习的三大组成部分:语法、STL、数据结构。 C的介绍 C的历史可追溯至1979年,当时贝尔实验室的本贾尼斯特劳斯特卢普博士在面对复杂…...
等离子体浸没离子注入(PIII)
一、PIII 是什么?基本原理和工艺 想象一下,你有一块金属或者硅片(就是做芯片的那种材料),你想给它的表面“升级”,让它变得更硬、更耐磨,或者有其他特殊功能。怎么做呢?PIII 就像是用…...
LeetCode-16.最接近的三数之和 C++实现
一 题目描述 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解 示例 1: 输入:nums [-1,2,1,-4], target 1 输出&…...
【机器学习】每日一讲-朴素贝叶斯公式
文章目录 **一、朴素贝叶斯公式详解****1. 贝叶斯定理基础****2. 从贝叶斯定理到分类任务****3. 特征独立性假设****4. 条件概率的估计** **二、在AI领域的作用****1. 文本分类与自然语言处理(NLP)****2. 推荐系统****3. 医疗与生物信息学****4. 实时监控…...
C 语言中的 volatile 关键字
1、概念 volatile 是 C/C 语言中的一个类型修饰符,用于告知编译器:该变量的值可能会在程序控制流之外被意外修改(如硬件寄存器、多线程共享变量或信号处理函数等),因此编译器不应对其进行激进的优化(如缓存…...
Python自学第1天:变量,打印,类型转化
突然想学Python了。经过Deepseek的推荐,下载了一个Python3.12安装。安装过程请自行搜索。 乖乖从最基础的学起来,废话不说了,上链接,呃,打错了,上知识点。 变量的定义 # 定义一个整数类型的变量 age 10#…...
探索鸿蒙应用开发:ArkTS应用执行入口揭秘
# 探索鸿蒙应用开发:ArkTS应用执行入口揭秘 在鸿蒙应用开发的领域中,ArkTS作为声明式开发语言,为开发者们带来了便捷与高效。对于刚接触鸿蒙开发的小伙伴来说,搞清楚ArkTS应用程序的执行入口是迈向成功开发的关键一步。今天&…...
