ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

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

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),仅供参考
返回列表