跳转至

安全模型

本页说明 wallet-cli 提供的安全保护,以及仍需由用户自行承担的安全责任。

本地存储

种子和私钥等敏感信息均使用 master password 加密后存储,磁盘上不会保存可直接使用的明文。标签、 地址等元数据无需解锁即可读取,因此 list 不需要密码,而 tx send 在使用软件账户签名时需要密码。

master password 只是本地保护措施:它不会被发送到任何地方,也无法找回。它必须至少 8 个字符,并包含大写字母、小写字母、数字和特殊字符。

钱包恢复依赖 BIP39 助记词。create 不会直接显示助记词,而是加密存储种子。运行 backup 可以把明文助记词导出到权限为 0600 的文件,请将该文件离线保存。 如果密码和备份同时丢失,钱包将无法恢复;如果只是忘记密码,可以使用备份中的助记词通过 import mnemonic 重新导入钱包。

一份种子覆盖所有链家族——同一串助记词既能重新派生 TRON 地址,也能派生 EVM 地址——因此只需备份一份助记词,无需为每条链分别备份。

敏感信息的输入方式

命令行参数中的任何内容都会泄漏进 shell 历史和 ps 输出。导出的环境变量同样容易通过 shell 和 CI 日志泄漏。因此 wallet-cli 拒绝在命令行参数中接收密码、助记词和私钥,也不会为它们读取任何专用的环境变量——敏感信息只能通过以下方式传入:

  • 交互式 TTY 提示,或
  • 显式的 stdin 标志:--password-stdin--tx-stdin每次运行只能使用一个 *-stdin 标志, 以免同一管道的数据被错误的选项读取。助记词和私钥的限制更严格,只能通过隐藏的 TTY 提示输入; import mnemonicimport private-keychange-password 不提供 stdin 输入方式。

在脚本中,通过管道传入的敏感信息应来自密钥管理服务或密码管理器,不应来自纳入版本控制的文件。 参见 machine-interface → 敏感信息处理

防止不可信数据操控终端显示

权限名称、token 名称与符号、共同签名方标签等字段可能由其他链上参与者或第三方服务写入,不能视为 可信内容。在 text 模式下,wallet-cli 会在输出前进行安全处理:移除 ANSI/OSC 控制字节,并把不可见的 格式控制字符替换为可见的转义形式,例如 <U+202E>

这个转义很重要。U+202E 会反转其后所有内容的显示顺序,从而让一个权限名称改变它旁边打印的地址或权重的呈现方式;零宽字符则能让两个不同的名称渲染得一模一样。名称中出现 <U+200B><U+202E>,说明底层字符串里确实含有它——这是危险信号,而不是渲染故障。普通的从右到左文字(阿拉伯语、希伯来语)不含这类字符,显示正常。

JSON 输出保留原始值,调用方在终端或界面中展示这些内容前,需要自行进行同等的安全处理。

错误输出不会泄露敏感信息

预期之外的内部异常会先经过脱敏处理,再统一返回 internal_error,避免第三方库错误信息中可能包含的 密钥材料出现在命令输出或日志中。

包含敏感信息的文件

backup 使用 0600 权限写入敏感信息和元数据,并且不会覆盖已有文件。导出后,请立即将文件转移到 安全存储位置,并按照私钥文件的安全等级进行保护;导出文件不再受 wallet-cli 的加密存储机制保护。原生格式保存的是种子,因此包含所有家族的密钥;而 backup --keystore 保存的是单个私钥,由 --network 决定是哪个家族的——为某个家族导出的 keystore,对另一个家族没有任何访问权。

config.yaml 是另一个可能保存敏感信息的文件——一旦你配置了服务凭据或端点 API key 就是如此。wallet-cli 会对它做检查:如果它保存了凭据,却是符号链接或对同组/其他用户可读,命令会以 insecure_config 失败,而不是继续读取它。请对它执行 chmod 600。其中的敏感信息在读取时始终以掩码(********)呈现,而端点 URL 在列表中会被裁剪为主机名,因为商用 RPC URL 可能把 key 放在路径里。

选择密钥存储方式

方式 配置方式 权衡
软件密钥 create / import 方便;主机被攻破 = 密钥被攻破
Ledger import ledger 私钥始终保留在设备中;每次发送都在设备上确认。--app 会把账户限定在一个链家族上;如需同时使用两个家族,请分别通过两个 app 导入——见 Ledger 指南
仅观察 import watch 完全无法签名;适合安全地监控冷存储余额。绑定在所粘贴地址对应的家族上
签名/广播分离 TRON:tx send --build-only --expiration <ms>tx sign --offlinetx broadcast;EVM:同样的流程,只是不需要 --expiration 签名机可以保持离线;而 tx send --sign-only 仍要联网构建和估算。TRON 的过期时间默认约 60 秒、最长 24 小时,因此请设一个刚好够传输产物的最短窗口——见脚本编写

用户仍需承担的安全责任

wallet-cli 无法替用户核实收款方,也无法保护已经被攻破的主机或代为保管助记词和备份。它也无法判断:由同一份种子派生出的 TRON 地址和 EVM 地址,在一条从未使用过的链上是否确实由你控制——从格式上看,它们始终都是合法地址。交易一旦广播, 发送方无法主动撤销;是否达到链上最终性仍取决于固化状态。在主网上操作前,建议先执行一次 --dry-run,核对交易内容和预估费用。

另请参见

账户与 HD 钱包 · machine-interface · 故障排查