Logo
新用户订阅 RPC,首月享 6.5 折优惠查看优惠
OnFinality Learn
基础设施与运维阅读约 11 分钟

冷钱包 vs 硬钱包:密钥存储、签名边界与验证

一份实用指南,区分冷钱包与硬钱包,说明各自如何改变你的签名和密钥存储攻击面,以及如何自行验证设置。

TL;DR

硬钱包(硬件钱包)是一种物理签名设备;冷钱包是一种密钥存储姿态,其中私钥从不接触联网环境。两者高度重叠但并非同义词:用于在线签署 DeFi 交易的硬件钱包仍然是硬件钱包,但并非完全冷。本文构建一个心智模型,说明密钥存放在哪里、签名在哪里产生、每个边界防范什么,然后给出可运行的程序来验证气隙签名流程并审计你自己的设置。最后讨论决定冷存储是否值得为给定余额付出运营成本的权衡。

直接回答与范围

硬钱包是一类设备:专用硬件,在安全元件或微控制器内存储私钥或种子,并在不向主机暴露密钥的情况下签署交易。冷钱包是一类操作姿态:私钥在从未连接网络的环​​境中生成和使用的钱包。冷钱包 vs 硬钱包的问题实际上是关于两个不同轴的问题——硬件边界和网络边界——而单个设备可以根据你的使用方式位于每个轴的不同点上。

本文涵盖机制(密钥存放在哪里、签名在哪里产生)、针对气隙签名流程的可复现验证程序,以及运营权衡。它不推荐特定供应商或设备。当你的在线只读或广播层需要 RPC 连接时,关于端点和提供商选择,请使用 RPC Assistant,而不是将本页视为提供商列表。

  • 硬钱包 = 硬件签名边界。
  • 冷钱包 = 密钥的网络隔离边界。
  • 设备可以是硬的但温的;纸钱包或离线机器设置可以是冷的但不硬。
  • 安全声明应针对你自己的签名流程进行验证,而不是从标签假设。

假设与前提条件

以下程序假设你已经持有种子短语或私钥,并希望推理它在哪里暴露。它们假设你基本熟悉公钥/私钥对、交易签名以及通过 RPC 端点广播已签名交易。你需要一台可以离线的机器、一台用于广播的第二台机器,以及一种在它们之间移动数据的方式(USB 存储、二维码或 microSD 卡)。

如果你仍在决定在线层如何连接到链,请先阅读 RPC 端点指南,这样广播步骤就不会成为你推理中的薄弱环节。这里不需要有资金的​​钱包;你可以在测试网上排练整个流程。

心智模型:两个边界,而非一个标签

明确区分两个边界。硬件边界回答:主机操作系统能读取私钥吗?硬件签名者说不能——密钥留在设备内部,只有签名和公共数据跨越边界。网络边界回答:持有或使用密钥的环境是否曾经可从网络访问?冷设置说没有——密钥生成和签名发生在从未加入 Wi-Fi、以太网或配对手机的隔离机器或设备上。

冷钱包 vs 硬钱包辩论中的大多数混淆来自将这两者混为一谈。插入在线笔记本电脑以批准智能合约的硬件钱包是硬的但不冷:密钥受硬件保护,但签名请求源自联网主机,因此钓鱼、恶意合约 calldata 以及剪贴板或显示篡改仍然是现实风险。相反,在永久离线的旧笔记本电脑上生成的种子在网络意义上是冷的,但没有安全元件,因此物理访问和生成时存在的恶意软件是主要风险。

有用的框架是一个矩阵:硬件签名者 + 从未联网 = 最强隔离;硬件签名者 + 在线主机 = 强密钥保护,较弱的请求完整性;离线机器上的软件密钥 = 冷但物理脆弱;在线机器上的软件密钥 = 热。你的工作是知道你在哪个单元格,并验证它,而不是信任产品类别。

密钥存放在哪里,签名在哪里产生

在硬件签名流程中,种子在设备上生成且从不导出。主机构建未签名交易,发送到设备,设备显示目标和金额供人工确认,并返回签名。然后主机广播已签名交易。私钥从不进入主机内存,这是使硬件边界有意义的属性。

在完全冷的流程中,离线机器持有密钥材料并构建和签署交易。只有已签名交易跨越到在线机器。在线机器从不看到密钥,也永远不需要交互式地要求离线机器签署任何东西,这完全消除了实时通道攻击面。

实际差异体现在攻击者必须控制什么。针对硬件签名者,攻击者需要诱骗人类在设备屏幕上批准恶意负载,或破坏设备固件。针对冷设置,攻击者需要物理访问离线机器或携带已签名交易的介质。这些是不同的威胁模型,对于每个用户来说,没有哪一个严格更好。

可运行程序:排练气隙签名和广播流程

以下 Python 草图使用占位密钥和占位 RPC URL 演示冷签名流程的形状。在离线机器上运行签名部分,在在线机器上运行广播部分。它使用 eth_account 和 requests;根据需要在每台机器上安装它们。切勿将真实主网密钥粘贴到联网 shell 中——在排练时使用测试网上的一次性测试密钥。

离线机器(仅构建和签名):

from eth_account import Account
from eth_account.messages import encode_defunct

# Placeholder only. On a real cold machine this key never leaves the device.
PRIVATE_KEY = "0x" + "11" * 32
acct = Account.from_key(PRIVATE_KEY)

# Example: sign a simple message payload as a stand-in for a transaction digest.
msg = encode_defunct(text="rehearsal-payload-v1")
signed = acct.sign_message(msg)

print("address:", acct.address)
print("signature:", signed.signature.hex())
# Carry ONLY the signature and the original payload to the online machine.

可运行程序:在在线机器上验证签名

在在线机器上,从负载和签名中恢复签名者地址。如果恢复的地址与预期地址匹配,则签名完整地跨越了气隙,并且是由你认为的密钥产生的。这是将冷流程从信念转变为检查的验证步骤。

在线机器(仅验证,无密钥材料):

from eth_account import Account
from eth_account.messages import encode_defunct

EXPECTED_ADDRESS = "0x0000000000000000000000000000000000000000"  # replace
PAYLOAD = "rehearsal-payload-v1"
SIGNATURE_HEX = "0x..."  # paste from the offline machine

msg = encode_defunct(text=PAYLOAD)
recovered = Account.recover_message(msg, signature=SIGNATURE_HEX)

print("recovered:", recovered)
print("matches expected:", recovered.lower() == EXPECTED_ADDRESS.lower())

# Broadcasting a real signed transaction would use an RPC endpoint here:
# RPC_URL = "RPC_URL"
# requests.post(RPC_URL, json={"jsonrpc":"2.0","id":1,
#   "method":"eth_sendRawTransaction","params":["0x..."]})

预期验证结果及如何解读

正确的排练在两台机器上打印相同的地址,并显示 matches expected: True。如果恢复的地址不同,则负载或签名在传输中被更改,使用了错误的密钥,或者两侧的编码不同。将任何不匹配视为气隙失败,并在广播任何东西之前停止。

将每次排练的结果记录在一个小表格中,以便随时间比较设置。不要填写你未观察到的数字;该表格是你自己测量的模板。

| 检查 | 离线机器 | 在线机器 | 通过条件 |

| --- | --- | --- | --- |

| 从密钥派生的地址 | 观察 | 不适用 | 匹配预期 |

| 签名恢复 | 产生 | 观察 | 恢复 == 预期 |

| 负载完整性 | 源 | 观察 | 字节完全相同的负载 |

| 广播(测试网) | 不适用 | 观察 | 返回交易哈希 |

| 网络隔离 | 不适用 | 观察 | 离线主机无路由 |

最后一行是人们跳过的。确认离线机器确实没有网络路由——检查其接口和默认路由——而不是因为你曾经拔掉过电缆就假设它。

常见故障排除

大多数冷流程故障是平凡的。签名恢复不匹配通常来自编码差异:一方对字符串进行哈希,另一方签署原始字节,或者在复制时添加了换行符。在签名之前,将负载规范化为单个规范字节字符串,并在两侧以相同方式哈希。

广播失败通常是 RPC 侧的:过时的 nonce、不足的 gas,或未看到父交易的节点。如果你通过共享端点广播,在归咎于签名之前,确认节点已同步并在预期链上。对于链特定的端点行为,网络目录 和 专用节点选项 是相关参考。

物理和运营故障也很重要:丢失的 microSD 卡、损坏的二维码传输,或从未真正气隙化的设备,因为它与手机配对。如果涉及硬件签名者,请在设备屏幕上验证目标和金额与你意图匹配——设备显示是签名存在之前的最后人工检查点。

  • 恢复不匹配:首先检查负载编码和空白。
  • 广播被拒绝:在重新签名之前检查 nonce、gas 和链 ID。
  • 设备显示的目标与主机不同:中止并调查。
  • 离线主机有默认路由:它不是冷的;修复隔离。

限制与权衡

冷存储以摩擦为代价换取隔离。每笔交易都需要手动往返,这使得频繁交易不切实际,并增加了转账期间人为错误的机会。硬件签名者减少了这种摩擦,但重新引入了主机和设备之间的实时通道,因此请求完整性取决于设备显示的内容和你信任的固件。

两种方法都不能防止生成时种子被破坏、钓鱼网站说服你签署恶意负载,或丢失备份。冷存储也不能防止胁迫或离线机器的物理盗窃。对于机构或高价值设置,多重签名和密钥份额的地理分离解决了单个冷设备无法解决的风险。

最后,在线层仍然重要。一个完美的冷签名者通过不可靠或配置错误的 RPC 端点广播可能会产生卡住的交易或误导性的确认。为可靠的广播路径做预算,并独立验证链状态。如果你需要为该层比较端点选项,请将问题路由到 RPC Assistant,而不是猜测。

下一步:将模型转化为例行程序

在测试网上排练完整的签名和验证循环,直到它变得无聊。然后将你的设置写为矩阵条目——硬件或软件,冷或温——并用你可以重复的检查验证每个声明。保持离线机器的隔离可审计,保持备份地理分离,并在每次更换设备或固件时重新运行验证表。

当你准备好连接在线层时,查看 RPC 定价 以了解可靠的广播路径成本,如果你打算运行自己的节点而不是使用提供商,请阅读 区块链节点托管指南。目标不是盒子上的标签;而是一个你自己测试过边界的签名流程。

永远不用担心基础设施

OnFinality 消除了 DevOps 的繁重工作,让您能够更聪明、更快地构建。

开始