






















一、GPG
是什么?
GPG(GNU Privacy Guard)是基于 OpenPGP 协议的开源加密 / 签名工具链,并非单一的签名算法,而是将 RSA、ECDSA、Ed25519 等底层数字签名算法,与分层密钥体系、信任模型、密钥管理结合的完整解决方案 —— 它解决了纯算法层面 “密钥难管理、身份难验证、跨平台不兼容” 的问题,是开源社区、软件开发、文件分发场景中最常用的签名验证工具(如 Linux 发行版验证、Git 提交签名、开源软件包校验)。
GPG 不是 “发明了新的签名算法”,而是对 RSA、ECDSA、Ed25519 等底层数字签名算法的封装,并增加了:
GPG与PGP
PGP(Pretty Good Privacy)和 GPG 是同协议、不同实现的加密 / 签名工具,核心底层均遵循OpenPGP 密码学协议,二者的签名、加密逻辑完全一致,生成的签名 / 密钥文件互相兼容(GPG 可验证 PGP 签名,PGP 也可验证 GPG 签名);
核心差异在于PGP 是商业闭源的原始实现,GPG 是开源免费的替代方案,也是目前绝大多数开发者、开源社区的首选。
为什么?
分层密钥体系
采用主密钥 + 子密钥的分层设计,所有签名操作均由子密钥完成,主密钥可离线存储(冷备份)。
密钥核心属性(生成 / 使用时必须关注)
GPG 信任模型:Web of Trust(信任链)
GPG 不依赖中心化机构(如 CA 证书),而是通过 “信任链” 验证密钥身份:你验证 A 的密钥指纹后,标记 “A 的密钥可信”;A 验证 B 的密钥后,你可通过 A 的信任关系,间接信任 B 的密钥;核心:密钥指纹是信任的唯一锚点,验证指纹时必须通过线下 / 可信渠道(如作者官网、线下见面)确认,避免中间人攻击。
怎么用?
1、GPG 签名的完整流程(从密钥生成到验签)
阶段 1:生成 GPG 密钥对(核心步骤,仅需一次)
#生成密钥
gpg --full-generate-key
# 列出本地所有GPG密钥
gpg --list-keys
# 输出示例(核心信息:密钥ID、用户ID、指纹)
/home/xxx/.gnupg/pubring.kbx
------------------------------
pub ed25519 2026-02-02 [SC] [expires: 2027-02-02]
D88E0F8A377388376A2A86E3F94780449446867F # 密钥指纹(核心)
uid [ultimate] Zhang San <zhangsan@example.com>
sub ed25519 2026-02-02 [E] [expires: 2027-02-02] # 加密子密钥
sub ed25519 2026-02-02 [A] [expires: 2027-02-02] # 认证子密钥
pub:主密钥(SC=Sign+Certify,签名 + 证书);
sub:子密钥(E=Encrypt,加密;A=Authenticate,认证);
密钥指纹:D88E0F8A377388376A2A86E3F94780449446867F(40 位,唯一标识)。
阶段 2:GPG 签名(两种核心类型,覆盖所有场景)
点击查看代码#类型 1:明文签名(签名与内容合并,适合文本 / 代码)
将签名信息直接附加在文本末尾,生成新的 “签名 + 内容” 文件,适合邮件、代码提交说明等场景
# 对文件file.txt做明文签名,生成file.txt.asc(ASCII格式)
~> gpg --clearsign file.txt
# 对文本直接签名(输出到终端
~> echo "Hello GPG" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
Hello GPG
-----BEGIN PGP SIGNATURE-----
iHUEARYKAB0WIQRTRknnl5aEqIQZZnal9qKQn5fxzwUCaYF03QAKCRCl9qKQn5fx
z5V/AQDBjTn5XRAI4cJZZXNG4T5pbwcqjSDpOKwKFagC3zEjVQD/QPBrJHYzFuMg
c8fq6k4+cpTol83UFzy2guNyYK5E8QU=
=GqEC
-----END PGP SIGNATURE-----
#类型 2:分离签名(签名单独文件,适合二进制 / 大文件)
签名结果生成独立的.sig/.asc文件,原始文件和签名文件分离,适合软件安装包、ISO 镜像、视频等二进制文件:
# 对file.bin做分离签名,生成file.bin.sig(二进制格式)
gpg --detach-sign file.bin
# 生成ASCII格式的分离签名(便于传输),生成file.bin.asc
gpg --detach-sign --armor file.bin
核心区别:分离签名不修改原始文件,仅生成签名文件,是文件分发的主流方式(如 Linux 镜像的签名验证)。
阶段 3:GPG 验签(验证签名的真实性和内容完整性)
点击查看代码前提:导入对方的公钥(仅需一次)
# 方式1:手动导入公钥文件(如对方提供的public.key)
gpg --import public.key
# 方式2:从GPG密钥服务器获取(通过密钥ID/指纹/邮箱)
gpg --recv-keys D88E0F8A377388376A2A86E3F94780449446867F # 密钥指纹
# 验证公钥(关键:核对指纹是否与对方公布的一致)
gpg --fingerprint zhangsan@example.com
验签操作(分场景):
场景 1:验证明文签名文件
# 验证file.txt.asc(明文签名文件)
gpg --verify file.txt.asc
场景 2:验证分离签名 + 原始文件
# 验证二进制分离签名(file.bin + file.bin.sig)
gpg --verify file.bin.sig file.bin
# 验证ASCII分离签名(file.bin + file.bin.asc)
gpg --verify file.bin.asc file.bin
验签成功 / 失败的输出示例:
成功(核心:Good signature from):
gpg: Signature made Thu 02 Feb 2026 10:00:00 CST
gpg: using ED25519 key D88E0F8A377388376A2A86E3F94780449446867F
gpg: Good signature from "Zhang San <zhangsan@example.com>" [ultimate]
失败(核心:BAD signature):
gpg: Signature made Thu 02 Feb 2026 10:00:00 CST
gpg: using ED25519 key D88E0F8A377388376A2A86E3F94780449446867F
gpg: BAD signature from "Zhang San <zhangsan@example.com>" [ultimate]
2、密钥生命周期管理
1)备份密钥(重中之重,避免丢失)
备份存储:私钥备份文件需存放在离线设备(U 盘 / 硬盘),公钥可上传到密钥服务器 / 官网。
# 导出私钥(包含主密钥+子密钥,加密保护,需输入密码)
gpg --export-secret-keys --armor zhangsan@example.com > private_key_backup.asc
# 导出公钥(可公开)
gpg --export --armor zhangsan@example.com > public_key.asc
2)吊销密钥(子密钥泄露时紧急处理)
若子密钥泄露,可吊销子密钥并生成新的,主密钥仍可用:
# 生成吊销证书(需主密钥,离线操作)
gpg --gen-revoke zhangsan@example.com > revoke_cert.asc
# 导入吊销证书并发布(吊销子密钥)
gpg --import revoke_cert.asc
gpg --send-keys D88E0F8A377388376A2A86E3F94780449446867F # 发布到密钥服务器
3)更换子密钥(定期轮换,降低风险)
点击查看代码# 编辑密钥(进入交互模式)
gpg --edit-key zhangsan@example.com
# 在交互模式中执行:
gpg> addkey # 添加新的签名子密钥
gpg> trust # 设置信任级别
gpg> save # 保存修改
4)删除本地密钥(不再使用时)
点击查看代码# 删除公钥
gpg --delete-keys zhangsan@example.com
# 删除私钥(需确认)
gpg --delete-secret-keys zhangsan@example.com
3、GPG 签名的典型应用场景(贴合开发 / 运维)
1)Git 提交签名(证明代码提交者身份)
配置 Git 使用 GPG 签名,确保提交记录不可伪造:
# 配置Git使用GPG
git config --global user.signingkey D88E0F8A377388376A2A86E3F94780449446867F # 密钥指纹
git config --global commit.gpgsign true # 自动签名所有提交
# 提交代码(自动签名)
git commit -m "feat: add GPG signature"
# 验证提交签名
git log --show-signature
2)验证下载的软件 / 镜像(防篡改)
点击查看代码# 下载ISO和签名文件
wget https://releases.ubuntu.com/24.04/ubuntu-24.04-desktop-amd64.iso
wget https://releases.ubuntu.com/24.04/SHA256SUMS.gpg
# 验证签名
gpg --verify SHA256SUMS.gpg SHA256SUMS
# 验证哈希(确保ISO未被篡改)
sha256sum -c SHA256SUMS 2>&1 | grep OK
3)邮件加密签名(防篡改 + 保密)
搭配 Thunderbird/Outlook 等邮件客户端,对邮件做 “签名 + 加密”:
签名:证明邮件是你发送的,未被篡改;
加密:只有收件人能解密邮件内容。
二、SSH
是什么?
SSH(Secure Shell,安全外壳协议)是一种加密的网络通信协议,核心目的是替代传统的 Telnet、FTP、rlogin 等明文传输协议,为远程登录、服务器管理、数据传输提供 “端到端加密” 的安全通道。
✅ 加密性:所有传输的数据(密码、指令、文件)都经过强加密,即使被监听也无法破解;
✅ 认证性:严格验证服务器和客户端的身份,防止 “中间人攻击”(伪装服务器窃取信息);
✅ 完整性:确保传输的数据不被篡改,接收方能验证数据的原始性。
怎么用?
1、SSH 的主流实现:OpenSSH
SSH 是 “协议标准”,而我们日常使用的 SSH 工具(Linux/macOS 内置、Git Bash)都是OpenSSH—— 这是 SSH 协议的开源免费实现,由 OpenBSD 团队维护,也是目前唯一的主流实现(无商业闭源版)。
2、SSH 的核心组件:客户端 + 服务端 + 密钥体系
SSH 的工作依赖 “客户端 - 服务端” 架构,加上密钥体系完成认证,三者缺一不可
(1)SSH 客户端(你操作的一端)
定义:发起 SSH 连接的工具,运行在你的本地电脑 / 设备上;
常见客户端:
(2)SSH 服务端(被连接的一端)
定义:接收 SSH 连接的程序,运行在远程服务器 / GitLab 服务器上;
核心程序:sshd(Linux),默认监听 22 端口,需提前安装并启动;
核心配置:/etc/ssh/sshd_config(Linux),控制端口、认证方式、用户权限等。
(3) SSH 的密钥体系(认证的核心)
SSH 的认证依赖两类密钥:
3、SSH完整工作流程
SSH 的核心是 “先建立安全通道,再认证身份,最后加密传输数据”,完整流程分 4 个阶段,每一步都保证安全:
阶段 1:TCP 基础连接(握手前的准备)
客户端向服务端的 22 端口(默认)发起 TCP 连接请求;服务端接受连接,建立基础的 TCP 通道(此时数据仍未加密)。
阶段 2:SSH 协议握手(协商 “加密规则”+ 验证服务器身份)
这是 SSH 安全的核心第一步,双方协商 “怎么加密”,并验证服务器是 “真的”:
阶段 3:身份认证(验证 “你是你”,核心是 SSH key)
握手完成后,服务端需要验证客户端的身份,SSH 支持多种认证方式,这里只推荐公钥认证方式:
公钥认证(推荐,GitLab / 服务器首选)
阶段 4:加密数据传输(认证后的正常操作)
4、SSH key
是什么?
SSH key(SSH 密钥对)是基于 SSH(Secure Shell)协议的非对称加密身份认证机制,也是目前远程服务器 / 代码仓库最主流的安全认证方式。SSH key 是由「公钥(Public Key)+ 私钥(Private Key)」组成的密钥对,基于非对称加密算法生成(推荐 Ed25519,次之 RSA)。
在SSH场景里的认证核心:“你拥有私钥” = “你是合法身份”,服务器只需验证你能解密公钥加密的内容,即可确认身份,无需传输密码。
怎么用?
1)SSH key 的核心组成(两个文件,缺一不可)
生成 SSH key 后,本地会生成两个文件(默认路径:~/.ssh/,Windows 为C:\Users\你的用户名.ssh\):ed25519算法:
2)GitLab 配置 SSH key 的完整步骤
步骤 1:生成 Ed25519 SSH 密钥对
# 生成Ed25519密钥对,-C是备注(建议填GitLab绑定的邮箱,便于识别)
ssh-keygen -t ed25519 -C "your_email@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/yourname/.ssh/id_ed25519): # 直接回车,用默认路径
Enter passphrase (empty for no passphrase): # 建议设置私钥密码(防止私钥文件泄露后被滥用)
Enter same passphrase again: # 重复密码
生成成功后,~/.ssh/目录下会出现id_ed25519(私钥)和id_ed25519.pub(公钥)。
步骤 2:查看并复制公钥
点击查看代码# 查看公钥内容(Linux/macOS)
cat ~/.ssh/id_ed25519.pub
# Windows(Git Bash)
cat /c/Users/你的用户名/.ssh/id_ed25519.pub
步骤 3:上传公钥到 GitLab
步骤 4:测试 SSH 连接(验证配置是否成功)
点击查看代码# 测试与GitLab的SSH连接
ssh -T git@gitlab.com
三、KMS
KMS 全称 Key Management Service(密钥管理服务),是一种集中式、安全的密钥生命周期管理系统,核心作用是统一生成、存储、分发、轮换、销毁、授权和审计加密密钥,解决 “密钥怎么存、怎么用、怎么防泄露” 的核心安全问题,是现代企业级安全、云服务、区块链、智能合约开发的核心基础设施。
官方定义
KMS 是一套软硬件结合的服务(通常基于 HSM 硬件安全模块 提供底层安全),用于对所有类型的加密密钥(对称密钥、非对称密钥、签名密钥、证书私钥等)进行全生命周期管理,并提供加密 / 解密 / 签名 / 验签的 API 接口,让应用 / 服务无需直接接触原始密钥,仅通过调用 KMS 完成安全操作。
核心本质
密钥永不落地:原始密钥永远存储在 KMS 的安全硬件(HSM)中,应用 / 服务永远拿不到原始密钥,仅能调用 KMS 执行 “加密 / 签名” 等操作;
全生命周期管控:从密钥生成 → 存储 → 分发 → 轮换 → 禁用 → 销毁,全程可控、可审计;
集中式管理:所有密钥统一管理,替代分散在服务器、代码、配置文件中的密钥,消除泄露风险。
区块链专用 KMS
专为区块链 / 智能合约开发设计,核心管理钱包私钥、交易签名密钥,解决 “私钥泄露导致资产丢失” 的致命问题:
学习技术不是用来写HelloWorld和Demo的,而是要用来解决线上系统的真实问题的.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。