跳转至

安全模型

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

本地存储

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

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

钱包恢复依赖 BIP39 助记词,但 create 从不打印它——种子是加密存储的。运行 backup 可以把明文助记词导出到权限为 0600 的文件,请将该文件离线保存。密码和备份同时丢失,资金就没了;只丢密码的话,用备份里的助记词执行 import mnemonic 就能恢复钱包。例外是 4.13.1 之前创建的钱包中 1 号及之后的 TRON 账户——请把它们导出为 keystore 备份;参见出现 legacy_derivation 后如何找回地址。

一份种子覆盖所有链家族——同一串助记词既能重新派生出你的 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。它在被读取之前会先接受检查:存有凭据的配置若是符号链接、或对同组/其他用户可读,会直接以 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 签名机可以始终离线;--sign-only 仍会联网构建并估算。TRON 的默认时间窗约 60 秒、最长 24 小时,因此请设定一个刚好够搬运产物的最短窗口——参见脚本编写

用户仍需承担的安全责任

核对收款方(链上不可逆)、防范被攻陷主机上的 TTY,以及妥善保管助记词和备份的存放位置。在主网上,先跑一次 --dry-run 是很划算的保险。

另请参见

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