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:05 阅读更多 →
PostGraphile v5 CRUD Mutations 全指南:自动生成的增删改查、行为禁用与故障排查

PostGraphile v5 CRUD Mutations 全指南:自动生成的增删改查、行为禁用与故障排查

后端API网关 【免费下载链接】crystal 🔮 Graphiles Crystal Monorepo; home to Grafast, PostGraphile, pg-introspection, pg-sql2 and much more! 项目地址: https://gitcode.com/gh_mirrors/cry/crystal 点击查看 免费下载 本文是一份聚焦 PostGrap…

2026/9/24 15:51:04 阅读更多 →
HyperDX @hyperdx/app 2.39 系列演进全解析:从 LLM 可观测性到 ClickHouse 查询优化的开源前端平台

HyperDX @hyperdx/app 2.39 系列演进全解析:从 LLM 可观测性到 ClickHouse 查询优化的开源前端平台

可观测性云原生运维 【免费下载链接】hyperdx Resolve production issues, fast. An open source observability platform unifying session replays, logs, metrics, traces and errors powered by ClickHouse and OpenTelemetry. 项目地址: https://gitcode.com/g…

2026/9/24 15:51:04 阅读更多 →

最新新闻

fq 解码 AVI:样本索引优先级、流信息提取与解码加速实战指南

fq 解码 AVI:样本索引优先级、流信息提取与解码加速实战指南

fq 解码 AVI:样本索引优先级、流信息提取与解码加速实战指南 【免费下载链接】fq fq - jq for binary formats. Tool, language and decoders for working with binary formats. 项目地址: https://gitcode.com/gh_mirrors/fq/fq fq 是面向二进制格式的 jq 工…

2026/9/24 16:38:45 阅读更多 →
基于 CentOS7 搭建 5 节点三层高可用 Web 集群功能实现

基于 CentOS7 搭建 5 节点三层高可用 Web 集群功能实现

1.编写 Shell 批量运维脚本,替代重复手动命令,提升部署效率;通过 免密 SSH 批量循环脚本 健壮性判断 日志输出,实现: 一键启停全集群服务、一键巡检所有节点状态、自动化运维替代人工免密 SSH 原理:管理…

2026/9/24 16:38:45 阅读更多 →
Keystone 6 测试实战:用 getContext + node:test 为 GraphQL API 编写集成测试

Keystone 6 测试实战:用 getContext + node:test 为 GraphQL API 编写集成测试

后端 【免费下载链接】keystone The superpowered headless CMS for Node.js — built with GraphQL and React 项目地址: https://gitcode.com/gh_mirrors/key/keystone 点击查看 免费下载 导读 本指南以仓库中的 examples/testing 示例项目为主线,讲…

2026/9/24 16:38:45 阅读更多 →
Dart 分析服务器代码补全(Code Completion)实现指南:从请求处理到候选排序的完整链路

Dart 分析服务器代码补全(Code Completion)实现指南:从请求处理到候选排序的完整链路

Dart 分析服务器代码补全(Code Completion)实现指南:从请求处理到候选排序的完整链路 【免费下载链接】sdk The Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more. 项目地址: https://gitcode.com/…

2026/9/24 16:38:45 阅读更多 →
Whisper Windows 移植版:基于 DirectCompute 的高性能 GPGPU 推理指南

Whisper Windows 移植版:基于 DirectCompute 的高性能 GPGPU 推理指南

人工智能语音音频本地部署桌面应用 【免费下载链接】Whisper High-performance GPGPU inference of OpenAIs Whisper automatic speech recognition (ASR) model 项目地址: https://gitcode.com/gh_mirrors/wh/Whisper 点击查看 免费下载 本指南以仓库根目录 Readm…

2026/9/24 16:38:44 阅读更多 →
AWS SDK for C++ 跨服务示例全解析:从 Aurora Serverless 任务追踪器到 SNS/SQS 发布订阅

AWS SDK for C++ 跨服务示例全解析:从 Aurora Serverless 任务追踪器到 SNS/SQS 发布订阅

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地…

2026/9/24 16:37:44 阅读更多 →

日新闻

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

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

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

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →