Cosmos SDK 密钥环(Keyring)完整指南:后端选型、配置与密钥管理实战
区块链【免费下载链接】cosmos-sdkFramework for building performant, customizable blockchains with native interoperability项目地址https://gitcode.com/gh_mirrors/co/cosmos-sdk点击查看免费下载本指南以 Cosmos SDK 官方文档《Setting up the keyring》为骨架系统讲解 SDK v0.38.0 之后引入的新版密钥环keyring的存储后端os、file、pass、kwallet、keyctl、test、memory及其适用场景并结合当前仓库源码crypto/keyring/keyring.go、client/keys/add.go剖析底层实现。读完本文你将掌握如何在运行节点前配置验证人密钥、通过keys子命令添加/查询/删除/导入导出密钥、用环境变量与client.toml切换后端并理解不同后端在加密强度与适用环境上的取舍。keyring 是什么为什么运行节点前必须先配置它密钥环keyring是 Cosmos SDK 应用持有的私钥/公钥对的统一存储与访问层。所有需要与节点交互的签名动作——例如验证人在出块时对区块签名、用户在发送交易时对消息签名——都必须先通过 keyring 取得对应私钥。以最典型的场景为例运行区块链节点前必须先配置好验证人密钥validator key否则节点无法正确签名区块。私钥可以存放在多种位置这些位置统称为后端backend例如普通文件或操作系统自带的凭据存储服务。从 v0.38.0 版本开始Cosmos SDK 引入了全新的 keyring 实现提供了一套安全地管理加密密钥的命令集合并支持多种存储后端需要注意的是部分后端并非在所有操作系统上可用例如keyctl仅支持 Linux。在源码层面keyring 的所有后端常量定义于 crypto/keyring/keyring.goconst ( BackendFile file BackendOS os BackendKWallet kwallet BackendPass pass BackendTest test BackendMemory memory )keyctl后端常量仅存在于 Linux 专属文件 crypto/keyring/keyring_linux.go 中这正对应部分后端并非在所有操作系统上可用的说法。可用后端总览后端存储位置是否加密是否需要密码适用环境os操作系统凭据子系统Keychain、Credentials Management API、libsecret/kwallet/keyctl是由系统策略决定有桌面环境的日常使用默认值file应用配置目录内的加密文件是每次访问均需输入无头headless服务器、脚本化操作passgpg加密文件由pass工具管理是依赖 gpg-agent 缓存无头服务器kwalletKDE Wallet Manager是由 KDE 钱包策略决定KDE 桌面环境keyctlLinux 内核密钥保留服务内存是无受内核权限控制Linux 平台仅限test应用配置目录下keyring-test子目录否明文无仅测试禁止生产memory进程内存是仅在内存中无仅测试/瞬时使用进程退出即丢失后端分发逻辑可在 crypto/keyring/keyring.go 的newKeyringGeneric函数中看到它针对每个后端调用keyring.Open构造底层存储未知后端名则返回ErrUnknownBackend错误。os后端默认选项与操作系统集成os后端依赖操作系统特定的凭据子系统来安全地处理密钥存储典型的系统凭据组件会按照用户密码策略负责密码提示、私钥存储与用户会话管理。各主流操作系统的密码管理器对应关系如下macOSKeychain钥匙串WindowsCredentials Management API凭据管理 APIGNU/LinuxlibsecretGNOME 生态kwalletKDE 生态keyctlLinux 内核密钥管理以 GNOME 为默认桌面环境的发行版通常自带 Seahorse它实际上是libsecret的一个便捷前端KDE 系发行版则常配套 KDE Wallet Manager是kwallet的客户端。keyctl则是一个利用 Linux 内核安全密钥管理系统、把密钥安全保存在内存中的后端。os是默认后端因为操作系统自带的凭据管理器面向用户最常见的使用习惯而设计能够在不牺牲安全性的前提下提供舒适的使用体验。这一点在代码中也有直接体现默认后端常量定义于 client/flags/flags.goDefaultKeyringBackend keyring.BackendOS同时 client/config/config.go 中client.toml的默认值同样为os。在源码实现上os后端配置crypto/keyring/keyring.go设置了KeychainTrustApplication: true即允许应用信任自身的钥匙串条目。对于无头headless环境——例如远程服务器、CI 流水线——推荐使用file和pass后端因为这两个后端不依赖图形化的桌面凭据组件。file后端加密文件存储与脚本化密码输入file后端与 v0.38.1 之前使用的 keybase 实现更为接近它把密钥环以加密形式存储在应用配置目录内具体是home/keyring-file子目录见 crypto/keyring/keyring.go 中newFileBackendKeyringConfig的FileDir设置。该后端每次访问 keyring 都会请求密码而一条命令内部可能触发多次访问从而出现多次密码提示。如果使用 bash 脚本以file后端执行命令可以采用如下格式一次性应答多次提示# 假设 KEYPASSWD 已在环境中设置 $ gaiacli config keyring-backend file # 使用 file 后端 $ (echo $KEYPASSWD; echo $KEYPASSWD) | gaiacli keys add me # 多次提示两行各应答一次 $ echo $KEYPASSWD | gaiacli keys show me # 单次提示注意gaiacli是 GaiaCosmos Hub二进制的历史示例名称。使用 Cosmos SDK 构建自己的应用时请把二进制名替换为你自己的可执行文件本仓库的测试/教学应用为simd。提示首次向空 keyring 添加密钥时系统会要求输入两次密码进行确认。该逻辑由 crypto/keyring/keyring.go 的newRealPrompt实现首次设置时会生成 bcrypt 密码哈希写入keyhash文件后续访问则用bcrypt.CompareHashAndPassword校验输入密码错误最多允许尝试 3 次maxPassphraseEntryAttempts 3见 crypto/keyring/keyring.go超过即返回ErrMaxPassPhraseAttempts。pass后端GPG 加密的密码仓库pass后端借助 pass 工具管理磁盘上密钥敏感数据与元数据的加密。密钥被存放在应用专属目录内的gpg 加密文件中。pass适用于大多数 UNIX 系操作系统和 GNU/Linux 发行版安装方式请查阅其手册。pass使用 GnuPG 进行加密。gpg在执行时会自动唤起gpg-agent守护进程由其负责 GnuPG 凭据的缓存。如需调整凭据 TTL、口令短语过期等缓存参数请查阅gpg-agent手册页。密码仓库在首次使用前必须初始化pass init GPG_KEY_ID将GPG_KEY_ID替换为你的 GPG 密钥 ID——可以使用个人 GPG 密钥也可以专门为加密该密码仓库另配一把密钥。源码实现上pass后端在 crypto/keyring/keyring.go 中通过PassPrefix: keyring-%spassKeyringPrefix前缀中填入应用名把各应用的数据隔离在不同pass目录下。kwallet后端KDE 桌面集成kwallet后端使用KDE Wallet Manager它预装于以 KDE 为默认桌面环境的 GNU/Linux 发行版中。其详细 API 信息可查阅 KWallet API 文档。实现上crypto/keyring/keyring.go该后端将ServiceName固定为kdewallet并把应用名作为KWalletAppID传入。keyctl后端Linux 内核密钥保留服务Kernel Key Retention Service内核密钥保留服务是相对较新加入 Linux 内核的安全组件允许把密码、私钥、认证令牌等敏感加密数据安全地保存在内存中。keyctl后端仅限 Linux 平台使用。其实现位于 crypto/keyring/keyring_linux.go默认密钥作用域scope为processkeyctlDefaultScope见 crypto/keyring/keyring_linux.go并可通过KeyctlScopeUser、KeyctlScopeUserSession、KeyctlScopeSession、KeyctlScopeProcess、KeyctlScopeThread等选项调整为其他内核密钥作用域。test与memory后端仅供测试test后端是file后端的无密码变体密钥以明文形式存储于磁盘home/keyring-test子目录密码函数固定返回test见 crypto/keyring/keyring.go。memory后端将密钥保存在内存中程序退出后密钥立即删除对应 crypto/keyring/keyring.go 中的NewInMemory底层使用keyring.NewArrayKeyring。两者都仅供测试目的使用严禁用于生产环境。此外client/context.go 的NewKeyringFromBackend在Simulate模拟/预估交易模式下会强制把后端切换为memory从而保证模拟执行不触碰真实密钥。通过环境变量设置后端除了在每条命令后追加--keyring-backend标志还可以用环境变量全局指定后端其命名规则为BINNAME_KEYRING_BACKEND二进制名大写、连字符替换为下划线。例如若二进制名为gaia-v5则export GAIA_V5_KEYRING_BACKENDpass若使用本仓库的simd二进制则对应SIMD_KEYRING_BACKEND。--keyring-backend标志的取值在白名单内os|file|kwallet|pass|test|memory定义于 client/flags/flags.go 的AddKeyringFlags同一函数还提供了--keyring-dir标志用于覆盖默认的home目录作为 keyring 存储位置。这些标志也可持久化写入client.toml配置文件见 client/config/config.go 的KeyringBackend字段与 client/config/toml.go。向 keyring 添加密钥keys add使用 Cosmos SDK 开发的应用都会自带keys子命令树。本教程使用simdCLI——一个基于 Cosmos SDK 构建、用于测试和教学的应用对应 simapp 目录。前提请确保你能构建自己的二进制并把下文代码片段中的simd替换为你自己的二进制名。simd keys查看keys命令的完整帮助simd keys [command] --help查看某个子命令的详细说明。创建新密钥使用add子命令并传入key_name参数。本教程全程使用test后端并将新密钥命名为my_validator该密钥将在后续章节中作为验证人密钥使用$ simd keys add my_validator --keyring-backend test # 将生成的地址存入变量供后续使用 MY_VALIDATOR_ADDRESS$(simd keys show my_validator -a --keyring-backend test)这条命令会完成以下工作生成一条全新的 24 词助记词mnemonic。源码中熵大小为 256 位mnemonicEntropySize 256见 client/keys/add.gokeyring 内部defaultEntropySize同样为 256见 crypto/keyring/types.go对应 BIP-39 的 24 个英文单词将密钥持久化到指定后端本例为test输出密钥对的地址、公钥等信息。如果该密钥对将用于持有价值资产代币务必把助记词抄写在安全的地方——它是你忘记密码后恢复账户的唯一凭据。keys add还支持大量实用标志完整定义见 client/keys/add.go标志说明--algo/--key-type签名算法默认secp256k1也支持ed25519等--recover从已有助记词恢复密钥而非新建--interactive/-i交互式提示输入 BIP39 口令与助记词--no-backup不打印助记词防止他人窥屏--hd-path手动指定 BIP32 HD 派生路径覆盖 BIP44 配置--coin-typeHD 派生的 coin type默认取 types/config.go 中 SDK 配置值通常为 118--accountHD 派生账户号≤ 2147483647--indexHD 派生地址索引≤ 2147483647--multisig用若干已存密钥名构造 legacy 多签公钥如--multisig k1,k2,k3--multisig-thresholdK-of-N 多签所需最少签名数--nosort多签密钥不按地址排序按给定顺序取用--pubkey/--pubkey-base64以 JSON / base64 形式导入任意公钥保存为 offline 密钥--ledger在 Ledger 硬件设备上保存本地引用--dry-run生成/恢复密钥但不写入本地存储--source从文件导入助记词需与--recover或--interactive联用--output输出格式text或json--hd-path未指定时代码会用hd.CreateHDPath(coinType, account, index)生成默认 BIP44 路径client/keys/add.go。签名算法默认secp256k1可选ed25519默认情况下keyring 生成secp256k1密钥对也可通过--algo ed25519创建ed25519密钥。同一个 keyring 可以同时持有两种类型的密钥Cosmos SDK 的x/auth模块原生支持这两种公钥算法。从当前仓库的 crypto/hd/algo.go 可以看到更完整的算法族secp256k1、ed25519、bls12_381、multi以及 NIST ML-DSA-65FIPS 204抗量子签名方案ml_dsa_65。其中ed25519与bls12_381目前不用于终端用户钱包/硬件密钥ml_dsa_65支持软件 keyring 生成账户密钥但不支持 Ledger 硬件钱包。密钥环默认支持列表SupportedAlgos: {hd.Secp256k1, hd.MlDsa65}在 crypto/keyring/keyring.go 中初始化。密钥管理的完整命令面keys命令树注册于 client/keys/root.go除add外还包括keys list列出 keyring 中全部密钥keys show按名称或地址查询密钥信息支持-a仅输出地址、-p仅输出公钥、--bech acc|val|cons切换 bech32 前缀编码、--qrcode以二维码显示地址、--device在 Ledger 设备上显示地址等标志详见 client/keys/show.gokeys delete删除密钥keys rename重命名密钥内部通过导出/删除/导入完成见 crypto/keyring/keyring.gokeys export/keys import以 ASCII armor 格式导出/导入口令加密的私钥、公钥keys import-hex导入 hex 编码的私钥支持0x前缀见 crypto/keyring/keyring.gokeys parse解析 bech32 地址字符串keys mnemonic生成随机助记词keys migrate执行旧版密钥格式迁移keys list-key-types列出支持的密钥类型。源码层面的实现细节每条密钥实际写入两条记录writeRecordcrypto/keyring/keyring.go会为每个密钥同时写入两个条目键uid.info数据为序列化后的 protobuf 密钥记录Record键地址hex.address数据为密钥名。这样设计是为了既能按名称也能按地址查询密钥对应Key与KeyByAddress两个方法KeyByAddress先通过地址索引取回密钥名再读取.info条目crypto/keyring/keyring.go。从 amino 到 protobuf 的自动迁移Migrator接口crypto/keyring/keyring.go与migrate函数crypto/keyring/keyring.go实现了旧版 amino 序列化密钥到新 protobuf 格式的自动转换读取条目后先尝试 protobuf 解码失败则回退到 amino 解码转换成功后把新格式写回 keyring 并打印Successfully migrated key name.。这意味着旧版本创建的文件型 keyring 在新版本中打开时会自动完成格式升级无需手动操作。Keyring接口统一能力所有后端最终都封装为实现了 crypto/keyring/keyring.go 中Keyring接口的keystoreBackend返回后端名、List/Key/KeyByAddress查询、Delete/Rename管理、NewMnemonic/NewAccount/SaveLedgerKey/SaveOfflineKey/SaveMultisig生成与导入、Sign/SignByAddress签名、Import*/Export*导入导出以及MigrateAll迁移。上层 CLI如client/keys只依赖该接口因此切换后端对用户命令完全透明。小结与选择建议日常开发机 / 桌面环境使用默认的os后端借助系统凭据管理器获得顺手且安全的使用体验服务器 / 无头环境优先file加密、可控、脚本友好或passGPG 加密 gpg-agent 缓存KDE 桌面可选kwalletLinux 服务器可选keyctl内核内存存储本地开发测试 / 自动化测试可使用test明文磁盘或memory进程内、退出即失在一条命令内可通过--keyring-backend指定后端全局可用BINNAME_KEYRING_BACKEND环境变量或 client.toml 中的keyring-backend配置项持久化选择。配置好 keyring 后即可进入下一步参考 运行节点指南 启动你的 Cosmos SDK 节点并在启动前用本文的方法完成验证人密钥的生成与配置。赞分享区块链【免费下载链接】cosmos-sdkFramework for building performant, customizable blockchains with native interoperability项目地址https://gitcode.com/gh_mirrors/co/cosmos-sdk点击查看免费下载相关推荐Cosmos SDK 密钥环(Keyring)配置与使用指南Cosmos SDK 密钥环 Keyring 配置与使用指南 密钥环概述 在Cosmos SDK构建的区块链应用中密钥环 Keyring 是管理公私钥对的核心区块链Kohya Trainer 完全指南从零开始掌握 Stable Diffusion 微调技术Kohya Trainer 完全指南从零开始掌握 Stable Diffusion 微调技术 Kohya Trainer 是一个专为 Stable DiffuVercel AI SDK终极配置指南环境变量与API密钥安全最佳实践 ️Vercel AI SDK终极配置指南环境变量与API密钥安全最佳实践 ️ Vercel AI SDK是一个强大的TypeScript AI工具包帮助开人工智能AI 应用AI Agent工具调用MCP Clients上一篇Ant Design Form.List 动态表单嵌套字段实战基于 field.name 构建可扩展的动态表单下一篇CANN ops-nn Tanh梯度算子创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考