本发明属于计算机信息安全领域,涉及数据加密、存储及隐私保护等内容和方法,特别涉及基于区块链的服务器文件安全存储方法。
背景技术:
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。在区块链系统中,每过一段时间,各参与主体产生的交易数据会被打包成一个数据区块,数据区块按照时间顺序依次排列,形成数据区块的链条,各参与主体拥有相同的数据链条且无法单方面篡改,任何信息的修改只有经过约定比例的主体同意方可进行,并且只能添加新的信息,无法删除或修改旧的信息,从而实现多主体间的信息共享和一致决策,确保各主体身份和主体间建议信息的不可篡改、公开透明。
在区块链中,默克尔帕特里夏树mpt(merklepatriciatries)是以太坊中的一种加密认证的核心数据结构,它实际上是一种trie树的变种,可以用来存储所有的[key,value]对,是以太坊中一种非常重要的数据结构。
以太坊ethereum是一个开源的有智能合约功能的公共区块链平台,通过其专用加密货币以太币ether,简称“eth”,提供去中心化的以太虚拟机ethereumvirtualmachine来处理点对点合约。
技术实现要素:
为解决现有技术的不足,提供一种基于区块链的服务器文件安全存储方法,这种方法能保证服务器文件的安全,防止服务器文件被其他人恶意更改。
为实现上述目的,本发明采用以下技术方案:
一种基于区块链的服务器文件安全存储方法,包括以下步骤:
步骤1,将服务器文件转换成字符串value,并对每个字符串进行不可逆的单向散列算法sha256,分别得到每个字符串的哈希值hashdata;
步骤2,将第一步所得的字符串和哈希值以键值对[key(hashdata),value]的形式存进leveldb数据库;
步骤3,重复第一步、第二步,直至将服务器文件全部以键值对的形式存入leveldb数据库中;
步骤4,第一步第二步得到的键key和值value是原始的键key和值value,将原始的键key做一次哈希运算得到最终的键key,将原始的值value用递归长度前缀编码处理得到最终的值value;
步骤5,最后将第四步所得的[key,value]对用一棵默克尔帕特里夏树存储在leveldb数据库中,其树根为storageroot;
步骤6,验证区块hash值,区块链节点定时自动判断哈希值。由于区块链中使用mpt树结构存储哈希值,而服务器文件经过不可逆的单向单列算法得出的哈希值唯一,若服务器文件的哈希值与mpt树中节点存储的哈希值相同,则服务器内部文件没有因被黑客攻击而遭受修改;若哈希值不相同,则证明服务器文件已被修改,对照整棵mpt树准确定位到具体节点。
键值对是数据库中最简单的组织形式,键是存储的某个值的编号,值就是要存放的数据。目前有大量的数据库使用键值对进行存储,这包括redis,mongodb,memcached,berkeleydb,kyotocabinet和leveldb。而在本案中,选择leveldb作为存储数据库。leveldb数据库是一个google实现的非常高效的kv数据库,它是单进程的服务,性能非常高,其写入性能远强于读取性能。
递归长度前缀编码即rlp编码,rlp编码是以太坊中数据序列化/反序列化的主要方法,区块、交易等数据结构在持久化时会先经过rlp编码后再存储到数据库中。
而树根的hash值就是整个区块的hash值,mpt树结合了字典树和默克尔树的优点,在压缩字典树中根节点是空的,而mpt树可以在根节点保存整棵树的哈希校验和,而校验和的生成则是采用了和默克尔树生成一致的方式。以太坊采用mpt树来保存,交易,交易的收据以及世界状态,为了压缩整体的树高,降低操作的复杂度,以太坊又对mpt树进行了一些优化。mpt树结构如图1所示,从图中可以看到有四个状态要存储在世界状态的mpt树中,需要存入的值是键值对的形式。自顶向下,我们首先看到的keccak256生成的根哈希,参考默克尔树的tophash,其次看到的是扩展节点extensionnode,其中共同前缀sharednibble是a7,采用了压缩前缀树的方式进行了合并,接着看到分支节点branchnode,其中有表示十六进制的字符和一个value,最后的value是fullnode的数据部分,最后看到叶子节点leadfnode用来存储具体的数据,它也是对路径进行了压缩。
本发明是一种基于区块链的服务器文件安全技术,其特征在于,根据区块链的去中心化,不可篡改、永久保存的特性,将服务器文件存储在区块链上的各个区块上,管理员可根据哈希值来验证服务器文件是否因遭遇黑客攻击而被更改,若每个区块hash值相同则证明服务器文件未被篡改,否则服务器文件则被篡改,根据不相同的hash值直接定位到具体服务器文件。
本发明的优点:
1.防止被篡改。将服务器文件存储在区块链中,利用区块链的不可篡改性来保证服务器文件不被恶意篡改。
2.可备份。服务器文件以键值对的形式存储在leveldb数据库中,leveldb将键值对存储在log文件中以防止系统奔溃无法恢复数据,而本发明若发现服务器文件被篡改则可以从数据库log文件恢复。
3.随时更新服务器文件。由于功能要求,开发者需要更新服务器文件,这时服务器文件中的内容已经更改,对应的哈希值也就发生了变化无法与之前哈希值对应,这就需要重新生成新的键值对,插入到mpt树中完成对服务器文件的更新。
附图说明
图1为本发明mpt树结构示意图。
具体实施方式
参照附图,一种基于区块链的服务器文件安全存储方法,是一种服务器文件保护的安全策略,利用区块链的不可篡改性来保证服务器文件的安全,接下来以单个服务器为例,说明具体的实施步骤:
第一步,将服务器文件转换成字符串(value),并每个字符串进行不可逆的单向散列算法sha256,分别得到每个字符串的哈希值(hashdata)。
步骤1,区块链中的服务器文件类型较多,有些服务器文件由于改动次数比较频繁或者不是十分重要,所以本系统存储的服务器文件是服务器中重要的文件或者是一些基本不改动的文件。调用算法将存储的服务器文件依次转换成字符串,并使用sha256哈希函数得到一个32个字节的哈希值(hashdata)。
步骤2,将第一步所得的数据以键值对[key(hashdata),value]的形式存进leveldb数据库。
步骤3,重复第一步第二步,直至将所有服务器文件都以键值对的形式存入leveldb数据库中。
leveldb是一个可持久化的kv数据库引擎,数据是以键值对得形式存进数据库中的,各个服务器文件生成的数据以hashdata作为key,将服务器文件转换成的字符串作为value存入leveldb数据库中。在数据库中都是按照key的字典顺序存储。
步骤4,第一步第二步得到的key和value是原始的key和value,需要将原始的key做一次hash运算得到最终的key,将原始的value用rlp编码处理得到最终的value。
在mpt树节点key有三种编码形式,但是三种编码都是对key进行的操作,最终持续化到leveldb中是k-v的形式,还需要对value进行处理。在以太坊中对之前会采用rlp编码对键值对进行转码,将键值对编码后作为value,计算编码后数据的哈希(keccak256)作为key,存储在leveldb中。为了避免出现相同的key,以太坊会给key增加一些前缀区分。
rlp编码定义如下:
l对于[0x00,0x7f]范围内的单个字节,rlp编码内容就是字节内容本身。
l否则,如果是一个0-55字节长的字符串,则rlp编码有一个特别的数值0x80加上字符串长度,再加上字符串二进制内容。这样,第一个字节的表达范围为[0x80,0xb7].
l如果字符串长度超过55个字节,rlp编码由定值0xb7加上字符串长度所占用的字节数,加上字符串长度的编码,加上字符串二进制内容组成。比如,一个长度为1024的字符串,将被编码为\xb9\x04\x00后面再加上字符串内容。第一字节的表达范围是[0xb8,0xbf]。
l如果列表的内容(它的所有项的组合长度)是0-55个字节长,它的rlp编码由0xc0加上所有的项的rlp编码串联起来的长度得到的单个字节,后跟所有的项的rlp编码的串联组成。第一字节的范围因此是[0xc0,0xf7]
l如果列表的内容超过55字节,它的rlp编码由0xc0加上所有的项的rlp编码串联起来的长度的长度得到的单个字节,后跟所有的项的rlp编码串联起来的长度的长度,再后跟所有的项的rlp编码的串联组成。第一字节的范围因此是[0xf8,0xff]。
步骤5,最后将经过[key,value]对用一棵merklepatriciatries(默克尔帕特里夏树)树存储在leveldb数据库中,其树根就是storageroot,而树根的hash值就是整个区块的hash值。
完成mpt树的构建就是不断执行插入操作。一个插入过程为:首先找到与新插入节点拥有最长相同路径前缀的节点,记为node;若该node为分支节点:
步骤5.1,剩余的搜索路径不为空,则将新节点作为一个叶子节点插入到对应的孩子列表中;
步骤5.2,剩余的搜索路径为空(完全匹配),则将新节点的内容存储在分支节点的第17个孩子节点项中(value);
若该节点为叶子/扩展节点:
步骤5.3,剩余的搜索路径与当前节点的key一致,则把当前节点val更新即可;
步骤5.4,剩余的搜索路径与当前节点的key不完全一致,则将叶子/扩展节点的孩子节点替换成分支节点,将新节点与当前节点key的共同前缀作为当前节点的key,将新节点与当前节点的孩子节点作为两个孩子插入到分支节点的孩子列表中,同时当前节点转换成了一个扩展节点(若新节点与当前节点没有共同前缀,则直接用生成的分支节点替换当前节点);
步骤5.5,若插入成功,则将被修改节点的dirty标志置为true,hash标志置空(之前的结果已经不可能用),且将节点的诞生标记更新为现在.
循环上述过程直至mpt树的构建完成。
步骤6,验证区块hash值,若hash值匹配则证明服务器内部文件没有被修改,若hash值不匹配则证明服务器文件被修改,对照整颗mpt树准确定位到具体服务器文件。
根据storageroot的hash值即可还原出完整的树结构,展开节点的hash值,若键值对的hash值与节点的hash值相同则证明服务器文件已经未被篡改。
然而日常工作中,常需要更新服务器,这样服务器中的文件就会发生改变,调用更新接口,按照路径更新mpt树即可重新获得storageroot的hash值。