Exin 团队开源基于 Shamir’s Secret Sharing Scheme 的多签工具

前言


题图来自: © Exin / Secret Sharing / exin.one

Exin 团队开源了一个基于 Shamir’s Secret Sharing Scheme 的多签工具,GitHub 地址:https://github.com/ExinOne/secret-sharing,欢迎试用。

Shamir’s Secret Sharing Scheme


可能读者对「Shamir’s Secret Sharing Scheme」比较陌生,笔者简单介绍下。

Shamir’s Secret Sharing 是由 Adi Shamir 创建的密码学算法。Shamir’s Secret Sharing 是「Secret Sharing」的一种实现。具体的工作方式如下:现有 N 个参与者,其中一个参与者将一段私钥、密码或者敏感信息分为 N 个加密片段,设置的恢复阈值是 M(M < N),将每个唯一的片段分给每个参与者,各自妥善保管。要恢复原始私钥、密码或者敏感信息,需要至少 M 个加密的片段。通常我们将此类加密解密的方式称为多签,比如设置了 3/5 多签,需要至少 3 个人签名(Shamir’s Secret Sharing Scheme 中叫做提供加密的片段)才能发送交易(Shamir’s Secret Sharing Scheme 中叫做解密原始私钥、密码或者敏感信息)。

题图来自: © Thanh / Shamir’s secret sharing scheme / robinsnippet.blogspot.com

Shamir’s Secret Sharing Scheme 的应用场景,更多是在私钥、密码或者敏感信息的备份,单人或者多人泄漏丢失片段,原始的信息不会受影响。

Secret sharing 方案例如 Shamir’s 在少于分享机密的人数时,不会泄漏任何机密信息,所以具有信息论安全性 (也具有完善保密性)。一个密码系统具有信息论安全性(英语:Information-theoretic security ),意思是说它的安全性完全是以信息论为基础的。这种安全性要求即使攻击者有无限的计算能力也不能破解它。由于一定要使对手根本没有足够的信息来破解,所以这些密码系统被认为是不能以密码分析破解的。[1]

具体的算法可以 Shamir’s Secret Sharing 的 维基百科 页面,或者相关的 Paper。

应用


SatoshiLabs 有一个 SLIP-0039 提议,知名硬件钱包服务商 Trezor 在他们的 Trezor Model T 型号中实现了该提议,也就是说 Trezor Model T 支持了 Shamir Backup。具体可以参考 Trezor 的博客。[2]

GitHub 上有 Shamir’s Secret Sharing 各种语言的实现,感兴趣可以去找找。

使用教程


Exin 开源的工具不仅适用于团队,个人管理私钥等敏感信息同样适用, README 在此:https://github.com/ExinOne/secret-sharing/blob/master/README.md

使用示例:

python sharing.py --help
usage: sharing.py [-h] [-s] [-r] [-k KEYFILE] [-m {2,3}] [-x {3,5}]

Exin Secret Sharing based on Shamir's Secret Sharing Scheme.

optional arguments:
  -h, --help            show this help message and exit
  -s, --split           split private key (default: False)
  -r, --recover         recover private key (default: False)
  -k KEYFILE, --keyfile KEYFILE
                        private key or something sensitive file (default:
                        None)
  -m {2,3}, --min {2,3}
                        multisig min (default: 3)
  -x {3,5}, --max {3,5}
                        multisig max (default: 5)
Try python <script_name> -s/-r

将私钥存放在 key.log,创建一个 3/5 多签命令如下:

$ cat key.log
Hello, ExinOne. https://exin.one

$ python sharing.py -s -k key.log -m 3 -x 5

执行完成之后,将会得到 5 个私钥片段,根据参与者的编号,将 5 个私钥片段发给对应的参与者:

Keep or send one or more subkey securely.

1-6d12d038d2da66b3069d8c2eee597dddb7f4bfd2e0f7efbeaa0758bfea4779e2
2-2c2703cfbd777004784ff3f5fc49c5d581af4f9c832ba5a4549543b3697d4e93
3-3d3c9ac4c3efd608b8801fe582223757d0a9d21a728d2075fd9d8795a2c90484
4-a0539517e64398bfc72e0ffd7fe2d264a4e4474caf1c6033a5202466962a9bb5
5-556bf2c92472b829a459c43df58b96fbfe5eaf3338d964dd4b1d1a2643a212fd

如果要恢复,也很简单,拿到至少 3 个参与者的私钥片段(这里使用了 3 个编号的私钥片段,2、3、5,读者可以使用任意编号的私钥片段),放到 key.log,执行如下命令:

$ cat key.log
2-2c2703cfbd777004784ff3f5fc49c5d581af4f9c832ba5a4549543b3697d4e93
3-3d3c9ac4c3efd608b8801fe582223757d0a9d21a728d2075fd9d8795a2c90484
5-556bf2c92472b829a459c43df58b96fbfe5eaf3338d964dd4b1d1a2643a212fd

$ python sharing.py -r -k key.log -m 3
The full private key is: Hello, ExinOne. https://exin.one

加密和解密用到的命令,只有 1 个区别,加密/拆分使用 -s 参数,解密/恢复使用 -r 参数。

进阶用法


将一段私钥拆分成多个片段共享给参与者,这个传输过程可能会造成泄漏,造成一些安全隐患。读者可以将私钥片段通过 PGP + 1Password 加密传输,简单讲就是将私钥片段通过 PGP 加密,然后通过 1Password 共享。

Good Luck!

参考


[1] 信息论安全性 (2018-11-26). 维基百科. Retrieved from https://dwz.cn/KMqCp1EO.
[2] Shamir Backup — Our Newest Security Standard (2019-08-28). SatoshiLabs. Retrieved from https://dwz.cn/IvvHRr1R.

发表评论

电子邮件地址不会被公开。 必填项已用*标注