首页/新闻资讯/正文详情

Sliver 项目中的 Minisign 签名与验证:util/minisign 包源码级解析

发布时间:2026/9/24 15:52:08 来源:云帆数科 栏目:资讯中心
Sliver 项目中的 Minisign 签名与验证:util/minisign 包源码级解析
网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载导读util/minisign是 Sliver 对抗仿真框架Adversary Emulation Framework内置的一套 Minisign 签名与验证辅助库封装了 Ed25519 密钥对生成、消息签名/验签、私钥加密存储、公钥与签名的文本编解码以及适用于大文件与流式数据的 BLAKE2b 预哈希签名方案。本文以 util/minisign/README.md 为骨架结合包内全部源码与测试以及 Sliver 服务器端、Armory 扩展仓库、更新机制和 Zig 工具链下载等真实调用场景讲解该库的设计原理、API 用法与工程落地方式读完即可在自己的 Go 项目中复用这套经过生产检验的签名方案。一、包定位与文件结构按 README 的描述util/minisign的核心职责是Minisign 签名与验证辅助signing and verification helpers围绕「私钥private、公钥public、签名signature」三类对象提供统一封装。包的完整文件清单如下文件职责minisign.go高层 API密钥生成、签名、验证、流式 Readerprivate.go私钥解析、序列化与口令加密/解密public.go公钥加载、文本编解码signature.go签名结构定义、文本编解码与比较minisign_test.go、public_test.go、signature_test.go、rawsig_test.go四组单元测试internal/testdata/测试数据minisign.key、minisign.pub、message.txt、message.txt.minisig其中internal/testdata里的minisign.pub展示了 Minisign 公钥的典型文本形态untrusted comment: minisign public key C373193807678450 RWRQhGcHOBlzw4CoKyugkk4ioDfoxlXxC9LBxVNhJ3w9wcAxgvPsuo二、密码学基础与常量设计Minisign 是 Frank Denisjedisct1设计的一种轻量级签名工具格式底层依赖Ed25519 签名算法。包内 minisign.go 定义了两种算法标识与原始签名长度常量EdDSA 0x6445对原始消息直接签名适用于内存可容纳的消息HashEdDSA 0x4445对 BLAKE2b-512 预哈希后的消息签名适用于超大文件、流式场景RawSigSize 2 8 ed25519.SignatureSize 2 字节算法标识 8 字节密钥 ID 64 字节 Ed25519 签名 74 字节。密钥 ID 的生成逻辑在 GenerateKey对 Ed25519 公钥取blake2b.Sum256再取哈希前 8 字节的小端序作为 64 位 KeyID并同时填充PublicKey与PrivateKey结构。这意味着KeyID 是公钥的确定性派生标识验证方无需联网即可用公钥快速比对「这把钥匙对不对得上」。三、密钥生成GenerateKeyfunc GenerateKey(random io.Reader) (PublicKey, PrivateKey, error)传入熵源random传nil时内部仍要求io.Reader实际调用处通常传crypto/rand.Reader。实现直接委托ed25519.GenerateKey随后派生 KeyID 并分别填充公私钥。Sliver 服务器在 server/cryptography/cryptography.go 中用它为服务器生成专属的server.minisign签名密钥对并通过 JSON 序列化持久化到服务器配置中func generateServerMinisignPrivateKey() (*minisign.PrivateKey, error) { _, privateKey, err : minisign.GenerateKey(rand.Reader) // ... json.Marshal(minisignPrivateKey{RawID, RawBytes}) }四、核心签名与验证 API4.1 内存消息Sign / Verify这是最常用的组合直接对[]byte消息签名signature : minisign.Sign(privateKey, message) valid : minisign.Verify(publicKey, message, signature)Sign 等价于SignWithComments但自动生成通用注释trustedComment取当前 Unix 时间戳untrustedComment为空Verify 返回bool内部会先UnmarshalText解析签名文本再比对 KeyID、执行两层 Ed25519 验证见下文 4.3。4.2 自定义注释SignWithCommentsMinisign 签名格式区别于裸 Ed25519 的关键在于双注释机制见 signature.goTrustedComment被签名的注释验证时必须通过CommentSignature校验可安全信任UntrustedComment不被签名的注释仅作展示提示验证时不校验不得信任。sig : minisign.SignWithComments(privateKey, message, timestamp:1690000000, signature from server)在实现上minisign.go签名过程计算两个 Ed25519 签名msgSignature ed25519.Sign(priv, message) // 对消息本体签名 commentSignature ed25519.Sign(priv, msgSignature || trustedComment) // 对「签名可信注释」再签名验证时verify依次检查解析签名 → KeyID 匹配 → 校验msgSignature→ 拼接msgSignature || TrustedComment校验CommentSignature。这样即使消息签名有效若可信注释被篡改整体验证依然失败实现了对元数据的完整性保护。4.3 大文件与流式数据Reader 预哈希方案对于无法一次性载入内存的大文件包提供了基于io.Reader的流式方案minisign.goreader : minisign.NewReader(file) io.Copy(io.Discard, reader) // 边读边计算 BLAKE2b-512 摘要 signature : reader.Sign(privateKey) // 对摘要签名内部走 HashEdDSA 分支 valid : reader.Verify(publicKey, signature)NewReader内部创建 BLAKE2b-512 哈希实例Read方法在透传数据的同时持续写入哈希Sign/SignWithComments/Verify均以当前已读入内容的摘要快照为输入因此可以实现「读到某字节处签个名继续读再签」的前缀多签名能力摘要签名走HashEdDSA分支isHashed true验证时对应处理。Sliver 在下载 Zig 编译器工具链时正是用这个方案校验工件完整性util/assets/zig.goreader : minisign.NewReader(artifact) // ... 边下载边写入 reader signature : reader.Sign(*privateKey) // 或对已发布的签名做 reader.Verify五、原始签名Raw Signature紧凑的「签名消息」单缓冲格式util/minisign相比上游 minisign 库额外提供了raw 格式用于把签名与消息拼接进单个字节缓冲方便通过网络传输或落盘rawSig : minisign.SignRawBuf(privateKey, message) // [RawSigSize]byte rawMsg : append(rawSig[:], message...) valid : minisign.VerifyRawBuf(publicKey, rawMsg)布局为[2 字节算法 | 8 字节 KeyID | 64 字节 Ed25519 签名 | 消息...]signRaw。验证时verifyRaw先检查len(rawMessage) RawSigSize1再比对 KeyID若算法为HashEdDSA且调用方未预哈希则自动对消息取 BLAKE2b-512 后验证。rawsig_test.go 给出了三个验证场景100 轮随机消息往返验证成功TestRawSigValid、错误公钥必然失败TestRawSigInvalidKey、篡改消息字节后必然失败TestRawSigInvalidTamper从测试层面确认了该格式的抗篡改与密钥绑定属性。Sliver 服务器的「服务器签名原始缓冲」接口正是基于它实现的server/cryptography/cryptography.gofunc serverSignRawBuf(buf []byte) []byte { rawSig : minisign.SignRawBuf(*privateKey, buf) return append(rawSig[:], buf...) }六、私钥的口令加密与解密6.1 磁盘格式私钥以口令加密形式落盘避免明文密钥泄露。加密函数 EncryptKey 产出的文本为untrusted comment: minisign encrypted secret key\n后接 Base64 编码的 158 字节二进制privateKeySize 158 2223288104字段布局为偏移长度含义02算法标识EdDSA(0x6445)22KDF 算法scryptAlgorithm(0x6353即 Sc)42哈希算法blake2bAlgorithm(0x3242即 B2)632随机 salt388scrypt ops 参数468scrypt mem 参数54104加密后的密钥密文默认成本参数对齐 libsodium 的「敏感」级别private.godefaultOps 33554432OPS_LIMIT_SENSITIVE、defaultMem 1073741824MEM_LIMIT_SENSITIVE解密时会对 ops/mem 设置上限保护scryptOpsLimit/scryptMemLimit以防拒绝服务攻击。6.2 加密算法流程encryptKey 采用「流密码 完整性标签」结构tag BLAKE2b-256(EdDSA常量 || 明文)明文为 8 字节 KeyID 64 字节 Ed25519 私钥共 72 字节keystream Scrypt(password, salt, N, r, p)其中(N, r, p)由 convertScryptParameters 依据 ops/mem 换算ciphertext (plaintext || tag) ⊕ keystream104 字节。解密decryptKey反向异或后用常量时间比较subtle.ConstantTimeCompare校验 BLAKE2b-256 标签标签不匹配即返回errDecrypt。由于加密与解密都严格校验算法标识与长度错误口令或损坏文件都会被可靠拒绝。6.3 文件加载privateKey, err : minisign.PrivateKeyFromFile(correct horse battery staple, ./minisign.key)PrivateKeyFromFile 读取文件后直接调用DecryptKey。测试 minisign_test.go 中的TestRoundtrip就是用internal/testdata/minisign.key口令correct horse battery stapleinternal/testdata/message.txtinternal/testdata/minisign.pub完成「加载私钥 → 签名 → 加载公钥 → 验证」的完整闭环。另外PrivateKey实现了crypto.Signer接口private.goopts.HashFunc()为crypto.Hash(0)时走未哈希分支为crypto.BLAKE2b_512时要求消息恰好 64 字节并走预哈希分支签名确定性无需随机数。七、公钥与签名的文本编解码7.1 公钥MarshalText / UnmarshalTextPublicKey 内部持有小写id uint64与 32 字节 Ed25519 公钥。文本格式为untrusted comment: minisign public key: 16位大写十六进制KeyID Base642 字节算法 8 字节 KeyID 32 字节公钥。UnmarshalText会先剥离 untrusted comment 行trimUntrustedComment再严格校验长度与算法标识。7.2 签名四行文本格式Signature.MarshalText 输出固定四行结构internal/testdata/message.txt.minisig即真实样例untrusted comment: signature from minisign secret key RWRQhGcHOBlzwxrJCyuCrJfHSfyRKRxkuwa3JJ0bWEs7RHjL1OUmqnTrV1B9JzFuJIH/ybR2Eus9oEZKt9RbitpF/L4D35wg trusted comment: timestamp:1614549543 file:message.txt P/722ynQtIy0qadFHwLx5MsyNz/jDKJkDWQj4dDD2OKnVte8m/M14mwPE/1NMwzShPMSBhMXqZGdbeUZjDg第 1 行未签名注释展示用途第 2 行Base642 字节算法 8 字节 KeyID 64 字节消息签名第 3 行可信注释如timestamp:...、file:...被签名保护第 4 行Base64 的 64 字节注释签名。UnmarshalText按\n切分为恰好 4 段逐项校验前缀、长度与算法合法性。Signature还实现了String()不校验的宽松输出与Equal()忽略 untrusted comment 的一致性比较见 signature_test.go 的TestEqualSignature。八、在 Sliver 工程中的实际应用8.1 Armory 扩展仓库完整性校验Armory 是 Sliver 的第三方扩展/植入体仓库系统。其索引与每个包的下载都要求 minisign 签名验证client/command/armory/parsers.goarmoryIndexSigData, _ : base64.StdEncoding.DecodeString(indexResp.Minisig) valid : minisign.Verify(publicKey, armoryIndexData, armoryIndexSigData) if !valid { return nil, errors.New(index has invalid signature) }包的解析器统一返回*minisign.Signature与原始字节ArmoryPackageParser类型定义见 parsers.go安装阶段在 install.go 用minisign.Verify(publicKey, tarGz, rawSig)校验下载的 tar.gz 后才落地解压有效防止中间人替换扩展包。8.2 服务器密钥与客户端更新校验服务器端MinisignServerSign/MinisignServerPrivateKey/MinisignServerPublicKey三个封装server/cryptography/cryptography.go让服务器对内部消息签名、向客户端暴露公钥字符串客户端更新downloadAssetWithSignature在下载新版本二进制后用编译期注入的minisign.PublicKey校验签名client/command/update/update.goloadSliverPublicKey在公钥未注入时明确报错「minisign public key not set at build time」。8.3 Zig 工具链下载如 4.3 节所述util/assets/zig.go 通过loadZigPublicKey加载内置公钥配合流式minisign.NewReader对 Zig 编译器工件做签名校验保证自动化构建链下载的工具链可信。九、测试体系与验证路径包内四组测试覆盖了全部核心路径minisign_test.goTestRoundtrip文件→私钥→签名→公钥→验证与TestReaderRoundtrip流式 Reader 签名与验证rawsig_test.goraw 格式的有效性、错误密钥拒绝、消息篡改拒绝public_test.go公钥文本编解码与解析signature_test.go签名等价比较、非法签名拒绝、编解码往返。这些测试与internal/testdata中的固定密钥/签名对使得该包既可以作为独立的 Go 依赖被引用github.com/bishopfox/sliver/util/minisign其测试模式也可以作为任何接入 Minisign 校验流程的工程的参考模板。十、小结util/minisign以约 4 个核心文件实现了完整的 Minisign 生态Ed25519 密钥生成与 KeyID 派生、双注释签名、BLAKE2b-512 流式预哈希签名、scrypt BLAKE2b 私钥口令加密、四行文本签名格式以及 Sliver 特有的 raw 缓冲签名格式。它既是 Sliver 自身「服务器→客户端」与「Armory/工具链下载」完整性保障的基石也是一份可独立复用的、带完整测试与样例数据的 Go 密码学组件实现——如果需要在 Go 项目中落地「轻量、无外部依赖、兼容 minisign 工具链」的签名验证体系直接研读并复用本包是成本最低的路径。赞分享网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载相关推荐scan4all 项目中的 minisign文件签名与验签的极简安全方案全解析scan4all 项目中的 minisign文件签名与验签的极简安全方案全解析 导读 minisign 是一个极简到极致的文件签名与验签工具它用一条命令网络安全漏洞扫描渗透测试应用安全Sliver 二进制工件签名验证使用 Minisign 公钥校验官方发布真实性Sliver 二进制工件签名验证使用 Minisign 公钥校验官方发布真实性 本文围绕 Sliver 对抗仿真框架Adversary Emulation网络安全Sliver mTLS C2 传输层深度解析双向 TLS 认证、minisign 信封签名与 yamux 多路复用Sliver mTLS C2 传输层深度解析双向 TLS 认证、minisign 信封签名与 yamux 多路复用 本文基于 SliverAdversary网络安全上一篇告别臃肿5分钟掌握华硕笔记本终极轻量化控制神器G-Helper下一篇SAR舰船检测数据集SSDD深度学习海洋监测的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Vivado 2023.1补丁安装与IP更新验证全攻略:避开DRC报错与License坑
Vivado 2023.1补丁安装与IP更新验证全攻略:避开DRC报错与License坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:52:08

Chat LangChain 生产部署实战:6 步走通环境变量、部署与监控配置
Chat LangChain 生产部署实战:6 步走通环境变量、部署与监控配置

Chat LangChain 生产部署实战:6 步走通环境变量、部署与监控配置 【免费下载链接】chat-langchain 项目地址: https://gitcode.com/GitHub_Trending/ch/chat-langchain 本文带你把 Chat LangChain——一个 LangChain 文档问答助手——从开发状态推上生产&am… · 2026/9/24 15:52:08

AIM951/AIM958 SerDes调试实战:从寄存器配置到屏幕点亮
AIM951/AIM958 SerDes调试实战:从寄存器配置到屏幕点亮

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:52:08

shadcn-vue registry-item.json 完整规范:自定义组件注册表条目字段详解与实战指南
shadcn-vue registry-item.json 完整规范:自定义组件注册表条目字段详解与实战指南

UI组件前端 【免费下载链接】shadcn-vue Vue port of shadcn-ui 项目地址: https://gitcode.com/gh_mirrors/sh/shadcn-vue 点击查看 免费下载 导读 registry-item.json 是 shadcn-vue 组件注册表(registry)生态的核心规范文件,… · 2026/9/24 16:34:05

大麦抢票教程:3步配好抢票自动化脚本,如何把成功率拉满
大麦抢票教程:3步配好抢票自动化脚本,如何把成功率拉满

大麦抢票教程:3步配好抢票自动化脚本,如何把成功率拉满 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 开票一秒&#xff0c… · 2026/9/24 16:33:58

西安24小时自助健身房解决方案:技术架构与实战部署指南
西安24小时自助健身房解决方案:技术架构与实战部署指南

西安24小时自助健身房解决方案:技术架构与实战部署指南 1. 场景概述与核心需求分析 西安作为西北地区的中心城市,健身行业正在经历从“传统人工值守”向“无人化、智能化”的转型。24小时自助健身房的核心痛点在于:如何在无店员值守场景下实现… · 2026/9/24 16:33:52

RE2 正则表达式库实战指南:安全优先的线性时间匹配引擎及其 C++ API 与安装部署
RE2 正则表达式库实战指南:安全优先的线性时间匹配引擎及其 C++ API 与安装部署

RE2 正则表达式库实战指南:安全优先的线性时间匹配引擎及其 C API 与安装部署 【免费下载链接】re2 RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C library… · 2026/9/24 16:33:52

轻量级离线翻译:无网也能秒翻
轻量级离线翻译:无网也能秒翻

轻量级离线翻译:无网也能秒翻 【免费下载链接】argos-translate Open-source offline translation library written in Python 项目地址: https://gitcode.com/GitHub_Trending/ar/argos-translate 出差住酒店,Wi-Fi 一断,手机里的在线… · 2026/9/24 16:33:52

Yii2 别名(Aliases)完全指南:从 `@` 符号到路径/URL 解析的底层机制
Yii2 别名(Aliases)完全指南:从 `@` 符号到路径/URL 解析的底层机制

后端Web框架 【免费下载链接】yii2 Yii 2: The Fast, Secure and Professional PHP Framework 项目地址: https://gitcode.com/gh_mirrors/yi/yii2 点击查看 免费下载 别名(Aliases)是 Yii 2 框架中表示文件路径和 URL 的轻量级符号机制&… · 2026/9/24 16:33:39

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码