在 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-Za-z0-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 被篡改

六、总结与工具清单

  1. 字符编码UTF-8 优先,处理中文避免乱码;
  2. Base64:用于不可见字符传输、链接加密,base64 模块直接调用;
  3. 不可逆加密:MD5(简单)、SHA256(安全),hashlib 模块,适合密码存储;
  4. 非对称加密:RSA(公钥加密、私钥解密),rsa 库,适合安全通信;
  5. 数字签名:RSA 私钥签名、公钥验证,确保数据完整性和合法性。

通过本文的代码实战,你可以轻松应对 “数据传输加密”“密码存储”“接口签名” 等常见场景,为 Python 项目的安全性保驾护航。

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

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

相关文章

关于shell命令的扩展

目录 一、逻辑运算符 1. &&(AND) 2. ||(OR) 3. 组合使用:A && B || C 二、输出与重定向 1. echo 输出 2. 标准文件描述符(FD) 3. 重定向操作符 4. 同时重定向 stdout 和…

MySQL EXPLAIN 查看执行计划详解

MySQL 的 EXPLAIN 命令。这是一个分析和优化 SQL 查询性能不可或缺的强大工具。它展示了 MySQL 如何执行一条 SQL 语句,包括如何使用索引、表连接顺序、估计的行数等关键信息。1. 如何使用 EXPLAIN在你要分析的 SELECT 语句前加上 EXPLAIN 或 EXPLAIN FORMATJSON&am…

TensorFlow 面试题及详细答案 120道(51-60)-- 模型保存、加载与部署

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 51. TensorFlow中保存和加…

从零开始学Shell编程:从基础到实战案例

从零开始学Shell编程:从基础到实战案例 文章目录从零开始学Shell编程:从基础到实战案例一、认识Shell:是什么与为什么学1.1 Shell的定义1.2 常用Shell解释器二、Shell编程快速入门:编写第一个脚本2.1 步骤1:创建脚本文…

机器学习算法全景解析:从理论到实践

机器学习算法全景解析:从理论到实践引言机器学习作为人工智能的核心组成部分,正在深刻地改变我们的世界。从推荐系统到自动驾驶,从医疗诊断到金融风控,机器学习算法无处不在。本文将全面系统地介绍机器学习的主要算法类别及其核心…

week5-[二维数组]对角线

week5-[二维数组]对角线 题目描述 给定一个 nnn\times nnn 的正方形二维数组,输出它两条对角线上元素的和。 输入格式 输入共 n1n 1n1 行。 第 111 行 111 个正整数 nnn。 接下来 nnn 行,每行 nnn 个正整数 aija_{ij}aij​ 表示这个二维数组。 输出格式…

GoogLeNet:深度学习中的“卷积网络变形金刚“

大家好!今天我们要聊一个在深度学习领域掀起革命的经典网络——GoogLeNet(又称Inception v1)。这个由Google团队在2014年提出的模型,不仅拿下了ImageNet竞赛冠军,更用"网络中的网络"设计理念彻底改变了卷积神…

笔记本电脑蓝牙搜索不到设备-已解决

方法1打开疑难解答,选择其他疑难解答,下划选择蓝牙,点击运行,电脑自行检测并修复蓝牙方法2右键此电脑,选择管理,找到自己的蓝牙设备。然后对箭头指向的这个点击右键,选择《更新驱动程序》&#…

WPF 程序用户权限模块利用MarkupExtension实现控制控件显示

工作记录 ------------------------------------------------------------------------------------------------------- MarkupExtension:XAML标记扩展 实现了什么作用:通过扩展标记将一种输入转化为另一种类型的输出 思路: 不直接设置控件的Visib…

SpringMVC相关梳理

SpringMVC 返回值类型(一)核心返回值类型分类视图渲染类:用于跳转并渲染页面,如String(指定视图名)、ModelAndView(视图 数据)。数据返回类:用于返回数据(而…

Docker化性能监控平台搭建:JMeter+InfluxDB+Grafana全攻略

你作为一名DevOps工程师或测试专家,正在监控一个高并发微服务系统:突发流量峰值导致响应延迟,服务器CPU飙升,但你只能手动查看日志,优化起来像大海捞针。这时,DockerJMeterInfluxDBGrafana的“梦幻四重奏”…

Adobe Acrobat 中通过 JavaScript 调用 Web 服务

强大的JavaScript支持,允许用户通过脚本自动化处理PDF文档。本文将详细介绍如何在Adobe Acrobat环境中使用JavaScript调用Web服务,包括基础概念、实现方法、代码示例以及常见问题解决方案。 第一部分:基础概念与技术背景 1.1 Acrobat JavaScr…

SpringCloud OpenFeign 远程调用(RPC)(三)

目录 1 概念导入 2 添加依赖 3 在启动类上添加注解 4 编写对应的接口 5 注入并调用 6 日志 7 超时控制 8 超时重试 9 拦截器 10 Fallback兜底 1 概念导入 Spring Cloud OpenFeign Features :: Spring Cloud Openfeign 2 添加依赖 <!-- 远程调用 --><depen…

【Flask】测试平台开发,登陆重构

概述我们在开篇的时候实现了简单的登陆功能&#xff0c;也实现了一个前后端联调的登陆功能&#xff0c;但是你有没有发现&#xff0c;那个登陆只是一个简单的登陆&#xff0c;且密码在接口返回的过程中是铭文密码&#xff0c;在生产环境中使用肯定是不行的&#xff0c;一般密码…

【Bluedroid】A2DP Source设备音频数据读取机制分析(btif_a2dp_source_read_callback)

本文聚焦Android 蓝牙 A2DP Source设备的音频数据读取核心逻辑,深入解析关键回调函数btif_a2dp_source_read_callback的功能实现,包括从 HAL(硬件抽象层,支持 HIDL/AIDL 两种传输方式)或 UIPC(用户空间进程间通信)获取音频数据的路径选择机制,以及数据下溢(Underflow)…

多方调研赋能AI+智慧消防 豪越科技人工智能创新获认可

8月26日&#xff0c;中国职业安全健康协会城市及社区安全发展专业委员会秘书长汪卫国以及常务副秘书长黄强亮等诸位领导到访委员单位豪越科技&#xff0c;展开了实地的调研活动并给予相关指导。此次调研着重于了解豪越科技自主研发的“AI消防救援一体化安全管控平台”&#xff…

算法---字符串

一、算法说明 字符串是一种类型&#xff0c;他不是一种算法&#xff0c;所以我们在处理这方面的问题的时候&#xff0c;需要结合其他的算法 二、题目 最长公共前缀 1、题目 最长公共前缀 2、解题思路 解法一&#xff1a;我们可以先让两个相互比较&#xff0c;然后在将比较…

鸿蒙Next导航与路由指南:组件导航与页面路由的完美协作

一次搞懂HarmonyOS NEXT中的两种导航方式&#xff0c;打造流畅的应用内跳转体验在鸿蒙应用开发中&#xff0c;流畅的页面导航和路由是提升用户体验的关键。HarmonyOS NEXT提供了组件导航&#xff08;Navigation&#xff09; 和页面路由&#xff08;ohos.router&#xff09; 两种…

JavaScript原型详解——面试重点

一、原型的含义&#xff1a;JavaScript 中的“原型”既指 函数身上的 prototype 对象&#xff0c;也指 对象身上的 [[Prototype]] 隐藏链接&#xff1b;它俩共同构成了“原型链”&#xff0c;决定了“找不到属性时去哪里继续找”的规则。&#xff08;1&#xff09;原型对象(pro…

Vue3 全面介绍

Vue3&#xff08;正式名称为 Vue.js 3&#xff09;是 Vue.js 前端框架的第三个主要版本&#xff0c;于 2020 年 9 月正式发布。作为对 Vue2 的重大升级&#xff0c;Vue3 在核心架构、性能优化、开发体验等方面进行了全面重构&#xff0c;同时保持了 Vue 一贯的“渐进式框架”理…