scan4all 项目中的 minisign:文件签名与验签的极简安全方案全解析

发布时间:2026/9/17 20:17:14
scan4all 项目中的 minisign:文件签名与验签的极简安全方案全解析 scan4all 项目中的 minisign文件签名与验签的极简安全方案全解析【免费下载链接】scan4allOfficial repository vuls Scan: 15000PoCs; 23 kinds of application password crack; 7000Web fingerprints; 146 protocols and 90000 rules Port scanning; Fuzz, HW, awesome BugBounty( ͡° ͜ʖ ͡°)...项目地址: https://gitcode.com/GitHub_Trending/sca/scan4all导读minisign 是一个极简到极致的文件签名与验签工具它用一条命令完成密钥对生成、一条命令完成签名、一条命令完成验签却内置了 Ed25519 数字签名、BLAKE2b 哈希与 scrypt 口令派生等完整的现代密码学能力。在 scan4all 项目中aead.dev/minisignv0.2.0 作为间接依赖随 Go module 一起被 vendoring 进仓库见 go.mod 与 vendor/modules.txt其完整实现代码就位于 vendor/aead.dev/minisign/。读完本文你将掌握 minisign 命令行工具的完整用法生成密钥、签名、验签、恢复公钥、全部 13 个命令行参数的语义以及它的 Go 语言库级 API 与底层密码学原理可以直接用于构建自己的软件分发签名校验流程。一、minisign 是什么Go 实现的极简签名工具minisign 由 Andreas Auernhammer 用 Go 语言实现是 Frank Denis 原始 C 实现的移植版本。它被设计为dead simple——只专注做三件事生成Generate创建一对公私钥签名Sign用私钥为文件生成签名文件验证Verify用公钥验证文件的签名是否有效。它在设计上的关键决策是密钥对默认受口令保护生成的私钥不是裸的 Ed25519 密钥而是用用户口令经 scrypt 密钥派生后加密存储的密文任何拿到私钥文件的人都无法直接使用必须输入正确的口令。这种私钥加密落地的设计让 minisign 特别适合个人开发者签名发布软件包、脚本或配置文件的使用场景。二、快速上手三个命令完成全流程minisign 的 CLI 使用体验非常直观README 给出了完整的三步走示例密钥生成 → 签名 → 验签下面逐一展开。第一步生成密钥对-G$ minisign -G Please enter a password to protect the secret key. Enter Password: Enter Password (one more time): Deriving a key from the password in order to encrypt the secret key... done The secret key was saved as ~/.minisign/minisign.key - Keep it secret! The public key was published as minisign.pub - That one can be public. Files signed using this key pair can be verified with the following command: minisign -Vm file -P RWSYKA736yqhJrZ7cRDdWgck/WKtwW9ATBFmk8pQ1lHeUKXtV6uJ7Fu-G模式会交互式要求输入两遍口令来保护私钥然后用 scrypt 从口令派生密钥并加密私钥。命令结束时私钥保存到~/.minisign/minisign.key必须保密公钥保存到当前目录的minisign.pub可以公开分发终端会直接打印出用该密钥对验签的标准命令公钥以 Base64 字符串形式内嵌其中-P参数方便你拷贝到任何机器上立即验签无需携带公钥文件。第二步签名文件-S$ minisign -Sm message.txt Enter password: Deriving a key from the password in order to decrypt the secret key... done-S表示签名Sign-m message.txt指定待签名文件。由于私钥是加密存储的这一步需要输入生成密钥对时设置的口令程序会解密私钥、计算文件签名并写出默认的签名文件message.txt.minisig。第三步验证签名-V$ minisign -Vm message.txt Signature and comment signature verified Trusted comment: timestamp:1614718943 filename:message.txt-V表示验签Verify-m message.txt指定待验证文件。验证通过后输出两行信息第一行确认文件签名与comment 签名双双验证成功第二行展示签名中携带的 trusted comment——这里可以看到 minisign 默认在签名里自动嵌入的时间戳与文件名用于审计这个签名是什么时候、针对哪个文件生成的。如果文件在签名后被篡改过验证会失败并给出明确报错。三、命令行完整参考四种模式与全部参数README 给出了 minisign CLI 的完整语法整理如下。语法总览Usage: minisign -G [-p pubKey] [-s secKey] minisign -S [-x signature] [-s secKey] [-c comment] [-t comment] -m file... minisign -V [-H] [-x signature] [-p pubKey | -P pubKey] [-o] [-q | -Q ] -m file minisign -R [-s secKey] [-p pubKey]四种操作模式模式参数说明生成-G生成一对新的公钥/私钥签名-S使用私钥为文件签名验签-V使用公钥验证文件签名恢复-R从私钥重新生成公钥文件全部参数详解参数作用默认值-m file要签名或验证的文件必填-o配合-V使用验证通过后将文件内容输出到标准输出关闭-H配合-V使用要求对预哈希后的文件进行验签关闭-p pubKey指定公钥文件路径./minisign.pub-P pubKey直接以 Base64 字符串形式传入公钥无-s secKey指定私钥文件路径$HOME/.minisign/minisign.key-x signature指定签名文件路径file.minisig-c comment添加一行非受信注释空-t comment添加一行受信注释时间戳文件名-q安静模式抑制输出关闭-Q极简安静模式配合-V仅打印受信注释关闭-f配合-G或-R覆盖已存在的公钥/私钥文件关闭-v打印版本信息关闭其中两个细节值得特别说明-p与-P是互斥的-p指定公钥文件路径-P直接内嵌公钥的 Base64 文本。后者正是上面生成密钥对输出中那条验签命令所用的形式适合在没有公钥文件的场景下快速验签。-c与-t的信任语义截然不同对应源码中的UntrustedComment与TrustedComment见 signature.go-t指定的受信注释会被签名验签时若被篡改则验证失败可以安全信任-c指定的非受信注释不参与签名任何人可以改它而不破坏签名绝不能作为信任依据。四、安装预编译二进制与源码构建两种方式README 提供了两种安装路径。方式一使用预编译二进制minisign 为 Windows、Linux、macOS 三大平台发布预编译产物官方 README 中以 v0.1.2 为例列出的构建矩阵如下操作系统架构发行包Linuxamd64minisign-linux-amd64.tar.gzLinuxarm64minisign-linux-arm64.tar.gzmacOSarm64minisign-darwin-arm64.tar.gzmacOSamd64minisign-darwin-amd64.tar.gzWindowsamd64minisign-windows-amd64.zip下载对应平台的压缩包解压后即可直接使用无需任何运行时依赖。注意这里列的发行版号以官方 release 页面的最新 tag 为准本文引用的仓库中 vendoring 的版本为 v0.2.0见 go.sum。方式二从源码构建Go 1.16如果你的系统已安装 Go 1.16 及以上版本可以一条命令从源码构建git clone https://aead.dev/minisign cd minisign go build -o . aead.dev/minisign/cmd/minisign构建产物就是当前目录下的minisign可执行文件。这与 scan4all 仓库中对该模块的 vendoring 方式一致——aead.dev/minisign以独立 Go module 的身份被引入并固化在 vendor/ 目录下构建时不需要联网拉取。五、作为 Go 库使用签名验签的最小代码除了命令行工具minisign 还暴露了完整的 Go 语言库 API只需要一行 importimport aead.dev/minisignREADME 给出了一个完整的库级示例生成密钥对 → 签名 → 验签的闭环。package main import ( crypto/rand log aead.dev/minisign ) func main() { var message []byte(Hello World!) public, private, err : minisign.GenerateKey(rand.Reader) if err ! nil { log.Fatalln(err) } signature : minisign.Sign(private, message) if !minisign.Verify(public, message, signature) { log.Fatalln(signature verification failed) } log.Println(string(message)) }这个示例覆盖了库的四个核心 APIAPI签名作用GenerateKey(random io.Reader)func GenerateKey(random io.Reader) (PublicKey, PrivateKey, error)用熵源生成公私钥对random传nil时使用crypto/rand.Reader见 minisign.goSign(private PrivateKey, message []byte) []bytefunc Sign(privateKey PrivateKey, message []byte) []byte对消息签名返回可传输的签名文本含默认注释Verify(public PublicKey, message, signature []byte) boolfunc Verify(publicKey PublicKey, message, signature []byte) bool验证签名返回布尔结果GenerateKey生成的公钥/私钥PublicKey/PrivateKey类型分别实现crypto.PublicKey与crypto.Signer接口底层库还提供了更多进阶 API例如SignWithComments/Reader.SignWithComments自定义受信与非受信注释Reader流式签名验签边读取边计算哈希支持对超长文件无法整体载入内存做HashEdDSA预哈希签名也能对同一消息的前缀片段生成快照签名见 minisign.goPublicKeyFromFile/PrivateKeyFromFile(password, path)/SignatureFromFile从文件加载密钥与签名见 public.go、private.go、signature.go。六、底层原理读懂 minisign 的密码学设计结合 vendor/aead.dev/minisign/ 下的源码可以完整还原 minisign 的密码学实现细节。6.1 签名算法Ed25519 BLAKE2bminisign 的签名算法基于 Ed25519包注释与EdDSA uint16 0x6445常量可见于 minisign.goEdDSA0x6445直接对完整消息签名用于能整体放入内存的文件HashEdDSA0x4445先对消息做 BLAKE2b-512 哈希再签名用于无法载入内存的大文件配合 CLI 的-H参数与库的Reader流式接口。验签时对HashEdDSA签名会自动先对消息做blake2b.Sum512再交给 Ed25519 验证见 minisign.go。因此两种算法产出的签名在验签端是透明兼容的。6.2 双签名机制消息签名 注释签名每次签名实际上会产生两个 Ed25519 签名见 minisign.gomsgSignature Ed25519(私钥, 消息)对消息本体签名commentSignature Ed25519(私钥, msgSignature || trustedComment)对消息签名 受信注释拼接结果再签名。由此在验签时得到两层保证消息未被篡改且受信注释如时间戳、文件名是真实可信的。而非受信注释只是签名文件第一行的纯文本前缀不参与任何签名计算。6.3 签名文件格式签名是纯文本的四行结构由Signature.String()方法生成见 signature.gountrusted comment: 非受信注释 Base64(2字节算法 || 8字节KeyID || 64字节消息签名) trusted comment: 受信注释 Base64(64字节注释签名)解析时UnmarshalText严格校验四行结构、算法标识只允许EdDSA/HashEdDSA、各段长度以及注释前缀任何一项不合法都会返回错误见 signature.go。6.4 密钥格式与私钥加密scrypt 异或流加密公钥的文本格式为一行注释加一行 Base642字节算法 || 8字节KeyID || 32字节Ed25519公钥见 public.go。其中的 64 位KeyID由公钥本身经 BLAKE2b-256 哈希后取前 8 字节小端序得到见 minisign.go用于在验签时快速定位候选公钥。私钥落地时经过口令加密格式为固定 158 字节2字节算法 || 2字节scrypt标识(0x6353) || 2字节blake2b标识(0x3242) || 32字节随机盐 || 8字节scrypt ops || 8字节scrypt mem || 104字节密文见 private.go。加密流程见encryptKeyprivate.go明文 8 字节 KeyID ‖ 64 字节 Ed25519 私钥共 72 字节计算完整性标签tag BLAKE2b-256(0x6445 || 明文)用scrypt(口令, 盐, N, r, p)派生 104 字节密钥流密文 (明文 ‖ tag) ⊕ 密钥流。解密时反向异或出明文与标签用常量时间比较subtle.ConstantTimeCompare校验标签防止针对口令的侧信道攻击见 private.go。默认的 scrypt 成本参数ops33554432、mem1073741824对齐 libsodium 的OPS_LIMIT_SENSITIVE/MEM_LIMIT_SENSITIVE且设有上限0x2000000ops、0x40000000mem防止恶意构造的密钥文件拖垮验签端见 private.go。6.5 签名确定性minisign 的签名是确定性的PrivateKey.Sign不需要也不使用随机源io.Reader参数被忽略相同消息 相同私钥永远产出相同签名见 private.go。这归功于 Ed25519 签名算法本身的确定性设计便于签名结果的重复比对与审计。七、在 scan4all 中的定位与延伸阅读在本仓库中aead.dev/minisign以 v0.2.0 作为间接依赖出现go.mod源码被完整 vendoring 到 vendor/aead.dev/minisign/包含minisign.go、private.go、public.go、signature.go与 LICENSE、README。这类签名库在安全工具链中的典型用途是校验外部下发的 PoC 模板、指纹规则或漏洞库更新包是否来自可信发布方、是否在传输中被篡改——这正是 minisign 设计的核心场景。如果你想进一步实践可以在 scan4all 的 Go 代码中直接以aead.dev/minisign包为依赖参考上文第五节的最小示例把验签逻辑接入到项目读取外部规则文件的入口处日常验证第三方下发的文件签名则直接使用第三节的 CLI 命令即可。结语minisign 的价值在于用最少的命令数封装了完整且现代的密码学栈Ed25519 提供抗篡改的数字签名BLAKE2b 提供高速哈希与密钥 ID 派生scrypt 提供抗暴力破解的口令保护双签名机制让受信注释真正可信。无论是独立命令行使用还是像 scan4all 这样将其作为 Go 依赖嵌入自己的安全工具链minisign 都提供了一个简单、可审计、开箱即用的文件签名方案。参考文件索引官方文档主体vendor/aead.dev/minisign/README.md核心实现签名/验签/流式接口vendor/aead.dev/minisign/minisign.go私钥加密与解密实现vendor/aead.dev/minisign/private.go公钥解析与序列化vendor/aead.dev/minisign/public.go签名格式定义与解析vendor/aead.dev/minisign/signature.go依赖声明go.mod、go.sum、vendor/modules.txt【免费下载链接】scan4allOfficial repository vuls Scan: 15000PoCs; 23 kinds of application password crack; 7000Web fingerprints; 146 protocols and 90000 rules Port scanning; Fuzz, HW, awesome BugBounty( ͡° ͜ʖ ͡°)...项目地址: https://gitcode.com/GitHub_Trending/sca/scan4all创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询