原标题:V神提出新型密钥分享方案,可用于脑钱包和社交恢复设计应用

注:原文作者是以太坊联合创始人Vitalik Buterin,在这篇文章中,他描述了一种新型的M-of-N密钥分享方案,并提出了脑钱包和社交恢复设计的两种应用案例。

假设你希望生成一个秘密s,而s可通过将N个密钥分享中的M个放在一起来恢复,其中所有N个密钥分享是预先知道的。那么这种方案有两个用例:

一种脑钱包,其中N个密钥分享是N个安全问题的答案,并且你希望仅通过M个安全问题的答案就可以恢复资金(单独的安全问题会很糟糕,但如果你将20个安全问题组合起来,你可以获得相当多的熵);一种社交恢复设计,其中你希望使用阈值解密而不是智能合约钱包,因为你正在尝试恢复访问私人数据,而不是加密货币,并且你希望你的恢复合作伙伴能够使用他们已经拥有的密钥(以减少有丢失这些密钥的风险);

普通的 M-of-N 密钥分享方案不适用于这些用例中的任何一个,因为它只允许预先选择 M 个密钥分享,剩余的 (N-M) 个密钥分享必须使用一种确定性算法从原始的M个中产生,并且看起来像随机数据(在脑钱包的情况下,它们不适合作为安全问题的答案,在社交恢复的情况下,需要用户使用特殊软件来存储它们,而不是从现有的HD钱包中衍生出来)。

所以这就是我们要去改进的,我们制定了一个 N-of-(2N-M) 阈值方案,从原N个密钥分享生成( N-M) 个附加密钥分享。然后我们在区块链上发布所有N-M 个附加密钥分享。如果需要,在社会恢复案例中,人们可以简单地给每个参与者一份所有附加密钥分享的副本。这会导致附加密钥分享变成有效的公共信息:它们丢失的风险可以忽略不计,但任何攻击者都会拥有它们。而结果是,在未发布的 N个密钥分享中,只要有M个密钥分享与 N-M 个附加密钥分享结合并揭示数据,我们就有了一个M-of-N方案,这正是我们想要的。

2021年7月18日更新:社交恢复用例的替代机制

在社交恢复用例中,我们希望设置过程尽可能简单,因为用户是懒惰倾向的,如果设置困难,他们将不可避免地选择不安全的小型恢复伙伴集。这意味着以去中心化方式生成密钥分享所需的分布式密钥生成 (DKG) 可能是一个坏主意,因为它需要 2 轮通信(这意味着额外的区块链交易或每个人同时在线并拥有同步通信通道)。

相反,我们可以利用账户持有人自己拥有他们的私钥这一事实。他们可以简单地向每个恢复伙伴询问他们的公钥(例如,通过 pk = G * hash(ecdsa_sign(msk, nonce)),其中 msk 是恢复伙伴的主要密钥),然后在链上发布一笔包含 nonce 的交易,并为每个 i 加密(share_i, pk_i) (注:其中 share_i 是第 i 个密钥分享,pk_i 是第 i 个参与者的公钥)。

如果我们避免重复使用nonce随机数,从而不重用密钥(例如,设置nonce = hash(secret, maddr_1 ... maddr_n),其中secret是放入恢复的值,maddr_i是第i个恢复伙伴的地址,应该就足够了),我们可以使用基础的Diffie-Hellman加密算法进行加密,这意味着仅具有 32 * (n+1) 个字节calldata数据的单笔交易,就足以保存恢复信息。

对此方案,ethresear.ch 论坛成员kelvin评论称:

“这很有趣!我猜在社交恢复设计中,N个参与者会给他们的私钥附加一些公共盐(salt,指通过在密码任意固定位置插入特定的字符串),然后将其哈希生成N个预先知道的密钥分享?

否则他们将不愿意泄露自己的密钥分享,以让N−M个附加密钥分享被计算,并且他们还必须透露 M 个密钥才能恢复秘密。

此外,你认为人们会用这种方式来分发哪些类型的私人数据呢?”

而Vitalik则回复称:

“1、实际上,他们会使用 hash(ecdsa_sign(key, salt))作为哈希函数来生成子密钥,因为 ecdsa_sign方法在 web3 API 中公开并且具有标准化的确定性输出。但这是一个实现细节, 效果是一样的。

2、我只是在考虑‘以太坊电子邮件’以及像Status这样的去中心化消息传递应用的加密密钥。另一个用例当然是其他区块链的私钥。”。