常見的爬蟲算法

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.pswp.cn/bicheng/77209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77209.shtml
英文地址,請注明出處:http://en.pswp.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.帶你從…