常见的爬虫算法

1.base64加密

base64是什么

Base64编码,是由64个字符组成编码集:26个大写字母AZ,26个小写字母az,10个数字0~9,符号“+”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节,然后根据Base64的对应表,得到对应的编码数据。

当原始数据凑不够三个字节时,编码结果中会使用额外的**符号“=”**来表示这种情况。

base64原理

每一个base64的字符会对应有一个索引值(0-63)

img

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

img

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

img

ASCII表:

img

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字节的随机字符串。这个字符串在解密时也需要用到,因此需要妥善保存。
  • 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"))

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

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

相关文章

B树、红黑树、B+树和平衡二叉树(如AVL树)的区别

B树、红黑树、B树和平衡二叉树(如AVL树)的区别及优缺点的总结: 1. 平衡二叉树(AVL树) 结构:二叉搜索树,每个节点的左右子树高度差不超过1。平衡方式:通过旋转(左旋/右旋…

Python Cookbook-6.5 继承的替代方案——自动托管

任务 你需要从某个类或者类型继承,但是需要对继承做一些调整。比如,需要选择性地隐藏某些基类的方法,而继承并不能做到这一点。 解决方案 继承是很方便的,但它并不是万用良药。比如,它无法让你隐藏基类的方法或者属…

长短期记忆网络:从理论到创新应用的深度剖析

一、引言 1.1 研究背景 深度学习在人工智能领域的发展可谓突飞猛进,而长短期记忆网络(LSTM)在其中占据着至关重要的地位。随着数据量的不断增长和对时序数据处理需求的增加,传统的神经网络在处理长序列数据时面临着梯度消失和梯…

vue3.2 + element-plus 实现跟随input输入框的弹框,弹框里可以分组或tab形式显示选项

效果 基础用法&#xff08;分组选项&#xff09; 高级用法&#xff08;带Tab栏&#xff09; <!-- 弹窗跟随通用组件 SmartSelector.vue --> <!-- 弹窗跟随通用组件 --> <template><div class"smart-selector-container"><el-popove…

C语言中冒泡排序和快速排序的区别

冒泡排序和快速排序都是常见的排序算法&#xff0c;但它们在原理、效率和应用场景等方面存在显著区别。以下是两者的详细对比&#xff1a; 一、算法原理 1. 冒泡排序 原理&#xff1a;通过重复遍历数组&#xff0c;比较相邻元素的大小&#xff0c;并在必要时交换它们的位置。…

软件信息安全性测试如何进行?有哪些注意事项?

随着信息技术的高速发展&#xff0c;软件已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;随着软件产品的广泛普及&#xff0c;软件信息安全性问题也日益凸显&#xff0c;因此软件信息安全性测试必不可少。那么软件信息安全性测试应如何进行呢?在进行过程中又有哪…

springboot集成mybaits-generator自动生成代码

文章目录 概述创建springboot项目pom文件aplication.yml代码生成类mybatis-plus提供的变量controller模板mapper模板总结 概述 创建springboot项目&#xff0c;在这里使用的是springboot 2.6.13版本&#xff0c;引入的项目依赖包如pom文件所写&#xff0c;jdk使用1.8&#xff…

数据库脱裤

假设你已经getshell 找到mysql账号密码。 网站要连接mysql&#xff0c;就需要把mysql的账号密码保存在一个php文件中&#xff0c;类似config.php、common.inc.php等&#xff0c;在shell中&#xff0c;读取这些文件&#xff0c;找到其中信息即可 下面是一些常见平台的配置文…

leetcode 337. House Robber III

用动态规划的思想解决这道题。 对于每一个节点&#xff0c;只有两种可能&#xff0c;偷或者不偷。 对于一颗以root为根节点的二叉树&#xff0c;定义rob表示偷root节点能从这棵二叉树偷到的最大金额。定义notrob表示不偷root节点能从这棵二叉树偷到的最大金额。 递推公式分析…

ES和MySQL概念对比

基本概念 ES和MySQL都属于数据库&#xff0c;不过各有各的特性&#xff0c;大致使用方法与MySQL类似并无区别。 MySQL&#xff1a;擅长事务持有ACID的特性&#xff0c;确保数据的一致性和安全。 ES&#xff1a;持有倒排索引&#xff0c;适合海量数据搜索和分析。 ES和MySQL如何…

【python】针对Selenium中弹框信息无法定位的问题,以下是综合解决方案及注意事项:

一、常见原因分析 1.1 弹窗类型不匹配 若弹窗为alert&#xff0c;需使用driver.switch_to.alert处理&#xff1b; 若为confirm或prompt&#xff0c;同样适用该方法。 1.2 窗口句柄切换问题 新窗口或弹窗可能开启新句柄&#xff0c;需先通过driver.window_handles切换到对应句…

欧拉服务器操作系统安装MySQL

1. 安装MySQL服务器​​ 1. 更新仓库缓存 sudo dnf makecache2. 安装MySQL sudo dnf install mysql-server2. 初始化数据库​ sudo mysqld --initialize --usermysql3. 启动数据库服务 # 启动服务 sudo systemctl start mysqld# 设置开机自启 sudo systemctl enable mysql…

SQLark:一款国产免费数据库开发和管理工具

SQLark&#xff08;百灵连接&#xff09;是一款面向信创应用开发者的数据库开发和管理工具&#xff0c;用于快速查询、创建和管理不同类型的数据库系统&#xff0c;目前可以支持达梦数据库、Oracle 以及 MySQL。 对象管理 SQLark 支持丰富的数据库对象管理功能&#xff0c;包括…

Spring Boot 中的自动配置原理

2025/4/6 向全栈工程师迈进&#xff01; 一、自动配置 所谓的自动配置原理就是遵循约定大约配置的原则&#xff0c;在boot工程程序启动后&#xff0c;起步依赖中的一些bean对象会自动的注入到IOC容器中。 在讲解Spring Boot 中bean对象的管理的时候&#xff0c;我们注入bean对…

Mysql8配置文件

Mysql8配置文件 修改my.cnf----配置持久化键(persistence key)配置表名不区分大小写 修改my.cnf----配置持久化键(persistence key) MySQL8初始化数据库之前配置好这些变量值&#xff0c;初始化数据库之后可能无法修改这个值。 # 服务端配置 [mysqld] ######## 数据目录和基…

关于系统架构思考,如何设计实现系统的高可用?

绪论、系统高可用的必要性 系统高可用为了保持业务连续性保障&#xff0c;以及停机成本量化&#xff0c;比如在以前的双十一当天如果出现宕机&#xff0c;那将会损失多少钱&#xff1f;比如最近几年Amazon 2021年30分钟宕机损失$5.6M。当然也有成功的案例&#xff0c;比如异地…

【Unity笔记】实现可视化配置的Unity按键输入管理器(按下/长按/松开事件 + UnityEvent绑定)

【Unity笔记】实现可视化配置的Unity按键输入管理器 适用于角色控制、技能触发的Unity按键输入系统&#xff0c;支持UnityEvent事件绑定、长按/松开监听与启用开关 一、引言 在 Unity 游戏开发中&#xff0c;处理键盘输入是最常见的交互方式之一。尤其是角色控制、技能释放、菜…

Fortran 中使用 C_LOC 和 C_F_POINTER 结合的方法来实现不同类型指针指向同一块内存区域

在 Fortran 中&#xff0c;可以使用 C_LOC 和 C_F_POINTER 结合的方法来实现不同类型指针指向同一块内存区域。以下是具体方法和示例&#xff1a; 关键步骤&#xff1a; 获取内存地址&#xff1a;用 C_LOC 获取原始数组的 C 地址。类型转换&#xff1a;用 C_F_POINTER 将地址转…

Spring Boot整合Kafka的详细步骤

1. 安装Kafka 下载Kafka&#xff1a;从Kafka官网下载最新版本的Kafka。 解压并启动&#xff1a; 解压Kafka文件后&#xff0c;进入bin目录。 启动ZooKeeper&#xff1a;./zookeeper-server-start.sh ../config/zookeeper.properties。 启动Kafka&#xff1a;./kafka-server-…

【含文档+PPT+源码】基于微信小程序的学校体育馆操场预约系统的设计与实现

课程简介&#xff1a; 本课程演示的是一款基于微信小程序的学校体育馆操场预约系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从…