POSTS2017

Shamir Secret Sharding

vault secret-sharing 简易原理

Hashicorp 这家公司的产品都很有意思,其中 Vault 是一个用来集中管理敏感信息(密码,各种 token,证书,key 等等)的工具。

Vault server 运行起来之后有两种状态:seal/unseal (密封/解封) ,这是因为:

Vault 的数据是加密储存在磁盘上的:由 encryption key 加密,这个 encryption key 是由 master key 加密储存在磁盘上,而 master key 是不存放在磁盘上。所以当 Vault server 刚启动时,由于 master key 未知,故 encryption key 以及实际数据都是无法被解密访问的,这种状态就称之为seal (密封)unseal(解封) 就是重建 master key 的过程。

由于 master key 太重要了,Vault 使用所谓的 Shamir’s Secret Sharing 算法把这个 master key 切分并分发给 n 个人,只有当这 n 个人里的最少 k 个人授权提供他们持有的部分,vault 才能重构出这个 master key,这个算法挺有趣,所以记录下来:

目标

密码 \(S\) 需要切分成 \(n\) 份: \(S_1, S_2, ... S_n\),且满足以下:

大于等于 \(k\) 个任意 \(S_i\) 就能算出 \(S\)

少于等于 \(k-1\) 个任意 \(S_i\) 无法算出 \(S\)

思路

这个算法的思路是这样的:在平面几何中,2 个点就能唯一决定一条直线,3 个点就能唯一决定一条抛物线,4 个点能唯一决定一条三次曲线。。。反之,1 个点决定不了唯一一条直线,2 个点或更少决定不了唯一一条抛物线。。。

对于一条 \(k-1\) 次曲线

\[f(x) = a_0 + a_{1}x + a_{2}x^{2} + ... + a_{k-1}x^{k-1}\]

只要 \(k\) 个点就能唯一决定,而少于 \(k\) 个点,则有无限条 \(k-1\) 次曲线穿过这些点。

所以算法思路是这样的:令 \(a_0 = S\),再随机选取 \(a_{1}, a_{2}, ... , a_{k-1}\),这样就构造出一条 \(k-1\) 次曲线,在曲线上随机选取 \(n\) 个点,这些点(的坐标值)就是分发给各人的密码 \(S_i\) 了。 只要超过 \(k\) 个人提供他们的密码(点),就能重构曲线,也就能获得 \(S = a_0 = f(0)\) 了。