安全模型¶
本页说明 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 mnemonic、import private-key和change-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 --offline → tx broadcast;EVM:同样的流程,只是不需要 --expiration |
签名机可以保持离线;而 tx send --sign-only 仍要联网构建和估算。TRON 的过期时间默认约 60 秒、最长 24 小时,因此请设一个刚好够传输产物的最短窗口——见脚本编写 |
用户仍需承担的安全责任¶
wallet-cli 无法替用户核实收款方,也无法保护已经被攻破的主机或代为保管助记词和备份。它也无法判断:由同一份种子派生出的 TRON 地址和 EVM 地址,在一条从未使用过的链上是否确实由你控制——从格式上看,它们始终都是合法地址。交易一旦广播,
发送方无法主动撤销;是否达到链上最终性仍取决于固化状态。在主网上操作前,建议先执行一次
--dry-run,核对交易内容和预估费用。
另请参见¶
账户与 HD 钱包 · machine-interface · 故障排查