工作原理

查询机制

钱包可以在不暴露恢复短语或其熵值的情况下,检测该短语是否匹配已知的弱种子。

已发布的数据集体积很大,但每次检测只需要其中很小的一部分。

5.86 TB
分布在两个数据集中
2–4 MB
每次检测下载量

机制

查询隐私

查询从钱包本地推导恢复短语对应的熵值开始,对其进行哈希运算,然后只用哈希值的一小段前缀去获取对应的桶(bucket)。随后钱包在本地比对桶中的内容,判断该短语是否存在漏洞风险。

WALLET REMOTE UNLUKEY DATASETS Recovery phrase (12 or 24 words) Entropy — 16 or 32 raw bytes key = SHA-256(entropy) 32-byte key prefix only 19–20 bits Fetch static file /{bits}/{prefix} whole bucket ~2–4 MB, thousands of keys Compare the rest of the key locally against every entry in the bucket VULNERABLE NOT FOUND The wallet determines locally whether the recovery phrase is vulnerable.

k-匿名性

多个哈希,一个桶

多个共享同一前缀的哈希会被归入同一个桶。钱包下载该桶后,在本地检查其中是否存在匹配项。

桶内容

5280e c4a1f83e… 5280e 7e20b19a… 5280e 53bf2c04… 5280e 91c2d7a5… 5280e 0d3a6e18… 5280e f8619b4d… ~144,000 entries sharing this prefix Bucket /{bits}/5280e
共享前缀 共享该前缀的哈希后缀

前缀长度

权衡取舍

前缀的位数决定了每个桶中会归入多少条目。

前缀越长,桶的数量越多、每个桶中的条目越少,这样下载量更小,但匿名集也更小;前缀越短则相反。

下面的控件展示了这种权衡,数据基于 Coldcard(256 位)数据集中 44,203,122,032 个唯一密钥。

前缀长度 19
141618202224
524,288
桶数量
≈84,311
每个桶的密钥数(匿名集)
≈2.53 MB
每次检测平均下载量
256 位树目前实际使用的是 19 位前缀

数据集统计

两个数据集

数据集 唯一密钥数 前缀 桶数量 数据集大小 每次检测
Ill Bloom128 位熵 151,001,028,608 20 位 1,048,576 4.53 TB ≈4.32 MB
Coldcard256 位熵 44,203,122,032 19 位 524,288 1.33 TB ≈2.53 MB
已发布总计 195,204,150,640 5.86 TB