一种基于安全多方计算的区块链密钥管理系统的制作方法

文档序号:20085767发布日期:2020-03-13 06:14阅读:297来源:国知局
一种基于安全多方计算的区块链密钥管理系统的制作方法
本发明属于区块链
技术领域
,具体涉及区块链密钥管理系统。
背景技术
:目前对区块链密钥的使用和管理,主要有如下几种方式:(1)本地存储直接使用:用户直接将密钥存放在本地文件或者本地能访问的云服务中,在使用时直接获取密钥并输入到密码算法中;或者用户先加密密钥信息再存储下来,在需要时先解密获取得到密钥原文再进一步使用。该方法在使用时需要有完整的密钥才能够进行签名的过程,但是用户的个人设备的环境安全是无法保证,个人设备很可能因为个人的使用原因存在木马或者病毒,或者在使用过程中被攻击者通过边信道攻击监听获取到密钥的信息。该方法一旦密钥泄漏,整个区块链账户的所有权就会完全暴露给攻击者。(2)助记词和分层确定性钱包:用户在生成区块链账户时,借助于一定数量的相对好记忆的单词或者诗句来计算出私钥和公钥,比如利用11个助记词通过密钥派生方法(keyderivationfunction,kdf)来生成私钥,进而用该私钥对交易哈希签名。或者是使用分层确定性钱包的方法,通过私钥种子来衍生出多个子私钥,在使用时根据衍生规则生成私钥,再利用该私钥对交易签名。上述两种方法在一定程度上解决了密钥难记忆的问题,但是助记词的数量不能太少,太少容易被暴力破解而数量太多则又带来难以全部记住的问题;同样的在使用分层确定性的方法中,最关键的是密钥种子,而如何安全方便的管理好该密钥种子仍然是一个亟需解决的问题。(3)多重签名:多重数字签名的概念首先被okamoto和itakura等人发表并同时设计出了一个具体的算法方案,多重签名可以将一个账户的权力分散在多个密钥上,防止一个密钥丢失导致整个账户失控的情况。一个账户的资产操作交易需要多个相对独立的私钥对一个消息明文进行签名,当签名数量足够多时交易才生效。因为在区块链系统的账户体系中直接支持多重签名算法需要更改整个区块链的架构设计,所以该方法的具体实现多用于智能合约中,事先规定好签名的账号和需要的签名数量阈值。那么多重签名方法的安全性就取决于智能合约的设计和实现,而且灵活性不高,因为智能合约一旦部署之后就很难更改。多重签名方法在一定的场景下能发挥其安全性,但是较低的灵活性很难得到广泛的使用。(4)中心化托管服务:将密钥存储在相对可信的中心化机构。用户需要对消息进行解密或者签名的时候,将消息原文发送给托管服务方,服务方根据用户的需求处理结束后将结果返回给用户。这种方案用户不用自己保存密钥,即使忘记密码也可以通过托管的中心化服务找回,没有丢失密钥的风险。但是托管机构是一个中心化的服务,有可能受到传统的拒绝服务攻击而无法为用户提供服务,还可能因为服务安全措施不够完善导致服务系统被入侵,甚至可能因为社会工程的问题托管服务方内部监守自盗或者被攻击者获取到用户的密钥。完全的将密钥托付给中心化机构保管会有很大的风险。(5)基于安全多方计算的签名:姚期智院士在80年代提出了gc(garbledcircuit)与ot(oblivioustransfer)相结合的安全多方计算(multi-partycomputation)的理论框架,描述为“一组互不信任的参与方之间在保护隐私信息以及没有可信第三方的前提下的协同计算问题”。在无可信第三方的情况下,各方不需透露己方信息利用密码学方法得到多方数据整合在一起共同计算的结果。密钥管理中,多方分别持有私钥的份额,私钥份额只有自己持有,在计算时利用gc+ot或者同态加密的方法将各自的签名份额进行整合得到最终的完整签名。(6)基于安全多方计算的门限签名:90年代,门限密码学不断被提出,门限签名方案被认为是密钥管理的一种重要途径。2018年lindell和nof提出了第一个真正实用的全门限ecdsa签名协议,它具有相对快速的签名和密钥分发的特点,但是门限dsa签名的效率低下,在密钥分发和签名阶段都需要进行多轮的信息交互和零知识证明,有待进一步的研究和发展。综合以上的对密钥管理的进展描述,目前区块链密钥管理存在的三个问题:1、密钥权力不够分散:当将一个完整的密钥直接存储时,就潜在着整个完整密钥直接泄漏的风险,完整密钥直接泄漏将导致丢失账户的所有权。本地存储直接使用和中心化托管服务的方式都会遇到这个问题;2、不能刷新密钥:多重签名和目前发表的基于安全多方计算的签名方法中的密钥在生成后都无法进行便捷的刷新,这种情况下攻击者可以一个一个的攻击破解获取每一个密钥份额,最终获取到所有的份额就可以完全掌控该区块链账户的资产;3、易用性差:用户还是需要记忆很复杂的助记词或者密钥字符串,对于终端用户而言体验很差,这是阻碍区块链大规模发展的一个重要原因。技术实现要素:本发明的目的在于提供一种安全性好、易用性强的基于安全多方计算的区块链密钥管理系统。本发明使用安全多方计算算法设计实现密钥管理方案,可以防范密钥单点泄漏导致整个账户资产信息被盗,支持密钥刷新功能攻击者需要同时通过攻击获得多个私钥份额才能成功控制区块链账户,而当某一参与方被攻击时可以及时刷新私钥份额使得之前的密钥份额失效。密钥管理方案的整个生命周期中不会出现主私钥,签名时各方只需使用自己的私钥份额进行计算,计算完成将各方结果进行整合,没有私钥恢复的过程可以提供强有力的密钥保护。进而使用集成加密技术让用户只需使用较简单的密码口令即可发送交易参与到区块链系统中,提高区块链的易用性,为区块链密钥的提供一种安全易用的使用方案。本发明提供的基于安全多方计算的区块链密钥管理系统,采用四层结构,用解耦合、插件化的架构设计以及使用多种通信协议进行各个参与方之间的信息传输来为用户提供密钥管理的服务,为区块链账户用户和区块链应用提供一个安全易用的密钥管理工具。所述四层结构分别是:数据存储层,网络通信层,密码服务层,api服务层,如图1所示。其中:所述数据存储层,负责备份存储密钥信息。用户在密钥生成阶段和密钥刷新阶段获得的密钥份额经过集成加密模块加密后,相应的密文信息会根据账户id和密钥kid存储在数据存储数据库中,数据存储数据库可以是关系型数据库也可以是非关系型数据库,数据库中存放了两类不同的数据:不同安全等级的加密算法信息、加密密钥的加密算法和加密后的密文信息。当该系统被创建为一个密钥托管服务时,会有很大的用户数据量和账户、密钥信息,在数据库中创建索引,在数据量较大的情况下加快数据的查询速度。数据库的具体配置和使用方式取决于用户设计,可以在这个设计的基础上加强数据库的安全性和容灾性。数据存储层中还适配了缓存机制,使用最近最少使用算法(leastrecentlyused,lru),将使用频率较高的数据缓存在内存中,加快签名和密钥刷新的性能。如果该系统是在轻客户端上面使用的,比如在移动设备手机上,传感器设施上等不方便建设数据库的地方,系统提供了文件存储的功能,因为这些设备需要存储的信息量不会太多,可以将每个加密的信息存在文件中,需要时直接从文件上读取即可。所述网络通信层,负责在安全多方计算阶段与其他参与方进行数据通信。为了适配不同业务场景使用到的通信协议,系统在tcp协议上统一封装了rpc、tls和https/http等网络协议。用户在初始化密钥管理服务时通过配置文件设置所需的协议即可。同时为了适配不同系统平台的编码格式,使用统一的数据格式进行数据的传输。每种协议都封装如图2的统一接口:因为网络传输原因,可能丢包或者网络连接断开。为了提高安全多方计算的成功率,在网络通信层添加了高可用的措施,当网络连接断开时自动重连,当长时间网络连接上没有收到消息时重新发送请求,在重新请求三次后仍然失败则通知上层用户,需要由用户排查其他参与方的服务状态。所述密码服务层,采用插件化的形式为api服务层提供加密服务。密码服务层分为两个模块:集成加密模块和mpc模块。集成加密模块中包含了所有会使用到的kdf、哈希算法、对称加密算法等等为备份密钥份额提供保障。加解密时根据用户选择的安全强度配置判断用户密码的安全强度并接受足够数量的用户身份信息,安全强度不匹配时会返回提示信息,接着选取相应的kdf算法和加密算法加密保存密钥份额信息;mpc模块是支持多方计算ecdsa的核心模块,包含密钥生成、签名和密钥刷新的算法,该模块是密钥管理系统的核心算法部分。用户创建区块链账户需要使用分布式密钥生成算法,已有区块链账户发起交易需要使用分布式签名算法,在紧急情况下需要调用分布式密钥刷新接口对密钥份额进行更新,保护区块链账户。mpc模块的运作依赖于网络通信模块,mpc参与方之间需要保证网络通信正常,才能在规定时间内收到相关的证明信息和交互信息,从而保证mpc算法的正确执行。插件化的架构方便用户添加自主化的密码模块,用户只要实现了定义好的接口就能在加密密钥时使用自主实现的算法,比如用户可以使用tee环境存储密钥信息,让用户有更灵活的使用方式。设计成一个开放的框架有利于适配现有的传统行业中的密钥保护模块,比如hsm(hardwaresecuritymodules)和各种硬件设施。所述api服务层,是为用户提供的上层接口,用户可直接使用。包含初始化配置、密钥生成、签名、密钥刷新和修改密码等接口。用户在实例化密钥管理系统后,可以直接在业务的流程中调用上述接口。如图3所示。在具体的区块链业务应用时,本发明的密钥管理系统可作为应用系统的一部分,如图4所示,应用系统直接与密钥管理系统交互,应用系统将需要签名或者解密的信息发送给密钥管理系统,密钥管理系统操作完成后返回信息。用户基于本发明的方案可以安全又方便的参与到区块链系统中,降低区块链的使用门槛。本发明使用安全多方计算的密码学算法,设计实现了安全易用的密钥管理系统。本发明针对现存的密钥管理方法存在的问题,为区块链密钥提供安全的使用方式和存储方式,降低用户使用区块链密钥的门槛和密钥泄漏、丢失的风险。附图说明图1密钥管理系统架构图。图2网络通信接口说明。图3api接口说明。图4区块链应用架构图。具体实施方式作为一个实施例,本发明采用golang语言设计一个基于安全多方计算的密钥管理系统(blockchain-kms)。该密钥管理系统可以以sdk或者library的方式嵌入到应用代码中,是一个基础通用的密钥管理库,也可以作为一个独立的应用为用户提供密钥使用和存储管理,比如建立托管服务并为用户提供移动端的app使用。数据存储层中,使用的数据存储数据库是关系型数据库mysql。表1描述了数据库中存放的数据详细信息。表id说明备注信息cryptoinfo加密算法信息表存储相应安全等级的加密算法信息keyinfo密钥备份表存放所有加密后的密钥信息表1数据库表。cryptoinfo数据表负责存储相应安全等级的加密算法信息。表2详细说明了数据表中的每个字段。元素名称字段名称类型及长度必填主键相关说明安全强度levelint是是安全强度等级加密算法encchar(64)是否要使用的加密算法加密模式modechar(32)否否加密时使用的加密模式口令复杂度complexint是否密码口令的复杂度要水身份信息数量numberint是否加解密时所需的用户身份信息数量表2cryptoinfo表设计。keyinfo负责存放所有加密后的密钥信息。表3详细说明了数据表中的每个字段。元素名称字段名称类型及长度必填主键相关说明ididchar(64)是是加密信息的id,由账号和相应kid组成安全强度levelint是否信息加密时使用的安全强度数据datachar(512)是否密文数据表3keyinfo表设计。网络通信层中,为了适配不同系统平台的编码格式,统一使用google的高效的压缩编码格式protocolbuffers进行数据的传输。并在tcp链接之上同时支持rpc、tls和https/http等网络协议。密码服务层中,密码服务模块的接口详细说明:encrypt(keystring,paramsinterface{})(error,string)的详细设计如表4和表5所示。输入要加密的密钥份额原文的十六进制字符串和加密时需要使用到的参数,如安全强度、加密算法和加密模式、密码口令、身份信息等等。加密完成后输出两个值,正常情况下输出密钥的密文,error为空,如果有发生加密错误则密文为空,error为错误信息。输入表4encrypt接口输入信息。输出表5encrypt接口输出信息。decrypt(enccypteddatastring,paramsinterface{})(error,string)的详细设计如表6和表7所示。输入要解密的密文信息和解密时需要使用到的参数,如安全强度、加密算法和加密模式、密码口令、身份信息等等。加密完成后输出两个值,正常情况下输出密钥的原文,error为空,如果有发生解密错误则密文为空,error为错误信息,如“解密口令强度不匹配”。输入表6decrypt接口输入信息。输出表7encrypt接口输出信息。store(keyidstring,datastring)(error,bool)的详细设计如表8和表9所示。输入要存储的密钥密文信息和该信息的keyid。存储完成后输出两个值,正常情况下为true,error为空,如果有发生存储错误则输出false,error为错误信息,如“存储出错”。输入表8store接口输入信息。输出类型举例booltrueerrornull|“存储出错”表9store接口输出信息。getdata(keyidstring)(error,string)的详细设计如表10和表11所示。输入要获取的信息的keyid。查询获取完成后输出两个值,正常情况下输出密钥的密文字符串,error为空,如果有发生查询错误则密文为空,error为错误信息,如“keyid未找到”;输入参数类型是否必须举例keyidid字符串是“alice_1”表5.10store接口输入信息。输出表11store接口输出信息。在设计系统逻辑时,将恢复过程当作是签名算法或者解密的算法的一部分,每次恢复出来处密钥只做临时存储,每次签名或解密结束后释放临时存储,避免长期存储带来的安全隐患。api服务层中,api服务模块的接口详细说明:init(configconfig)error的详细设计如表12和表13所示。输入初始化时密钥管理系统的配置参数。初始化完成后正常情况下error为空,如果有发生加密错误则输出error为错误信息,如“configinvalid”。init接口在调用密钥管理服务之前必须先调用,初始化配置信息。config的结构体定义:前半部分定义了需要使用的椭圆曲线,输入合法的椭圆曲线参数;后半部分说明在keygen阶段零知识证明算法的安全参数。输入参数类型是否必须举例configconfig是配置信息表12init接口输入信息。输出类型举例errornull|“configinvalid”表13init接口输出信息。keygen(numberint,keyidstring,paramsinterface{})(string,error)的详细设计如表14和表15所示。输入要生成的密钥id和参与方个数,以及要加密存储密钥的参数。keygen完成后正常情况下error为空,并且返回主公钥字符串,如果有发生错误则输出error为错误信息,如“networkerror”。当要在区块链上创建新账户时,就需要有一个或多个公钥信息,keygen是创建新的公私钥信息的接口,获取到主公钥信息后,即可到区块链上进行账号注册或直接发送交易。输入参数类型是否必须举例numberint否默认为1keyidid字符串是“alice_1”params加密时的必要参数根据实现情况而定1,“aes”,“gcm”,“123456”,“邮箱”表14keygen接口输入信息。输出表15keygen接口输入信息。sign(messagestring,keyidstring,paramsinterface{})(string,error)的详细设计如表16和表17所示。输入要签名的信息message,使用的密钥id,以及解密存储密钥的参数。签名完成后正常情况下返回签名值(r||s)和空error,如果有发生错误则输出error为错误信息,如“invalidkey”。在生成公私钥信息后,就可以与其他参与者使用密钥进行交互对交易进行签名,得到签名值再将交易发送到区块链系统上。输入参数类型是否必须举例messagestring是“hello”keyidid字符串是“alice_1”params加密时的必要参数根据实现情况而定1,“aes”,“gcm”,“123456”,“邮箱”表16sign接口输入信息。输出表5.17sign接口输入信息。refresh()(keyidstring,paramsinterface{})error该接口只进行局部的密钥刷新,调用该接口的参与者通过网络层通知其密钥生成二叉树上的兄弟节点进行密钥刷新的过程。详细设计如表18和表19所示。输入要刷新的密钥id,以及解密存储密钥的参数。刷新密钥完成后正常情况下返回error为空,如果有发生错误则输出error为错误信息,如“mpcerror”。当用户察觉到自身的密钥份额可能泄漏,则第一时间内发起refresh的调用,与在密钥生成二叉树上互为兄弟节点的参与者进行局部密钥刷新。输入参数类型是否必须举例keyidid字符串是“alice_1”params加密时的必要参数根据实现情况而定1,“aes”,“gcm”,“123456”,“邮箱”表18refresh接口输入信息。输出类型举例errornull|“mpcerror”表19refresh接口输入信息。refreshall()(keyidstring,paramsinterface{})error该接口进行全局的密钥刷新,调用该接口的参与者通过网络层通知其他的全部参与者进行密钥刷新的操作。输入输出与refresh接口的表16和表17一致。密钥全局刷新在特殊情况下才会发起,比如当大部分密钥已经泄漏,那么发起全局密钥替换并加强每个密钥份额的安全措施至关重要。updatepassword(keyidstring,oldparamsinterface{},newparamsinterface{})error的详细设计如表14和表15所示。输入要更换密码的密钥id以及解密存储密钥的参数和新的加密密钥的参数。updatepassword完成后正常情况下error为空,如果有发生错误则输出error为错误信息,如“passwordinvalid”。更新密码口令是日常安全防护的一个手段,定期更换密码,有利于保护加密存储的密钥信息。输入参数类型是否必须举例keyidid字符串是“alice_1”oldparams解密时的必要参数根据实现情况而定1,“aes”,“gcm”,“123456”,“邮箱”newparams加密时的必要参数根据实现情况而定1,“aes”,“gcm”,“abcdef”,“邮箱”表20updatepassword接口输入信息。输出类型举例errornull|“passwordinvalid”表21updatepassword接口输入信息。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1