背景技术
2008年中本聪发表了著名论文《Bitcoin:A Peer-to-Peer Electronic CashSystem》,标志着区块链技术的正式诞生。为了支持DAPP应用,Vitalik Buterin于2013年发表了以太坊初版白皮书,引入了智能合约的概念。此后又诞生了EoS、NEO等著名公链平台,以及Fabric等联盟链平台。这些平台的发展也催生了DApp应用的繁荣。
早期的DApp是直接在在公链上开发,后来逐渐采用重云端轻客户端的BaaS架构,云端将区块链技术封装成BaaS服务输出给各个DApp。在BaaS架构中存在一个密钥存储的问题。根据非对称密码学,可以随意生成一对<publickey,privatekey>密钥对。这个publickey在经过一些简单的转换之后就是地址,而Privatekey则是极端重要的,因为这个地址里面的数字资产全靠privatekey保护,如果privatekey被窃取则盗贼完全可以将这个地址中的资产转走,如果privatekey丢失,则这个地址中的资产也就再也无法使用相当于丢失了。所以privatekey的存储和保护是极端重要的一个问题。
privatekey存储目前较为流行的有两种方式:一种是存储在云端,一种是存储在客户端。图1所示为私钥在云端存储的系统框架;如果采用该种方式,将每个DApp注册用户的 priavetkey全部存储在云端。则需要在云端建设维护如表1所示的数据库:
表1
DApp |
用户id(即publickey) |
用户私钥(即privatekey) |
dapp1 |
id1_1 |
privatekey1_1 |
dapp1 |
id1_2 |
privatekey1_2 |
…… |
…… |
…… |
dapp2 |
id2_1 |
privatekey2_1 |
dapp2 |
id2_2 |
privatekey2_2 |
…… |
…… |
…… |
如图2所示的该方案的具体工作流程为:客户端需要执行转账操作时,需要先向云端请求私钥,当客户端接收到云端发还的私钥后,执行转账操作,私钥使用完毕,进行销毁。
采用该种方法(云端存储私钥),云端是要承担极大的责任冒极大的风险的,因为这相当于将所有用户的所有资产都交给了云端保存,如果一旦出现云端被黑客攻破导致私钥泄露,会造成所有用户的财产损失,这个损失云端是承担不起的,因此不建议采用。
如图3所示的私钥在客户端存储的系统框架,如果将私钥存储在客户端,的确可以降低云端的风险减轻云端的责任,但是一般客户都不是专业人士,在使用dapp的过程中是很容易因为粗心大意造成私钥的丢失或者损坏或者泄露,云端又没有这个私钥备份,一旦损坏丢失则用户的资产也就丢失了。而且还有个缺陷就是云端无法干预用户,在用户执行包括转账等所有操作时云端都无法进行任何干预。另外客户端将私钥作为常量长期保存也是不安全的,可能被黑客或其他势力窃走。
因此,需要一种私钥的妥善存储方法,能够降低云端的风险,且能够做到对于普通用户来说,既不易丢失,又可以由云端进行干预。
发明内容
本发明为解决上述技术问题,提供了一种抗丢失且云端可干预的密钥存储方法。
为了实现上述目的,本发明采取的技术方案如下:
一种抗丢失且云端可干预的密钥存储方法,具体包括以下步骤:
步骤1、主客户端利用密钥生成算法生成自己的公私钥对<publickey,privatekey>;
步骤2、主客户端采用秘密拆分技术将私钥privatekey拆分成Head和Body两部分,并将Head部分上传云端保存;云端则建立主客户端的公钥与私钥Head部分匹配关系的数据库;
步骤3、主客户端采用门限秘密共享技术将私钥的body部分拆分成N份影子shadow,分别为shadow1、shadow2、shadow3、······、shadowN-1、shadowN;然后将N个影子shadow 分发给N个辅助客户端,并规定只要有t个辅助客户端贡献出自己保存的影子shadow,t≤N,才能够将Body恢复出来。
进一步的,步骤1所述的密钥生成算法为椭圆曲线生成算法,具体如下:
给定大素数p及其伽罗华域GF(p),定义在这个域上的椭圆曲线E: y
2≡x
3+ax+bmodp,并规定x∈GF(p),y∈GF(p),a∈GF(p),b∈GF(p),则上面会有离散的有限个点,加上无穷远点θ=(∞,∞),则构成集合
在这个点的集合上定义椭圆曲线的点加运算+,则构成一个循环群,群的阶为n,n必须是一个大素数;
点G是这个椭圆曲线上点循环群的生成元;
是由素数n诱导出的缩剩余类循环乘群;
则密钥生成算法为:
步骤A、任意选取随机数
则d就是私钥privatekey;
步骤B、计算点Q=dG,则点Q即为公钥publickey。
进一步的,步骤2所述秘密拆分技术能够将256bit的privatekey拆分成256bit的Head部分和256bit的Body部分,具体方法如下:
步骤a、主客户端生成一个256bit的随机数,这个随机数就是Head部分;
步骤b、主客户端根据Head和privatekey计算出Body;公式为:Body=privatekey^Head; ^是按位异或运算。
进一步的,步骤3中所述门限秘密共享技术,具体如下:
步骤1)、首先主客户端根据自己的需要选定N和t,其中N表示他愿意给多少个辅助客户端分发影子shadow,t表示要想恢复出Body至少需要多少个影子shadow;
步骤2)、然后选定大素数p及其伽罗华域GF(p),其上有相应的缩剩余类循环乘群
任意选取随机数
记M=Body,构造二元一次同余方程 y=(a
t-1x
t-1+a
t-2x
t-2+······+a
2x
2+a
1x
1+M)modP,这个方程将决定二维平面上的一条曲线;
步骤3)、在这条曲线上任意选取N个点(x
1,y
1),(x
2,y
2),······,(x
N,y
N),使得
1≤i≤N;然后将a
t-1,a
t-2,······,a
2,a
1丢弃,同时将(x
1,y
1)作为第一份影子shadow1发给辅助客户端1,将(x
2,y
2)作为第二份影子shadow2发给辅助客户端2,······,将(x
N,y
N)作为第N 份影子shadowN发给辅助客户端N,这样就完成了门限秘密共享算法,将秘密M分享给了N 个辅助客户端。
进一步的,还包括步骤4、主客户端需要使用私钥时,启动机制工作流程,恢复私钥即可。
更进一步的,所述机制工作流程,具体包括如下步骤:
步骤(1)、主客户端向他分发shadow的所有的N个辅助客户端广播,请求影子shadow;
步骤(2)、主客户端监听N个辅助客户端用户的回复,直到收到t个回复回来的影子Shadow后,t≤N,停止监听;
步骤(3)、主客户端利用收到的这t个影子shadow使用逆门限秘密分享算法恢复出Body;
步骤(4)、主客户端向云端请求Head;
步骤(5)、云端将与主客户端对应的Head返回给主客户端;
步骤(6)、主客户端拿着Head和Body部分使用逆秘密拆分算法恢复出私钥Privatekey,即可。
更进一步的,步骤(3)中所述逆门限秘密分享算法,具体为:
主客户端回收到t份影子shadow之后,能够写出t个t元一次方程,这t个方程组成t元一次方程组,
并且这个方程组有且只有一组解;求这个解就能够得到a
t-1,a
t-2,······,a
2,a
1,M的值,从而恢复出Body=M。
更进一步的,步骤(6)中所述逆秘密拆分算法能够根据Body和Head恢复出privatekey;
所述逆秘密拆分算法公式为:
Body^head=privatekey^Head^Head=privatekey^(Head^Head)=privatekey;^是按位异或运算。
更进一步的,步骤4中当主客户端需要使用私钥时,是使用私钥进行转账行为时,还包括步骤5,主客户端使用私钥privatekey进行离线签名,将签名串发送到区块链网络,区块链网路确认签名串的合法性,将签名数据打包到区块上,完成转账过程,所述转账过程利用转账算法完成转账交易。
与现有技术相比,本发明的有益效果是:
本发明解决了云端存储密钥,云端责任和风险过大的问题,同时,也解决了客户端存储密钥容易丢失的问题,采用本发明的技术方案能够同时达到如下几个发明目的:
(1)云端不存储用户的私钥,这样就化解掉了云端的风险,让云端变得责任不再那么重。
(2)客户端也不存储用户的私钥,这样让客户端更加安全。
(3)使用私钥时需要云端和客户端交互。这样赋予云端对客户端一定的干预权,即如果客户端想取得私钥进行转账等操作是必须要取得云端的配合才行。
(4)能够在一定程度上抗丢失,即将用户私钥的Body部分区分成N份影子交由N个辅助客户端保存,N可以很大比如1000。如果规定门限为t,比如t=3,那么即使丢了997份,只要还剩3份密钥影子就可以恢复出私钥的Body部分。
具体实施方式
以下结合实施例对本发明进行进一步详细的叙述。
图4示出的本发明一种抗丢失且云端可干预的密钥存储方法的一个实施例,具体包括以下步骤:
步骤1、主客户端利用密钥生成算法生成自己的公私钥对<publickey,privatekey>;
步骤2、主客户端采用秘密拆分技术将私钥privatekey拆分成Head和Body两部分,并将Head部分上传云端保存;云端则建立主客户端的公钥与私钥Head部分匹配关系的数据库,见表2;
表2
DApp |
用户id(即publickey) |
用户私钥head |
dapp1 |
id1_1 |
Head1_1 |
dapp1 |
id1_2 |
Head1_2 |
…… |
…… |
…… |
dapp2 |
id2_1 |
Head2_1 |
dapp2 |
id2_2 |
Head2_2 |
…… |
…… |
…… |
步骤3、主客户端采用门限秘密共享技术将私钥的body部分拆分成N份(比如N=5)影子shadow,分别为shadow1、shadow2、shadow3、······、shadowN-1、shadowN;然后将N个影子shadow分发给N个辅助客户端,并规定只要有t个辅助客户端贡献出自己保存的影子 shadow,t≤N(比如t=3),才能够将Body恢复出来。
作为本发明一种抗丢失且云端可干预的密钥存储方法的一个优选实施例,步骤1中所述的密钥生成算法采用椭圆曲线生成算法,具体如下:
给定大素数p及其伽罗华域GF(p),定义在这个域上的椭圆曲线E:y
2≡x
3+ax+bmodp,并规定x∈GF(p),y∈GF(p),a∈GF(p),b∈GF(p),则上面会有离散的有限个点,加上无穷远点θ=(∞,∞),则构成集合
在这个点的集合上定义椭圆曲线的点加运算+,则构成一个循环群,群的阶为n,n必须是一个大素数;
点G是这个椭圆曲线上点循环群的生成元;
是由素数n诱导出的缩剩余类循环乘群;
则密钥生成算法为:
步骤A、任意选取随机数
则d就是私钥privatekey;
步骤B、计算点Q=dG,则点Q即为公钥publickey。
进一步的,所述椭圆曲线是secp256k1,各个参数规定如下:
p=FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFEFFFFFC2F
=2256-232-29-28-27-26-24-1
a=00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000
b=00000000 00000000 00000000 00000000 00000000 00000000 0000000000000007
G=02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B16F81798
n=FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8CD0364141
h=01
作为本发明一种抗丢失且云端可干预的密钥存储方法的一个优选实施例,步骤2所述秘密拆分技术能够将256bit的privatekey拆分成256bit的Head部分和256bit的Body部分,具体方法如下:
步骤a、主客户端生成一个256bit的随机数,这个随机数就是Head部分;
步骤b、主客户端根据Head和privatekey计算出Body,公式为:Body=privatekey^Head;
^是按位异或运算。
作为本发明一种抗丢失且云端可干预的密钥存储方法的一个优选实施例,步骤3中所述门限秘密共享技术,具体如下:
步骤1)、首先主客户端根据自己的需要选定N和t,其中N表示他愿意给多少个辅助客户端分发影子shadow,t表示要想恢复出Body至少需要多少个影子shadow,即恢复出Body至少需要的影子shadow的数量;
步骤2)、然后选定大素数p及其伽罗华域GF(p),其上有相应的缩剩余类循环乘群
任意选取随机数
记M=Body,构造二元一次同余方程 y=(a
t-1x
t-1+a
t-2x
t-2+······+a
2x
2+a
1x
1+M)modP,这个方程将决定二维平面上的一条曲线;
步骤3)、在这条曲线上任意选取N个点(x
1,y
1),(x
2,y
2),······,(x
N,y
N),使得
1≤i≤N;然后将a
t-1,a
t-2,······,a
2,a
1丢弃,同时将(x
1,y
1)作为第一份影子shadow1发给辅助客户端1,将(x
2,y
2)作为第二份影子shadow2发给辅助客户端2,······,将(x
N,y
N)作为第N 份影子shadowN发给辅助客户端N,这样就完成了门限秘密共享算法,将秘密M分享给了N 个辅助客户端。
作为本发明一种抗丢失且云端可干预的密钥存储方法的进一步的技术方案,还包括步骤 4、主客户端需要使用私钥时,启动机制工作流程,恢复私钥即可。
进一步的,所述机制工作流程,具体包括如下步骤:
步骤(1)、主客户端向他分发shadow的所有的N个(比如N=5)辅助客户端广播,请求影子shadow;
步骤(2)、主客户端监听N个辅助客户端用户的回复,直到收到t个回复回来的影子Shadow后,t≤N(比如t=3)停止监听;
步骤(3)、主客户端利用收到的这t个影子shadow使用逆门限秘密分享算法恢复出Body;
步骤(4)、主客户端向云端请求Head;
步骤(5)、云端将与主客户端对应的Head返回给主客户端;
步骤(6)、主客户端拿着Head和Body部分使用逆秘密拆分算法恢复出私钥Privatekey,即可。
其中,步骤(3)中所述逆门限秘密分享算法,具体为:
主客户端回收到t份影子shadow之后,能够写出t个t元一次方程,这t个方程组成t元一次方程组,
并且这个方程组有且只有一组解;求这个解就能够得到a
t-1,a
t-2,······,a
2,a
1,M的值,从而恢复出Body=M。
其中,步骤(6)中所述逆秘密拆分算法能够根据Body和Head恢复出privatekey;所述逆秘密拆分算法公式为:
Body^head=privatekey^Head^Head=privatekey^(Head^Head)=privatekey;^是按位异或运算。
作为本发明一种抗丢失且云端可干预的密钥存储方法的更进一步的技术方案,步骤4中当主客户端需要使用私钥时,是使用私钥进行转账行为时,还包括步骤5,主客户端使用私钥privatekey进行离线签名,将签名串发送到区块链网络,区块链网路确认签名串的合法性,将签名数据打包到区块上,完成转账过程,所述转账过程利用转账算法完成转账交易。
进一步的,所述转账算法,具体如下:
步骤①、给定接收资金方地址以及决定要转移多少数字资产等信息,这些信息构成消息 M,使用哈希算法H处理M得到摘要e,即e=H(M),使得
步骤③计算r=xkmodn=xkGmodn,即r是点K的横坐标对n取余所得的余数;
步骤④计算k-1modn;
步骤⑤计算s=k-1(e+rd)modn;
主客户端对消息M的签名就是(r,s),完成这个签名后,主客户端的数字资产即会转到接收方的地址中。
通过以上描述我们可以知道,本发明中私钥是分开存储的,一部分放在云端,一部分放到N个辅助客户端手中。这N个辅助只要有t个(t可以远远小于N)没丢失都是可以最终恢复出密钥的。因此本发明在很大程度上是抗丢失的密钥存储方案,又因为恢复密钥必须要跟云端交互,要取得云端的合作,因此云端对客户有一定的制约权利;因此,本发明解决了云端存储密钥,云端责任和风险过大的问题,同时,也解决了客户端存储密钥容易丢失的问题。
以上所述实施方式仅为本发明的优选实施例,而并非本发明可行实施的穷举。对于本领域一般技术人员而言,在不背离本发明原理和精神的前提下对其所作出的任何显而易见的改动,都应当被认为包含在本发明的权利要求保护范围之内。