显示crate…
1个不稳定版本
0.4.2 | 2021年3月3日 |
---|
#36 in #bip-39
694 次每月下载
在 88 个crate中(通过 tet-core)使用
19KB
167 行
tetcore-bip39
这是一个从BIP39短语中派生Ristretto压缩Ed25519(应与此时的Ed25519兼容)密钥的crate。
为什么?
这里自然的方法是使用从BIP39短语生成的64字节种子,并使用它来构建密钥。这种方法虽然合理且易于实现,但也意味着我们必须继承种子生成的一切特性。由于我们无论如何都要与BIP32和BIP44不兼容(我们可以自由这样做,因为我们不再使用Secp256k1曲线),也就没有必要遵守从助记词生成BIP39种子的规则。
BIP39种子生成旨在与用户提供的脑钱包短语兼容,并可扩展到提供自己字典和校验和机制的钱包。这两点的问题
- 脑钱包是一个糟糕的想法,仅仅是因为人类是糟糕的熵生成器。几乎不可能教育用户如何以安全的方式使用该功能。2048轮PBKDF2仅仅是小事一桩,对任何拥有现代消费级硬件的人来说,都不能提供真正的字典攻击保护。脑钱包给了用户虚假的安全感。 人们就是这样失去了钱财,而今天的钱包提供商通常坚持使用由CSPRNG提供的字典短语。
- 提供自己的字典从第一天起就陷入了 你不需要它 反模式。钱包提供商(无论是硬件还是软件)通常希望他们的产品与其他钱包兼容,这样用户就可以在不迁移所有资产的情况下迁移到他们的产品。
为了实现上述功能,短语必须在“真正的规范编码”中进行精确编码,这里选择了UTF-8 NFKD。这对于英语短语来说在很大程度上是无关紧要的(甚至被忽略),因为它们在几乎所有的字符编码中都会被编码为基本ASCII,但对于使用非ASCII字符的字典来说,这立即成为一个问题。即使使用了正确的编码并正确实现,对于一些非英语字典来说,仍然存在其他注意事项,例如将空格规范化到规范形式,或者在字典查找中使某些基于拉丁字母的字符与其基字符等效(例如,西班牙语的ñ
和n
应可互换)。考虑到所有这些,我感到头疼,并为错误实现的分歧打开了大门,导致兼容性破坏。
BIP39已经提供了一种不受所有这些问题的记忆词形式:熵字节数组。由于验证校验和需要从生成短语的熵中恢复,实际上并不需要额外的工作。钱包实现者可以在他们认为方便的编码中编码字典(只要它们是标准的BIP39字典),使用Java和JavaScript提供的UTF-16字符串原语没有任何害处。由于字典是固定和已知的,校验是在熵本身上进行的,因此确切的字符编码变得无关紧要,包括精确的代码点和单词周围的空白数量。因此,创建错误实现的难度更大。
PBKDF2和密码都保留了下来。使用24个单词(其熵为256位)使得额外的哈希冗余(如果你可以暴力破解256位熵,你也可以直接暴力破解秘密密钥),然而,一些用户可能仍在使用来自其他应用的12个单词短语。在我看来,没有很好的理由禁止用户使用12个单词恢复他们的旧钱包,在这种情况下,额外的哈希确实提供了一些保护。密码也是一些高级用户认为有用的功能——尤其是为了创建一个带有空密码的小额余额的诱饵地址,而真正的资金则存储在需要输入密码的地址上。
为什么不完全放弃BIP39呢?
因为有一些硬件钱包使用单个短语来管理整个设备,并在多个网络上使用该短语管理多个账户。一个完全不同的单词表会使它们在提供未来的Tetcore支持时遇到很多困难。
依赖关系
~4.5MB
~85K SLoC