在 Python 開發中,字符編碼(如 UTF-8、GBK)和?數據加密(如 Base64、MD5、RSA)是處理數據傳輸、存儲安全的核心技術。本文結合實戰代碼,從基礎的字符編解碼入手,逐步深入到加密算法的應用,覆蓋 “迅雷鏈接破解”“RSA 加解密”“數字簽名” 等實際場景,幫你系統掌握數據安全相關技能。
一、基礎:字符編解碼(encode/decode)
計算機只能識別二進制(0/1),而人類使用的是字符(如?a
、中
),字符編碼就是 “字符→二進制” 的映射規則,解碼則是反向過程。Python 中字符串(str
)與字節流(bytes
)的轉換,全靠?encode()
?和?decode()
?實現。
1. 核心原理
- 編碼(encode):
str
?→?bytes
,將字符串按指定規則轉為二進制字節流。 - 解碼(decode):
bytes
?→?str
,將二進制字節流按對應規則還原為字符串。 - 常見編碼格式:
UTF-8
(通用,一個漢字占 3 字節)、GBK
(中文專用,一個漢字占 2 字節)。
2. 實戰代碼
# 1. 英文編碼(UTF-8 下英文占 1 字節)
s = "hello"
# 編碼:str → bytes(指定 UTF-8 規則)
se = s.encode(encoding="utf-8")
print("UTF-8 編碼結果(字節流):", se) # 輸出:b'hello'(b 表示 bytes 類型)
# 解碼:bytes → str
print("UTF-8 解碼結果(字符串):", se.decode(encoding="utf-8")) # 輸出:hello# 2. 中文編碼(UTF-8 占 3 字節,GBK 占 2 字節)
s = "中"
# UTF-8 編碼
se_utf8 = s.encode(encoding="utf-8")
print("中文 UTF-8 編碼:", se_utf8) # 輸出:b'\xe4\xb8\xad'(3 字節)
# GBK 編碼
se_gbk = s.encode(encoding="gbk")
print("中文 GBK 編碼:", se_gbk) # 輸出:b'\xd6\xd0'(2 字節)# 解碼必須與編碼格式一致,否則亂碼
print("UTF-8 解碼:", se_utf8.decode("utf-8")) # 輸出:中
print("GBK 解碼:", se_gbk.decode("gbk")) # 輸出:中
3. 關鍵注意點
- 編碼和解碼的?格式必須一致(如 UTF-8 編碼需用 UTF-8 解碼),否則會出現?
UnicodeDecodeError
?或亂碼。 - 中文場景優先用?
UTF-8
,避免?GBK
?跨平臺兼容性問題。
二、Base64 編碼:解決不可見字符傳輸問題
Base64 是一種 “二進制到字符串” 的編碼方式,將任意二進制數據轉為?A-Z
、a-z
、0-9
、+
、/
?組成的可見字符串,核心作用是?避免不可見字符(如 ASCII 128+)在傳輸中出錯。
1. 應用場景
- 郵件附件傳輸、下載鏈接加密(如迅雷、QQ 旋風);
- 圖片轉字符串(如 HTML 中嵌入 Base64 圖片,減少 HTTP 請求);
- 跨平臺數據傳輸(避免二進制解析差異)。
2. 實戰代碼(含迅雷 / 旋風鏈接破解)
Python 內置?base64
?模塊,直接調用?b64encode()
(編碼)和?b64decode()
(解碼)即可。
(1)基礎編解碼
import base64# 1. 編碼:先將字符串轉為 bytes,再 Base64 編碼
s = "hello"
# 步驟:str → bytes(UTF-8)→ Base64 字符串(bytes 類型)
s64_encode = base64.b64encode(s.encode(encoding="utf-8"))
print("Base64 編碼結果:", s64_encode) # 輸出:b'aGVsbG8='# 2. 解碼:Base64 字符串 → bytes → str
s64_decode = base64.b64decode(s64_encode)
print("Base64 解碼結果:", s64_decode.decode("utf-8")) # 輸出:hello
(2)破解迅雷 / QQ 旋風鏈接
迅雷、旋風鏈接本質是 “自定義前綴 + Base64 編碼”,破解只需去掉前綴再解碼:
import base64
from urllib.parse import quote, unquote# 1. 破解迅雷鏈接(前綴:thunder://,中間需去掉 AA/ZZ 包裹)
thunder_url = "thunder://QUFodHRwczovL3d3dy5sdW9jaGVuemhpbXUuY29tL3VybC9aWg=="
# 步驟:去掉前綴 → Base64 解碼 → 去掉 AA/ZZ 包裹
pure_url = thunder_url.removeprefix("thunder://") # 去掉 thunder://
decoded_url = base64.b64decode(pure_url).decode("utf-8") # Base64 解碼
real_url = decoded_url.removeprefix("AA").removesuffix("ZZ") # 去掉 AA/ZZ
print("破解后的迅雷鏈接:", real_url) # 輸出:https://www.luochenzhimu.com/url/Z# 2. 破解 QQ 旋風鏈接(前綴:qqdl://)
qqdl_url = "qqdl://aHR0cHM6Ly93d3cubHVvY2hlbnpoaW11LmNvbS91cmwv"
pure_url = qqdl_url.removeprefix("qqdl://") # 去掉 qqdl://
real_url = base64.b64decode(pure_url).decode("utf-8")
print("破解后的旋風鏈接:", real_url) # 輸出:https://www.luochenzhimu.com/url/# 3. 生成迅雷鏈接(反向操作)
original_url = "https://www.luochenzhimu.com/url/"
# 步驟:AA + 原始鏈接 + ZZ → Base64 編碼 → 加 thunder:// 前綴
wrapped_url = "AA" + original_url + "ZZ"
base64_url = base64.b64encode(wrapped_url.encode()).decode()
thunder_new = "thunder://" + base64_url
print("生成的迅雷鏈接:", thunder_new) # 輸出:thunder://QUFodHRwczovL3d3dy5sdW9jaGVuemhpbXUuY29tL3VybC8vWlo=
三、不可逆加密:MD5 與 SHA256(密碼存儲首選)
不可逆加密(哈希算法)的核心特點是?只能加密,不能解密,相同輸入永遠得到相同輸出,不同輸入大概率得到不同輸出(抗碰撞)。常用于密碼存儲、數據完整性校驗。
1. 應用場景
- 密碼存儲:不存儲明文密碼,只存儲哈希值(如用戶登錄時,將輸入密碼哈希后與數據庫中的哈希值對比);
- 文件校驗:下載文件時,對比 “官方哈希值” 與 “本地文件哈希值”,判斷文件是否被篡改。
2. 實戰代碼(Python 內置?hashlib
?模塊)
from hashlib import md5, sha256# 待加密的字符串(如密碼)
pwd = "123456"
# 注意:哈希算法需傳入 bytes 類型,因此先 encode()# 1. MD5 加密(16 字節輸出,通常顯示為 32 位十六進制字符串)
md5_hash = md5(pwd.encode(encoding="utf-8")).hexdigest()
print("MD5 加密結果:", md5_hash) # 輸出:e10adc3949ba59abbe56e057f20f883e# 2. SHA256 加密(256 位輸出,安全性高于 MD5)
sha256_hash = sha256(pwd.encode(encoding="utf-8")).hexdigest()
print("SHA256 加密結果:", sha256_hash) # 輸出:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
3. 關鍵注意點
- MD5 安全性較低(已被破解,存在碰撞案例),推薦用 SHA256 或更安全的 SHA512;
- 實際項目中,密碼哈希需加鹽(
salt
),即添加隨機字符串后再哈希,避免 “彩虹表” 破解(如?md5((pwd + salt).encode())
)。
四、非對稱加密:RSA(公鑰加密,私鑰解密)
非對稱加密有?兩把鑰匙:公鑰(公開,用于加密)和私鑰(保密,用于解密),核心優勢是 “無需傳遞密鑰,即可安全傳輸數據”,是 HTTPS、數字簽名的核心技術。
1. 應用場景
- 安全通信(如 HTTPS 中服務器用公鑰加密,客戶端用私鑰解密);
- 數字簽名(用私鑰簽名,公鑰驗證,確保數據未被篡改);
- 敏感數據加密(如支付信息、個人隱私)。
2. 實戰代碼(需先安裝?rsa
?庫)
Python 沒有內置 RSA 模塊,需先安裝第三方庫:
# 安裝 rsa 庫(國內鏡像加速)
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip install rsa
(1)生成公鑰與私鑰(保存到文件)
import rsa# 1. 生成 RSA 密鑰對(nbit 為密鑰長度,2048 或 4096,長度越長越安全)
pub_key, pri_key = rsa.newkeys(nbit=2048)# 2. 將密鑰轉為 bytes 格式(PKCS#1 標準,便于存儲)
pub_key_bytes = pub_key.save_pkcs1() # 公鑰 bytes
pri_key_bytes = pri_key.save_pkcs1() # 私鑰 bytes# 3. 保存到文件(公鑰可公開,私鑰需保密)
with open("./a/public.pem", "wb") as f: # 公鑰文件f.write(pub_key_bytes)
with open("./a/private.pem", "wb") as f: # 私鑰文件f.write(pri_key_bytes)
print("RSA 密鑰對已保存到 ./a 目錄")
(2)RSA 加解密(公鑰加密,私鑰解密)
import rsa
import base64# 1. 從文件加載密鑰(實際項目中,公鑰可能從服務器獲取,私鑰本地存儲)
pub_key_bytes = open("./a/public.pem", "rb").read()
pri_key_bytes = open("./a/private.pem", "rb").read()# 2. 解析密鑰為 RSA 格式
pub_key = rsa.PublicKey.load_pkcs1(pub_key_bytes) # 加載公鑰
pri_key = rsa.PrivateKey.load_pkcs1(pri_key_bytes) # 加載私鑰# 3. 加密(公鑰加密,只能加密短數據,長數據需分段)
plain_text = "hello, RSA!" # 待加密的明文
# 步驟:明文 → bytes → RSA 加密(bytes)→ Base64 編碼(便于傳輸)
encrypted = rsa.encrypt(plain_text.encode("utf-8"), pub_key)
encrypted_base64 = base64.b64encode(encrypted).decode("utf-8")
print("RSA 加密后(Base64):", encrypted_base64)# 4. 解密(私鑰解密)
# 步驟:Base64 解碼 → RSA 解密(bytes)→ 明文(str)
decrypted_base64 = base64.b64decode(encrypted_base64.encode("utf-8"))
decrypted = rsa.decrypt(decrypted_base64, pri_key).decode("utf-8")
print("RSA 解密后:", decrypted) # 輸出:hello, RSA!
五、數字簽名:RSA 簽名與驗證(確保數據完整性)
數字簽名是 “非對稱加密的反向應用”:用?私鑰簽名(生成簽名),用?公鑰驗證(判斷數據是否被篡改)。核心作用是 “確認數據來源合法 + 數據未被修改”。
1. 應用場景
- 接口請求簽名(如 API 調用時,客戶端用私鑰簽名,服務器用公鑰驗證,防止請求被篡改);
- 軟件安裝包簽名(如 Windows exe 簽名,確保軟件未被植入惡意代碼);
- 電子合同、電子證書。
2. 實戰代碼(模擬 JD 鏈接簽名驗證)
import rsa
import base64
from urllib.parse import quote, unquote# 待簽名的數據(如 JD 商品鏈接)
original_url = "https://www.jd.com/?itemId=2"# 1. 加載 RSA 密鑰對
pub_key_bytes = open("./a/public.pem", "rb").read()
pri_key_bytes = open("./a/private.pem", "rb").read()
pub_key = rsa.PublicKey.load_pkcs1(pub_key_bytes)
pri_key = rsa.PrivateKey.load_pkcs1(pri_key_bytes)# 2. 私鑰簽名(生成簽名)
# 步驟:數據 → bytes → 私鑰簽名(MD5 哈希算法)→ Base64 編碼 → URL 編碼(處理特殊字符)
sign = rsa.sign(original_url.encode("utf-8"), pri_key, "MD5") # MD5 為哈希算法
sign_base64 = base64.b64encode(sign).decode("utf-8")
sign_urlencoded = quote(sign_base64) # URL 編碼,避免特殊字符(如 +、/)出錯
print("生成的簽名(URL 編碼后):", sign_urlencoded)# 3. 公鑰驗證(判斷數據是否被篡改)
# 模擬場景:服務器收到數據(可能被篡改)和簽名,驗證合法性
received_url = "https://www.jd.com/?itemId=3" # 被篡改的鏈接
received_sign = sign_urlencoded # 收到的簽名# 驗證步驟:URL 解碼 → Base64 解碼 → 公鑰驗證
sign_decoded = unquote(received_sign) # URL 解碼
sign_bytes = base64.b64decode(sign_decoded.encode("utf-8")) # Base64 解碼try:# 公鑰驗證:若驗證通過,返回簽名時用的哈希算法(如 'MD5');若失敗,拋出異常verify_result = rsa.verify(received_url.encode("utf-8"), sign_bytes, pub_key)print("驗證通過,哈希算法:", verify_result)
except rsa.VerificationError:print("驗證失敗!數據已被篡改或簽名無效") # 此處會觸發,因為 received_url 被篡改
六、總結與工具清單
- 字符編碼:
UTF-8
?優先,處理中文避免亂碼; - Base64:用于不可見字符傳輸、鏈接加密,
base64
?模塊直接調用; - 不可逆加密:MD5(簡單)、SHA256(安全),
hashlib
?模塊,適合密碼存儲; - 非對稱加密:RSA(公鑰加密、私鑰解密),
rsa
?庫,適合安全通信; - 數字簽名:RSA 私鑰簽名、公鑰驗證,確保數據完整性和合法性。
通過本文的代碼實戰,你可以輕松應對 “數據傳輸加密”“密碼存儲”“接口簽名” 等常見場景,為 Python 項目的安全性保駕護航。