1. 课程导学与项目概述:签名验签是什么?为什么需要它?

大家好,欢迎来到《从零实现签名验签工具开发》这门课。

我是这门课的主讲。在正式开始之前,我想先聊聊一个很基础、但很多人其实没搞透的问题:签名验签到底是什么?

说白了,数字签名就是现实世界里「手写签名」的电子版。你在一份合同上签了名,别人一看就知道是你签的,而且你事后不能抵赖。数字签名干的事一模一样——只不过它用的是数学,不是笔和纸。

1.1 一个真实的故事

我记得刚工作那会儿,参与过一个金融系统的对接项目。对方银行要求我们发送的每一条交易报文都必须带签名。我当时想,不就是把数据加密一下嘛,简单。结果呢?上线第一天,对方就报错——签名验证失败。

排查了一整天,最后发现是签名时用的字符编码不一致。我这边用的 UTF-8,对方用的 GBK。就这么一个细节,差点导致项目延期。嗯,从那以后我再也不敢小看签名验签了。

你想想看,如果连编码这种基础问题都能搞出大麻烦,那密钥管理、算法选择、填充模式这些更深的东西呢?所以这门课,我会带着你把这些坑一个一个踩平。

1.2 签名验签的核心逻辑

先看一张图,把整体流程理清楚。

数字签名与验签核心流程 发送方(签名) 原始数据 哈希运算 私钥加密 数字签名 网络 接收方(验签) 数字签名 公钥解密 哈希值A 哈希值B 哈希值A == 哈希值B? 验证通过 ✓ 验证失败 ✗

这张图把流程拆成了两半。左边是签名,右边是验签。核心就三步:哈希 → 加密 → 比对。

一句话总结:签名就是用你的私钥给数据的「指纹」加密。验签就是用你的公钥解密,然后比对指纹是否一致。

1.3 为什么需要签名验签?

你可能会问:我直接把数据加密传输不行吗?干嘛非要搞个签名?

好问题。加密解决的是「别人看不懂」,签名解决的是「别人改不了、赖不掉」。这是两码事。

安全需求 加密 签名
机密性(别人看不懂) ✅ 解决 ❌ 不解决
完整性(数据没被改) ❌ 不解决 ✅ 解决
身份认证(是谁发的) ❌ 不解决 ✅ 解决
不可否认性(不能抵赖) ❌ 不解决 ✅ 解决

我在项目中遇到过好几次这样的情况:对方说「我没发过这条消息」,结果一查签名,私钥只有他有,赖都赖不掉。这就是不可否认性的价值。

1.4 课程目标与最终效果

这门课的目标很明确:从零开始,手写一个能用的签名验签工具。

不是那种「调一下 OpenSSL 命令行就完事」的教程。我们要用 Python 自己实现核心逻辑,包括:

  • 密钥生成:RSA 和 ECDSA 两种主流算法
  • 签名生成:支持文件签名和文本签名
  • 签名验证:支持单签名和多签名批量验证
  • 密钥管理:PEM 格式的导入导出
  • 图形界面:用 PyQt5 做一个能用的桌面工具

我的建议:别急着看后面的代码。先把今天这张流程图搞明白。哈希、私钥、公钥这三个概念,是后面所有内容的地基。地基不稳,楼盖得再高也得塌。

1.5 你会学到什么

30 章走下来,你收获的不只是代码:

  1. 密码学基础:哈希函数、非对称加密、数字签名原理
  2. Python 安全编程:cryptography 库、PEM 格式处理、异常处理
  3. 工程实践:命令行工具开发、GUI 开发、单元测试
  4. 避坑经验:编码问题、填充模式、密钥安全存储

注意:这门课讲的是「如何实现签名验签工具」,不是「如何破解签名」。所有代码仅供学习和合法场景使用。别拿去做违法的事,这个锅我不背。

好了,第一章就到这里。内容不多,但都是干货。把这张图刻在脑子里,后面我们就要开始动手写代码了。