识数据加密和数据去重都对区块链存储起到决定性的作用。加密后去重的核心问题在于数据的授权。即 A 存储的数据,当 B 也要存储相同的数据时,如何将 A 的数据授权给 B 使用而且还不影响 A 的数据安全性。YottaChain通过其创始人王东临的TruPrivacy专利,解决了这个问题。
2015 年,TruPrivacy 技术在全球最大黑客大会 DefCon 上公开悬赏验证,在敞开服务器任黑客自由出入并给黑客提供管理账户权限的前提下,全球顶级黑客联手都未能偷走服务器上存储的用户数据,无人领取高额现金奖励。其专利可查询2015 年 10 月 20 日授权的 9164926B2 号美国专利,2016 年 4 月 13 日授权的 2024272 号中国专利,2016 年 9 月 19 日授权的 2830282 号欧洲专利。
我们看下在YottaChain的白皮书里面针对这块的算法说明就一目了然了。
文件加密存储过程
采用这种机制时,除了用户权限表外,还要维护一个全局的元数据表,记录明文 Hash 和密文 Hash的对应关系,在写入数据时要先查询是否存在相同 Hash 的数据,如果没有该项再存:
- Hash(Data) →Hdata 计算明文 Hash
- If CheckDup(Hdata) = TRUE goto 11 如果已经存在相同的数据,转到第 11 步
- RandomSym()→Stk 随机生成对称密钥作为文件的存储密钥
- Enc(Stk, Data)→EncData 用存储密钥加密文件
- Hash(EncData) →Henc 计算密文 Hash
- GenKey(Data) →Sdata 从数据明文生成对称密钥,可以用数据明文加盐之后计算 Hash 值的方式生成。之所以要加盐是因为明文 Hash 是一个公开的值,不加盐的话不拥有数据明文的人也能获得该密钥。为了保证
一致性,盐值可以是一个固定的算法生成,例如先做第一次 Hash 作为
盐值,然后加盐后再计算第二次 Hash 作为对称密钥,两次 Hash 可以
采用不同的算法。 - Enc(Hdata, Stk) →EncStk’ 以数据明文生成的对称密钥来加密存储密钥。
这是非常“诡异”的一步,以明文作为密钥,密钥作为明文来加密,大
多数人看这个算法的时候都以为写反了,实际上就是专门这么设计的,
而且这一步可是 TruPrivacy 的核心步骤。 - PutStatic(EncData) 将加密数据存入到持久化静态存储
- PutMeta(Hdata, Henv,EncStk) 将密文 Hash 和明文加密的存储密钥记录
在全局元数据表中,记录在明文 Hash 项下 - Goto 14
- GetMeta(Hdata) →Henv,EncStk’ 从全局元数据表中取出密文 Hash 和明文加密后的存储密钥
- GenKey(Data) →Sdata 以同样算法从数据明文生成对称密钥
- Dec(Sdata, EncStk’) →Stk 用该对称密钥解密出存储密钥
- Enc(Spub, Stk) →EncStk 以用户的加密公钥加密存储密钥
- PutPri(Hdata,EncStk) 将加密公钥加密后的存储密钥存入到用户权限列表, 记录在明文 Hash 项下
文件读取过程
在 Get 数据的时候,从全局元数据表中从明文 Hash 取出对应的密文 Hash,通过密文 Hash 中从持久化静态存储中取出密文,从权限列表中取出加密后的存储密钥,以用户的加密私钥对加密后的存储密钥进行解密获得存储密钥,用存储密钥对加密数据进行解密,获得数据明文。
- GetMeta(Hdata)→Henc 从全局元数据表中通过明文Hash获取到密文Hash
- GetPri(Hdata)→EncStk 从权限列表中通过明文 Hash 获取到加密公钥加密的存储密钥
- GetStatic(Henc)→EncData 用密文 Hash 从持久化静态存储中取出密文
- Dec(Sprv, EncStk)→Stk 以用户的加密私玥对用户加密公钥加密后的存储密钥进行解密获得存储密钥
- Dec(Stk, EncData)→Data 解密获得文件数据
网友评论