一种基于区块链创建数字签名的方法、系统及设备与流程

文档序号:27255074发布日期:2021-11-05 18:53阅读:360来源:国知局
一种基于区块链创建数字签名的方法、系统及设备与流程

1.本技术涉及电子签名领域,特别是涉及一种基于区块链创建数字签名的方法、系统及设备。


背景技术:

2.随着数字经济的发展,民事活动中的电子合同和贸易单证等文书,越来越多采用数据电文来显示、交换和存储,而且由于电子合同、发票、保单、病历、回单、账单和通知等文件对合法性、可靠性、安全性具有较高要求,因此需要保证电子文档自最终形成时起内容的完整性、未被更改,当前普遍采用数字签名技术来保证电子文档的可信度。
3.例如,通过acrobat或reader等桌面应用程序创建自签名数字身份证签署文档或协议,或者基于数字证书,用已获得的数字身份证来签名文档或协议,但是上述通过客户端进行数字签名的方法,用户操作过于复杂,或是通过服务器进行数字签名的方法,软硬件采购和维护成本较高。
4.进一步的,进入互联网时代,通过第三方平台进行数字签名的方法也开始越来越普及,如在saas平台进行数字签名,不过这种方式所带来的问题是,用户待签署的文件是上传至第三方平台的,自提交对应操作后,文件就已脱离用户可控范围。而第三方平台会基于后续可能需要执行的操作,对用户的文件进行存储。整个过程用户文件信息是存在高度安全隐患的。
5.目前针对相关技术中进行数字签名操作过于复杂且软硬件成本较高,以及存在安全隐患的问题,尚未提出有效的解决方案。


技术实现要素:

6.本技术实施例提供了一种基于区块链创建数字签名的方法、系统及设备,以至少解决相关技术中进行数字签名操作过于复杂且软硬件成本较高,以及存在安全隐患的问题。
7.第一方面,本技术实施例提供了一种基于区块链创建数字签名的方法,所述方法包括:
8.通过区块链上部署的智能合约响应创建数字签名请求;
9.通过所述智能合约读取所述数字签名请求中的待签署文件;
10.通过所述智能合约设置所述数字签名的认证级别,以及所述数字签名的外观;
11.通过所述智能合约获取签名人的私钥和证书链;
12.通过所述智能合约创建所述待签署文件的摘要,根据所述摘要、所述私钥和所述证书链,通过所述智能合约在所述待签署文件中创建数字签名。
13.在其中一些实施例中,通过所述智能合约读取所述数字签名请求中的待签署文件包括:
14.通过所述智能合约导入用于文档处理的预设组件,并读取所述数字签名请求中的
待签署文件,调用所述预设组件构建读入对象;
15.通过所述智能合约新建签署属性对象;
16.通过所述智能合约新建签署对象,读取所述读入对象和所述签署属性对象,并将所述读取的数据设置为所述签署对象的参数。
17.在其中一些实施例中,通过所述智能合约设置所述数字签名的认证级别包括:
18.通过所述智能合约新建签署对象,设置所述签署对象的认证属性,进而设置所述数字签名的认证级别。
19.在其中一些实施例中,通过所述智能合约新建签署属性对象包括:
20.通过所述智能合约新建签署属性对象,并设置追加模式,所述追加模式用于对待签署文件或签署后文件进行操作,所述操作包括填写字段、多次签名、多次签名和填写字段,以及签名后锁定字段和文件。
21.在其中一些实施例中,通过所述智能合约设置所述数字签名的外观包括:
22.通过所述智能合约导入用于文档处理的预设组件,并调用所述预设组件来定义所述数字签名为可见签名,或者为不可见签名。
23.在其中一些实施例中,通过所述智能合约调用所述预设组件来定义所述数字签名为可见签名包括:
24.通过所述智能合约调用所述预设组件,使用文本添加方法来添加文本;
25.通过所述智能合约调用所述预设组件,使用背景添加方法在文本的背景中添加图像;
26.通过所述智能合约调用所述预设组件,使用图像获取方法来获取图片对象,并使用图像设置方法来设置所述图片对象;
27.通过所述智能合约调用所述预设组件,使用渲染设置方法设置不同的渲染模式。
28.在其中一些实施例中,通过所述智能合约设置所述数字签名的外观还包括:
29.通过所述智能合约导入用于文档处理的预设组件,并调用所述预设组件向签名字典中添加元数据,所述元数据包括签名者姓名、签名时间、签名的物理位置、签名原因和签名者提供的信息。
30.在其中一些实施例中,通过所述智能合约创建所述待签署文件的摘要,根据所述摘要、所述私钥和所述证书链,通过所述智能合约在所述待签署文件中创建数字签名包括:
31.通过所述智能合约获取所述待签署文件的预设字节范围数据,根据加密哈希函数在所述预设字节范围数据中创建摘要;
32.根据签名人的所述私钥创建签名;
33.将所述摘要、所述签名和所述证书链传入签署对象,创建所述待签署文件的数字签名。
34.第二方面,本技术实施例提供了一种基于区块链创建数字签名的系统,所述系统包括接收模块、获取模块、设置模块、解析模块、运算模块和签署模块;
35.所述接收模块通过区块链上部署的智能合约响应创建数字签名请求;
36.所述获取模块通过所述智能合约读取所述数字签名请求中的待签署文件;
37.所述设置模块通过所述智能合约设置所述数字签名的认证级别,以及所述数字签名的外观;
38.所述解析模块通过所述智能合约获取签名人的私钥和证书链;
39.所述运算模块通过所述智能合约创建所述待签署文件的摘要;
40.所述签署模块根据所述摘要、所述私钥和所述证书链,通过所述智能合约在所述待签署文件中创建数字签名。
41.第三方面,本技术实施例提供了一种计算机设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上述第一方面中任一项所述的基于区块链创建数字签名的方法。
42.相比于相关技术,本技术实施例提供的一种基于区块链创建数字签名的方法、系统及设备,通过区块链上部署的智能合约响应创建数字签名请求,读取并保存数字签名请求中的待签署文件,设置数字签名的认证级别,以及数字签名的外观;通过智能合约获取签名人的私钥和证书链,再通过智能合约创建待签署文件的摘要,根据摘要、私钥和证书链,通过智能合约在待签署文件中创建数字签名,解决了相关技术中进行数字签名操作过于复杂且软硬件成本较高,以及存在安全隐患的问题,实现了去第三方中心化服务,提高了数字签名系统的可靠性和稳定性,降低数字签名系统复杂度,以及用户使用数字签名的成本和风险。
附图说明
43.此处所说明的附图用来提供对本技术的进一步理解,构成本技术的一部分,本技术的示意性实施例及其说明用于解释本技术,并不构成对本技术的不当限定。在附图中:
44.图1是根据相关技术中基于已有数字证书进行数字签名的步骤流程图;
45.图2是根据相关技术中通过云平台进行数字签名的步骤流程图;
46.图3是一种创建智能合约的方法示意图;
47.图4是一种调用智能合约的方法示意图;
48.图5是一种创建智能合约和调用智能合约的方法示意图;
49.图6是根据本技术实施例的基于区块链创建数字签名方法的步骤流程图;
50.图7是根据本技术实施例的基于区块链获取待签署文件的步骤流程图;
51.图8是待签署文件中签名字典的byterange条目的示意图;
52.图9是待签署文件中进行多次签名的示意图;
53.图10是根据本技术实施例的基于区块链创建数字签名系统的结构框图;
54.图11是根据本技术具体实施例的基于区块链创建数字签名方法的流程示意图;
55.图12是根据本技术实施例的电子设备的内部结构示意图。
56.附图说明:101、接收模块;102、获取模块;103、设置模块;104、解析模块;105、运算模块;106、签署模块。
具体实施方式
57.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行描述和说明。应当理解,此处所描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。基于本技术提供的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本技术保护的范围。
58.显而易见地,下面描述中的附图仅仅是本技术的一些示例或实施例,对于本领域的普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图将本技术应用于其他类似情景。此外,还可以理解的是,虽然这种开发过程中所作出的努力可能是复杂并且冗长的,然而对于与本技术公开的内容相关的本领域的普通技术人员而言,在本技术揭露的技术内容的基础上进行的一些设计,制造或者生产等变更只是常规的技术手段,不应当理解为本技术公开的内容不充分。
59.在本技术中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本技术的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域普通技术人员显式地和隐式地理解的是,本技术所描述的实施例在不冲突的情况下,可以与其它实施例相结合。
60.除非另作定义,本技术所涉及的技术术语或者科学术语应当为本技术所属技术领域内具有一般技能的人士所理解的通常意义。本技术所涉及的“一”、“一个”、“一种”、“该”等类似词语并不表示数量限制,可表示单数或复数。本技术所涉及的术语“包括”、“包含”、“具有”以及它们任何变形,意图在于覆盖不排他的包含;例如包含了一系列步骤或模块(单元)的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可以还包括没有列出的步骤或单元,或可以还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。本技术所涉及的“连接”、“相连”、“耦接”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电气的连接,不管是直接的还是间接的。本技术所涉及的“多个”是指两个或两个以上。“和/或”描述关联对象的关联关系,表示可以存在三种关系,例如,“a和/或b”可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。本技术所涉及的术语“第一”、“第二”、“第三”等仅仅是区别类似的对象,不代表针对对象的特定排序。
61.在当今的计算机网络通信时代,用密码学的方法实现数字签名具有非常重要的实际意义。
62.数字签名技术是公开密钥加密技术和报文分解函数相结合的产物。与加密不同,数字签名的目的是为了保证信息的完整性和真实性。数字签名必须保证以下三点:
63.接收者能够核实发送者对消息的签名、接收者不能伪造对消息的签名,以及发送者事后不能抵赖对消息的签名。
64.具体举例如下,假定a发送一个签了名的信息m给b,则a的数字签名应该满足下述条件:
65.b能够证实a对信息m的签名。
66.任何人,包括b在内,都不能伪造a的签名。
67.如果a否认对信息m的签名,可以通过仲裁解决a和b之间的争议。
68.由此可见,数字签名同时具有通常签名的特点。
69.数字签名技术在原理上,首先用报文分解函数,把要签署的文件内容提炼为一个很长的数字,称为报文分解函数值。签字人用公开密钥和解密系统中的私钥加密这个报文,分解函数值,生成所谓的“数字签名”。收件人在收到数字签名的文件后,对此数字签名进行鉴定。用签字人的公开密钥来解开“数字签名”,获得报文分解函数值,然后重新计算文件的
报文分解函数值,比较其结果。如果完全相符,则文件内容的完整性、正确性和签字的真实性都得到了保障。因为如果文件被改动,或者有人在没有私钥的情况下冒充签字,都将使数字签名的鉴定过程失败。
70.在相关技术中,发明人研究发现,目前针对电子文档进行数字签名的方式,通常有以下几种模式:
71.图1是根据相关技术中基于已有数字证书进行数字签名的步骤流程图,如图1所示,基于数字证书,用已获得的数字身份证或者在acrobat或adobe reader中创建自签名数字身份证来签名文档,具体步骤如下:
72.步骤s102,从自己的组织获取数字身份证、购买数字身份证或创建自签名数字身份证;
73.步骤s104,设置默认签名方法;
74.步骤s106,为基于证书的签名创建外观;
75.步骤s108,使用预览文档模式禁止所有动态内容;
76.步骤s110,审阅所有文档中的页面;
77.步骤s112,配置签名应用程序;
78.步骤s114,选择签名类型,进行数字签名。
79.此外,在相关技术中,通过数字签名验签服务器提供的数字签名制作、数字签名验证等服务功能对文件进行数字签名,也是较为常见的一种方式。
80.通过上述相关技术中两种数字签名的方式可见,在通过客户端进行数字签名,用户操作过于复杂,普通用户很难顺利完成;而通过服务器进行数字签名,软硬件采购和维护成本都较高,也非普通用户所能承受。
81.经发明人更进一步研究发现,随着互联网的普及,更多的用户选择使用互联网的saas平台进行数字签名,图3是根据相关技术中通过云平台进行数字签名的步骤流程图,具体步骤如下:
82.步骤s202,用户在saas平台注册账户并进行相关实名认证;
83.步骤s204,saas平台为用户颁发数字证书;
84.步骤s206,用户将需要签署的文件上传至saas平台;
85.步骤s208,用户通过saas平台的交互界面拖动新增或已设置的电子印章或手写签字图片至合适位置;
86.步骤s210,用户提交确认签署操作;
87.步骤s212,saas平台服务端接收确认消息并调用步骤s204中所颁发的数字证书,在步骤s208中所设置的签名外观上进行数字签名;
88.步骤s214,saas平台向用户返回签署完成后的文件。
89.通过上述相关技术中利用云平台进行数字签名可见,用户待签署的文件是上传至第三方平台,自提交对应操作后,文件就已脱离用户可控范围。而第三方平台会基于后续可能需要执行的操作,对用户的文件进行存储。整个过程中用户文件信息是存在高度安全隐患的。
90.综上所述,基于相关技术中所存在的问题,用户需要一种即操作便捷,又经济实惠且安全可靠的方式来创建文档的数字签名,以确保没有任何第三方在无用户许可的情况,
另行存储或通过大数据分析文档内容。
91.本发明采用区块链技术,具体通过区块链智能合约实现对文档进行数字签名,解决第三方中心化服务不可信的问题,同时降低系统复杂度,提高系统的可靠性和稳定性,从而降低用户使用数字签名的成本和风险。
92.区块链一般被划分为三种类型:公有链(public blockchain),私有链(private blockchain)和联盟链(consortium blockchain)。此外,还可以有上述多种类型的结合,比如私有链+联盟链、联盟链+公有链等。
93.其中,去中心化程度最高的是公有链。公有链以比特币、以太坊为代表,加入公有链的参与者(也可称为区块链中的节点)可以读取链上的数据记录、参与交易、以及竞争新区块的记账权等。而且,各节点可自由加入或者退出网络,并进行相关操作。
94.私有链则相反,该网络的写入权限由某个组织或者机构控制,数据读取权限受组织规定。简单来说,私有链可以为一个弱中心化系统,其对节点具有严格限制且节点数量较少。这种类型的区块链更适合于特定机构内部使用。
95.联盟链则是介于公有链以及私有链之间的区块链,可实现“部分去中心化”。联盟链中各个节点通常有与之相对应的实体机构或者组织;节点通过授权加入网络并组成利益相关联盟,共同维护区块链运行。
96.基于区块链的基本特性,区块链通常是由若干个区块构成。在这些区块中分别记录有与该区块的创建时刻对应的时间戳,所有的区块严格按照区块中记录的时间戳,构成一条在时间上有序的数据链条。
97.对于物理世界产生的真实数据,可以将其构建成区块链所支持的标准的交易(transaction)格式,然后发布至区块链,由区块链中的节点设备对收到的交易进行共识处理,并在达成共识后,由区块链中作为记账节点的节点设备,将这笔交易打包进区块,在区块链中进行持久化存证。
98.其中,区块链中支持的共识算法可以包括:
99.第一类共识算法,即节点设备需要争夺每一轮的记账周期的记账权的共识算法;例如,工作量证明(proof of work,pow)、股权证明(proof of stake,pos)、委任权益证明(delegated proof of stake,dpos)等共识算法;
100.第二类共识算法,即预先为每一轮记账周期选举记账节点(不需要争夺记账权)的共识算法;例如,实用拜占庭容错(practical byzantine fault tolerance,pbft)等共识算法。
101.在采用第一类共识算法的区块链网络中,争夺记账权的节点设备,都可以在接收到交易后执行该笔交易。争夺记账权的节点设备中可能有一个节点设备在本轮争夺记账权的过程中胜出,成为记账节点。记账节点可以将收到的交易与其它交易一起打包以生成最新区块,并将生成的最新区块或者该最新区块的区块头发送至其它节点设备进行共识。
102.在采用第二类共识算法的区块链网络中,具有记账权的节点设备在本轮记账前已经商定好。因此,节点设备在接收到交易后,如果自身不是本轮的记账节点,则可以将该交易发送至记账节点。对于本轮的记账节点,在将该交易与其它交易一起打包以生成最新区块的过程中或者之前,可以执行该交易。记账节点在生成最新区块后,可以将该最新区块或者该最新区块的区块头发送至其它节点设备进行共识。
103.如上所述,无论区块链采用以上示出的哪种共识算法,本轮的记账节点都可以将接收到的交易打包以生成最新区块,并将生成的最新区块或者该最新区块的区块头发送至其它节点设备进行共识验证。如果其它节点设备接收到最新区块或者该最新区块的区块头后,经验证没有问题,可以将该最新区块追加到原有的区块链末尾,从而完成区块链的记账过程。其它节点验证记账节点发来的新的区块或区块头的过程中,也可以执行该区块中的包含的交易。
104.在区块链领域,有一个重要的概念就是账户(account);以以太坊为例,以太坊通常将账户划分为外部账户和合约账户两类;外部账户就是由用户直接控制的账户,也称之为用户账户;而合约账户则是由用户通过外部账户创建的,包含合约代码的账户(即智能合约)。当然,对于一些基于以太坊的架构而衍生出的区块链项目(比如蚂蚁区块链),还可以对区块链支持的账户类型,进行进一步的扩展,在本说明书中不进行特别限定。
105.对于区块链中的账户而言,通常会通过一个结构体,来维护账户的账户状态。当区块中的交易被执行后,区块链中与该交易相关的账户的状态通常也会发生变化。
106.以以太坊为例,账户的结构体通常包括balance,nonce,code和storage等字段。其中:
107.balance字段,用于维护账户目前的账户余额;
108.nonce字段,用于维护该账户的交易次数;它是用于保障每笔交易能且只能被处理一次的计数器,有效避免重放攻击;
109.code字段,用于维护该账户的合约代码;在实际应用中,code字段中通常仅维护合约代码的hash值;因而,code字段通常也称之为codehash字段。
110.storage字段,用于维护该账户的存储内容(默认字段值为空);对于合约账户而言,通常会分配一个独立的存储空间,用以存储该合约账户的存储内容;该独立的存储空间通常称之为该合约账户的账户存储。合约账户的存储内容通常会构建成mpt(merklepatriciatrie)树的数据结构存储在上述独立的存储空间之中;其中,基于合约账户的存储内容构建成的mpt树,通常也称之为storage树。而storage字段通常仅维护该storage树的根节点;因此,storage字段通常也称之为storageroot字段。
111.其中,对于外部账户而言,以上示出的code字段和storage字段的字段值均为空值。
112.此外,在实际应用中,不论是公有链、私有链还是联盟链,都可能提供智能合约(smart contract)的功能。区块链上的智能合约是在区块链上可以被交易触发执行的合约。智能合约可以通过代码的形式定义。
113.以以太坊为例,支持用户在以太坊网络中创建并调用一些复杂的逻辑。以太坊作为一个可编程区块链,其核心是以太坊虚拟机(evm),每个以太坊节点都可以运行evm。evm是一个图灵完备的虚拟机,通过它可以实现各种复杂的逻辑。用户在以太坊中发布和调用智能合约就是在evm上运行的。实际上,evm直接运行的是虚拟机代码(虚拟机字节码,下简称“字节码”),所以部署在区块链上的智能合约可以是字节码。
114.图3是一种创建智能合约的方法示意图,如图3所示,bob将一笔包含创建智能合约信息的交易(transaction)发送到以太坊网络后,各节点均可以在evm中执行这笔交易。其中,图中1中交易的from字段用于记录发起创建智能合约的账户的地址,交易的data字段的
字段值保存的合约代码可以是字节码,交易的to字段的字段值为一个null(空)的账户。当节点间通过共识机制达成一致后,这个智能合约成功创建,后续用户可以调用这个智能合约。
115.智能合约创建后,区块链上出现一个与该智能合约对应的合约账户,并拥有一个特定的地址;比如,图3中各节点中的“0x68e12cf284
…”
就代表了创建的这个合约账户的地址;合约代码(code)和账户存储(storage)将保存在该合约账户的账户存储中。智能合约的行为由合约代码控制,而智能合约的账户存储则保存了合约的状态。换句话说,智能合约使得区块链上产生包含合约代码和账户存储的虚拟账户。
116.前述提到,包含创建智能合约的交易的data字段保存的可以是该智能合约的字节码。字节码由一连串的字节组成,每一字节可以标识一个操作。基于开发效率、可读性等多方面考虑,开发者可以不直接书写字节码,而是选择一门高级语言编写智能合约代码。例如,高级语言可以采用诸如solidity、serpent、lll语言等。对于采用高级语言编写的智能合约代码,可以经过编译器编译,生成可以部署到区块链上的字节码。
117.以solidity语言为例,用其编写的合约代码与面向对象编程语言中的类(class)很相似,在一个合约中可以声明多种成员,包括状态变量、函数、函数修改器、事件等。状态变量是永久存储在智能合约的账户存储(storage)字段中的值,用于保存合约的状态。
118.图4是一种调用智能合约的方法示意图,如图4所示,仍以以太坊为例,bob将一笔包含调用智能合约信息的交易发送到以太坊网络后,各节点均可以在evm中执行这笔交易。其中,图4中交易的from字段用于记录发起调用智能合约的账户的地址,to字段用于记录被调用的智能合约的地址,交易的data字段用于记录调用智能合约的方法和参数。调用智能合约后,合约账户的账户状态可能改变。后续,某个客户端可以通过接入的区块链节点(例如图4中的节点1)查看合约账户的账户状态。
119.智能合约可以以规定的方式在区块链网络中每个节点独立的执行,所有执行记录和数据都保存在区块链上,所以当这样的交易执行完毕后,区块链上就保存了无法篡改、不会丢失的交易凭证。
120.图5是一种创建智能合约和调用智能合约的方法示意图,如图5所示。以太坊中要创建一个智能合约,需要经过编写智能合约、变成字节码、部署到区块链等过程。以太坊中调用智能合约,是发起一笔指向智能合约地址的交易,各个节点的evm可以分别执行该交易,将智能合约代码分布式的运行在以太坊网络中每个节点的虚拟机中。
121.本技术实施例提供了一种基于区块链创建数字签名的方法,本技术实施例中区块链上部署的智能合约不仅可以使用java进行编写,也可以使用c#、golang、node.js等编程语言进行编写,图6是根据本技术实施例的基于区块链创建数字签名方法的步骤流程图,如图6所示,该方法包括以下步骤:
122.步骤s602,通过区块链上部署的智能合约响应创建数字签名请求;
123.步骤s604,通过智能合约读取数字签名请求中的待签署文件;
124.步骤s606,通过智能合约设置数字签名的认证级别,以及数字签名的外观;
125.步骤s608,通过智能合约获取签名人的私钥和证书链;
126.步骤s610,通过智能合约创建待签署文件的摘要,根据摘要、私钥和证书链,通过智能合约在待签署文件中创建数字签名。
127.需要说明的是,在步骤s602中通过区块链上部署的智能合约响应创建数字签名请求,该请求可以是接收应用端所发送的交易请求,也可以是所述区块链上部署的智能合约所发起的调用,还可以是非所述区块链通过跨链发起的交易请求,具体请求方式不局限于前述几种方式。
128.在步骤s608中获取的签名人的私钥和证书链,可以是通过解析用于所述数字签名的证书来获取,也可以是直接将私钥和证书链传入,或通过索引获取等等。
129.在步骤s610中创建的数字签名可以是纯数学的形式,比如公钥/私钥加密的文档摘要,该数字签名还可以是生物特征的形式,比如手写签名、指纹或视网膜扫描等等。
130.在步骤s610中创建数字签名之后,通过区块链中的智能合约还能够对已签署文件的数字签名进行验证,智能合约创建数字签名的方法是计算文档中数据或部分数据的摘要,并将摘要保存在文档中。要验证签名时,智能合约重新计算摘要,并将它与文档中存储的摘要进行比较。如果摘要值之间存在差异,表明文档自签名以来进行了改动。
131.通过本技术实施例中的步骤s602至步骤s610,区块链上部署的智能合约响应创建数字签名请求,读取并保存数字签名请求中的待签署文件,设置数字签名的认证级别,以及数字签名的外观;再通过智能合约获取签名人的私钥和证书链,再通过智能合约创建待签署文件的摘要,根据摘要、私钥和证书链,通过智能合约在待签署文件中创建数字签名,解决了相关技术中进行数字签名操作过于复杂且软硬件成本较高,以及存在安全隐患的问题,实现了去第三方中心化服务,提高了数字签名系统的可靠性和稳定性,降低数字签名系统复杂度,以及用户使用数字签名的成本和风险。
132.在其中一些实施例中,图7是根据本技术实施例的基于区块链获取待签署文件的步骤流程图,如图7所示,步骤s604,通过智能合约读取并保存数字签名请求中的待签署文件包括具体还包括以下步骤:
133.步骤s702,通过智能合约导入用于文档处理的预设组件,并读取数字签名请求中的待签署文件,调用预设组件构建读入对象;
134.步骤s704,通过智能合约新建签署属性对象;
135.步骤s706,通过智能合约新建签署对象,读取读入对象和签署属性对象,并将读取的数据设置为签署对象的参数。
136.具体地,在步骤s702中,可以通过智能合约导入java类库itext,并读取数字签名请求中的待签署文件,调用itext构建pdfreader读入对象;
137.在步骤s704中,可以通过智能合约新建stampingproperties签署属性对象;
138.在步骤s706中,可以通过智能合约新建pdfsigner签署对象,读取pdfreader读入对象和stampingproperties签署属性对象,并将读取的数据设置为pdfsigner签署对象的参数。
139.需要说明的是,java类库itext只是用于文档处理的预设组件中的其中一种,c#、golang、node.js等编程语言中都有对应成熟的文档处理库可以调用,如e

iceblue所提供的spire组件也可以处理pdf文件,此外,还可以按照pdf标自己编写方法来进行处理。
140.在其中一些实施例中,步骤s606,通过智能合约设置数字签名的认证级别包括:
141.通过智能合约新建签署对象,设置签署对象的认证属性,进而设置数字签名的认证级别。
142.具体地,通过智能合约新建pdfsigner签署对象,设置pdfsigner签署对象的属性certificationlevel;
143.将pdfsigner签署对象的属性certificationlevel设置为:not_certified,即创建一个普通签名,又名批准或收件人签名。一个或多个收件人可以签署一份文件以供批准。
144.将pdfsigner签署对象的属性certificationlevel设置为:
145.certified_no_changes_allowed,即创建认证签名又名作者签名。应用签名后,将不允许对文档进行任何更改。
146.将pdfsigner签署对象的属性certificationlevel设置为:
147.certified_form_filling,即为文档的作者创建一个认证签名。其他人仍然可以填写表单字段或添加批准签名而不会使签名无效。
148.将pdfsigner签署对象的属性certificationlevel设置为:
149.certified_form_filling_and_annotations,即创建一个认证签名。其他人仍然可以填写表单字段,或添加批准签名以及注释而不会使签名无效。
150.在其中一些实施例中,步骤s704,通过智能合约新建签署属性对象包括:
151.通过智能合约新建签署属性对象,并设置追加模式,追加模式用于对待签署文件或签署后文件进行操作,操作包括填写字段、多次签名、多次签名和填写字段,以及签名后锁定字段和文件。
152.具体地,通过智能合约新建stampingproperties签署属性对象,并设置追加模式,追加模式用于对待签署文件或签署后文件进行操作;
153.填写字段,即文档签署后添加内容,前置条件是在前述智能合约设置认证级别时,需设置认证级别为“表单填写和注释”,在追加模式下使用pdfstamper,将在原始%%eof语句之后添加定义注释的额外对象,且普通签名不会被破坏。
154.多次签名,即在追加模式下,可进行认证签名和批准签名,前提是认证级别允许填写表单。
155.多次签名和填写字段,即在追加模式下使用pdfstamper,从pdfstamper对象中获得一个acrofields对象,然后使用setfield()方法填写字段,传递一个键(在表单中定义的名称)和一个值。通常将该字段设置为只读,以便工作流程中的其他操作不会意外更改该字段。最优方式是跳过前述填写步骤,填写表单并同时进行签名。
156.签名后锁定字段和文件,即在追加模式下通过将/lock条目添加到签名字段来定义权限,其中pdfsiglockdictionary作为值,可用于认证签名和批准签名。如果要锁定特定字段,智能合约需要以下这些用作lockaction的值:
157.all,即锁定文档中的所有字段;
158.include,即锁定添加到签名锁定字典的所有字段;
159.exclude,即锁定除添加到签名锁定字典之外的所有字段。
160.假设要定义覆盖整个文档的锁,智能合约需要使用带有一个lockpermissions参数的pdfsiglockdictionary构造函数。并将以下这些用作lockpermissions的值:
161.no_changes_allowed,即批准后,任何人都不能在不破坏签名的情况下更改文件;
162.form_filling,即审核通过后,即可填表;
163.form_filling_and_annotation,即审核通过后,可以填写表格和添加注释。
164.在其中一些实施例中,步骤s606,通过智能合约设置数字签名的外观包括:
165.通过智能合约导入用于文档处理的预设组件,并调用预设组件来定义所述数字签名为可见签名,或者为不可见签名。
166.具体地,通过智能合约导入java类库itext,并调用itext中的pdfsignatureappearance类,定义数字签名为可见签名。
167.通过智能合约调用itext中的pdfsignatureappearance类,定义数字签名为可见签名,并设置一个宽度和/或高度为零的矩形,以及页码(如第1页)和签名字段的名称(如“wesign”)等。
168.需要说明的是,java类库itext只是用于文档处理的预设组件中的其中一种,c#、golang、node.js等编程语言中都有对应成熟的文档处理库可以调用,如e

iceblue所提供的spire组件也可以处理pdf文件,此外,还可以按照pdf标自己编写方法来进行处理。
169.在其中一些实施例中,通过智能合约调用预设组件来定义所述数字签名为可见签名包括:
170.通过智能合约调用预设组件,使用文本添加方法来添加文本;
171.通过智能合约调用预设组件,使用背景添加方法在文本的背景中添加图像;
172.通过智能合约调用预设组件,使用图像获取方法来获取图片对象,并使用图像设置方法来设置图片对象;
173.通过智能合约调用预设组件,使用渲染设置方法设置不同的渲染模式。
174.具体地,调用itext中的pdfsignatureappearance类,使用setlayer2text()方法和setlayer2font()方法添加文本,此外,还可以通过setrundirection()方法添加从右到左书写的文本;
175.使用setimage()方法在文本的背景中添加图像;
176.使用image类中的getinstance方法获取图片对象,并使用setimage()方法设置图片对象,还可以使用setimagescale()方法设置图像的长宽。
177.使用setrenderingmode()方法设置不同的渲染模式;
178.其中,不同的渲染模式包括:
179.renderingmode.description,这是默认设置,只显示上述文本和图片定义的任何描述。
180.renderingmode.name_and_description,这会将签名字段一分为二,并在一侧添加签名者的姓名,在另一侧添加描述。
181.renderingmode.graphic_and_description,这会将签名字段一分为二,并在一侧添加图像,在另一侧添加描述。
182.renderingmode.graphic,签名字段将仅包含图像,并将不显示任何说明。
183.需要说明的是,java类库itext只是用于文档处理的预设组件中的其中一种,c#、golang、node.js等编程语言中都有对应成熟的文档处理库可以调用,如e

iceblue所提供的spire组件也可以处理pdf文件,此外,还可以按照pdf标自己编写方法来进行处理。
184.在其中一些实施例中,步骤s606,通过智能合约设置数字签名的外观还包括:
185.通过智能合约导入用于文档处理的预设组件,并调用预设组件向签名字典中添加元数据,元数据包括签名者姓名、签名时间、签名的物理位置、签名原因和签名者提供的信
息。
186.具体地,通过智能合约导入java类库itext,调用itext中的pdfsignatureappearance类,向签名字典中添加元数据;
187.通过智能合约调用pdfsignatureappearance类定义外观时,可将以下元数据添加到签名字典;
188.name,签名者姓名,即签署文件的人或当局的姓名。
189.m,签名时间,即签约时间。
190.location,签名的物理位置,即cpu主机名或签名的物理位置。
191.reason,签名原因,即签署的原因,例如“我同意”。
192.contactinfo,签名者提供的信息,使接收者能够联系签名者以验证签名,例如电话号码。
193.需要说明的是,java类库itext只是用于文档处理的预设组件中的其中一种,c#、golang、node.js等编程语言中都有对应成熟的文档处理库可以调用,如e

iceblue所提供的spire组件也可以处理pdf文件,此外,还可以按照pdf标自己编写方法来进行处理。
194.在其中一些实施例中,步骤s610,通过智能合约创建待签署文件的摘要,根据摘要、私钥和证书链,通过智能合约在待签署文件中创建数字签名包括:
195.通过智能合约获取待签署文件的预设字节范围数据,根据加密哈希函数在预设字节范围数据中创建摘要;
196.根据签名人的私钥创建签名;
197.将摘要、签名和证书链传入签署对象,创建待签署文件的数字签名。
198.具体地,通过智能合约实现externaldigest接口,获取待签署文件的预设字节范围数据,根据加密哈希函数在预设字节范围数据中创建摘要;
199.将签名人的私钥传入externalsignature接口来创建签名;
200.将摘要、签名和证书链传入pdfsigner签署对象,创建待签署文件的数字签名。
201.需要说明的是,通过智能合约计算待签署文件的数字签名的摘要,通常使用以下两种技术:
202.基于文件中的一个字节范围计算得出字节范围摘要,且由签名字典中的某个条目表示此范围。此范围宜为整个文件,包括签名字典,但不包括签名值本身。也可以使用其他范围。字节范围摘要存在时,签名字典中的所有值都应是直接对象。
203.基于签名引用字典可以指定修改检测。具体条目应指定修改检测的常规方法,且应指定方法的可变部分。
204.此外,待签署文件(如pdf文档)可包含以下标准类型的数字签名:
205.一个或多个审批签名;最多一个证书签名;最多使用两个使用权限签名。
206.每个数字签名中需要存储的最少信息包括签名的消息摘要、签名者的证书,还可以包括证书链中的其余证书(甚至根证书)、吊销信息、时间戳。
207.图8是待签署文件中签名字典的byterange条目的示意图,如图8所示,在签署pdf文档时,通常引用文件的所有字节范围,使用加密哈希函数从这些字节创建消息摘要。然后使用私钥对该哈希值进行签名,并将签名的哈希值与一些已签名或/和未签名的额外信息,如签名者证书、签名属性等,存储在签名容器内。
208.图9是待签署文件中进行多次签名的示意图,一个文档可以由不同的签名者多次签名,这通常需要顺序进行以避免新的签名者致使以前的签名者的签名无效,如图9所示,文档有三个修订版。修订版1由签署人1签名;修订版2由签署人1、2签名;修订版3由签名人1、2和3签名。每个新签名者都对所有以前的签名进行了签名。
209.本技术实施例提供了一种基于区块链创建数字签名的系统,图11是根据本技术实施例的基于区块链创建数字签名系统的结构框图,如图11所示,该系统包括接收模块101、获取模块102、设置模块103、解析模块104、运算模块105和签署模块106;
210.接收模块101通过区块链上部署的智能合约响应创建数字签名请求;
211.获取模块102通过智能合约读取数字签名请求中的待签署文件;
212.设置模块103通过智能合约设置数字签名的认证级别,以及数字签名的外观;
213.解析模块104通过智能合约获取签名人的私钥和证书链;
214.运算模块105通过智能合约创建待签署文件的摘要;
215.签署模块106根据摘要、私钥和证书链,通过智能合约在待签署文件中创建数字签名。
216.需要说明的是,上述各个模块可以是功能模块也可以是程序模块,既可以通过软件来实现,也可以通过硬件来实现。对于通过硬件来实现的模块而言,上述各个模块可以位于同一处理器中;或者上述各个模块还可以按照任意组合的形式分别位于不同的处理器中。
217.通过本技术实施例,接收模块101区块链上部署的智能合约响应创建数字签名请求,获取模块102读取并保存数字签名请求中的待签署文件;设置模块103设置数字签名的认证级别,以及数字签名的外观;解析模块104再通过智能合约获取签名人的私钥和证书链;运算模块105通过智能合约创建待签署文件的摘要;签署模块106根据摘要、私钥和证书链,在待签署文件中创建数字签名,解决了相关技术中进行数字签名操作过于复杂且软硬件成本较高,以及存在安全隐患的问题,实现了去第三方中心化服务,提高了数字签名系统的可靠性和稳定性,降低数字签名系统复杂度,以及用户使用数字签名的成本和风险。
218.本技术具体实施例提供了一种基于区块链创建数字签名的方法,在hyperledger fabric区块链上采用java语言编写智能合约,图11是根据本技术具体实施例的基于区块链创建数字签名方法的流程示意图,如图11所示,该方法的具体操作步骤如下:
219.步骤一,接收创建数字签名的请求。
220.区块链上部署的智能合约响应创建文档数字签名的请求,请求可以是接收应用端所发送的交易请求,也可以是区块链上部署的智能合约所发起的调用,还可以是非区块链通过跨链发起的交易请求,具体请求方式不局限于前述几种方式。
221.步骤二,导入itext库构建pdfreader读入对象。
222.区块链上部署的智能合约导入java类库itext,智能合约读取前述创建文档数字签名请求中的待签署文件,调用itext库构建pdfreader读入对象。
223.步骤三,设置以“追加模式”操作文件。
224.在区块链上部署的智能合约新建stampingproperties签署属性对象,并设置以“追加模式”操作文件;
225.步骤四,新建pdfsigner签署对象。
226.在区块链上部署的智能合约新建pdfsigner签署对象,读取pdfreader读入对象和stampingproperties签署属性对象并将其设置为pdfsigner签署对象的参数;
227.步骤五,设置签署认证等级。
228.在区块链上部署的智能合约设置认证级别,将pdfsigner签署对象的属性certificationlevel设置为以下值之一:
229.not_certified——创建一个普通签名,又名批准或收件人签名。一个或多个收件人可以签署一份文件以供批准。
230.certified_no_changes_allowed——创建认证签名又名作者签名。应用签名后,将不允许对文档进行任何更改。
231.certified_form_filling——为文档的作者创建一个认证签名。其他人仍然可以填写表单字段,或者添加批准签名而不会使签名无效。
232.certified_form_filling_and_annotations——创建一个认证签名。其他人仍然可以填写表单字段,或者添加批准签名以及注释而不会使签名无效。
233.步骤六,新建签署外观对象并定义外观,以及渲染模式。
234.区块链上部署的智能合约使用pdfsignatureappearance类定义外观,设置签名的原因和位置。
235.可选的,创建带有不可见签名的pdf文档,定义并设置一个宽度和/或高度为零的矩形,以及页码(如:第1页)和签名字段的名称(如:“wesign”)等。
236.可选的,创建带有可见签名的pdf文档,通常使用以下几种便捷方式创建签名外观,包括:
237.自定义文本,使用setlayer2text()和setlayer2font()方法添加文本。
238.进一步的,可使用setrundirection()方法添加从右到左书写的文本;
239.进一步的,可使用setimage()方法在文本的背景中添加图像。
240.自定义图片,通过image类中的getinstance方法获取图片对象。
241.进一步的,使用setimage()方法设置图片;
242.进一步的,还可使用setimagescale()方法设置图像的长宽比。
243.自定义渲染模式,除了更改签名信息和背景外,智能合约还能使用setrenderingmode()方法设置不同的渲染模式,对应渲染模式描述如下:
244.renderingmode.description——默认设置,它只显示为第2层定义的任何描述。
245.renderingmode.name_and_description——将签名字段一分为二,并在一侧添加签名者的姓名,在另一侧添加描述。
246.renderingmode.graphic_and_description——将签名字段一分为二,并在一侧添加图像,在另一侧添加描述。
247.renderingmode.graphic——签名字段将仅包含图像;将不显示任何说明。
248.可选的,在前述智能合约使用pdfsignatureappearance类定义外观时,可向签名字典添加元数据,即将以下元数据添加到签名字典:
249.name——签署文件的人或当局的姓名。
250.m——签约时间。
251.location——cpu主机名或签名的物理位置。
252.reason——签署的原因,例如“我同意”。
253.contactinfo——签名者提供的信息,使接收者能够联系签名者以验证签名,例如电话号码。
254.步骤七,解析ca证书
255.在区块链上部署的智能合约中解析用于本次签名的证书以获取签名人的私钥及证书链,签名的证书可以通过应用端随交易请求一起发送至于区块链,也可以是通过索引去证书对应存储空间读取证书。证书密码由签名人提供,或由签名人委托的可信第三方托管并提供,通过证书密码解析签署证书以获取签名人的私钥及证书链。
256.可选的,智能合约可以直接接收签名人的私钥及证书链用于创建签名。
257.步骤八,调用pdfsigner签署对象进行签署。
258.区块链上部署的智能合约调用pdfsigner签署对象对前述待签署文件进行签名,具体操作如下:
259.实现externaldigest接口来创建摘要;
260.将签名人的私钥传入externalsignature接口来创建签名,
261.将摘要、签名以及前述证书链传入pdfsigner签署对象创建文档的数字签名。
262.此外,在步骤三中设置以“追加模式”操作文件。
263.可选的,文档签署后添加内容,前置条件是在前述智能合约设置认证级别时,需设置认证级别为“表单填写和注释”,在追加模式下使用pdfstamper,将在原始%%eof语句之后添加定义注释的额外对象,且普通签名不会被破坏。
264.可选的,多次签署文件,在追加模式下,可进行认证签名和批准签名,前提是认证级别允许填写表单。
265.可选的,多次签名和填写字段,在追加模式下使用pdfstamper,从pdfstamper对象中获得一个acrofields对象,然后使用setfield()方法填写字段,传递一个键(在表单中定义的名称)和一个值。通常将该字段设置为只读,以便工作流程中的其他操作不会意外更改该字段。最优方式是跳过前述表单填写步骤,填写表单并同时进行签名。
266.可选的,签名后锁定字段和文件,通过将/lock条目添加到签名字段来定义权限,其中pdfsiglockdictionary作为值,可用于认证签名和批准签名。如果要锁定特定字段,智能合约需要以下这些用作lockaction的值:
267.all——锁定文档中的所有字段;
268.include——锁定添加到签名锁定字典的所有字段;
269.exclude——锁定除添加到签名锁定字典之外的所有字段。
270.如果要定义覆盖整个文档的锁,智能合约需要使用带有一个lockpermissions参数的pdfsiglockdictionary构造函数。并需要选择以下lockpermissions之一:
271.no_changes_allowed—批准后,任何人都不能在不破坏签名的情况下更改文件;
272.form_filling—审核通过后,即可填表;
273.form_filling_and_annotation—审核通过后,可以填写表格和添加注释。
274.需要说明的是,在本技术具体实施例中,区块链上部署的智能合约还可以使用c#、golang、node.js等编程语言进行编写;
275.本技术具体实施例中的java类库itext只是java编程语言用于文档处理的一个类
库,c#、golang、node.js等编程语言中都有对应成熟的文档处理库可以调用,如e

iceblue所提供的spire组件也可以处理pdf文件,此外,还可以按照pdf标准自己编写方法来进行处理。
276.通过本技术具体实施例中的步骤一至步骤八,解决了相关技术中进行数字签名操作过于复杂且软硬件成本较高,以及存在安全隐患的问题,实现了去第三方中心化服务,提高了数字签名系统的可靠性和稳定性,降低数字签名系统复杂度,以及用户使用数字签名的成本和风险。
277.与现有通过签名服务器来创建文档签名相比,基于区块链创建文档签名的方法实施更便捷、使用成本更便宜;与现有通过云服务器等中心化服务来创建文档签名相比,基于区块链创建文档签名的方法更安全、更可靠,能最大限度的保障文档的信息安全,并能提供可靠的司法证据链。
278.需要说明的是,在上述流程中或者附图的流程图中示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
279.本实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
280.在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种基于区块链创建数字签名的方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
281.在一个实施例中,图12是根据本技术实施例的电子设备的内部结构示意图,如图12所示,提供了一种电子设备,该电子设备可以是服务器,其内部结构图可以如图12所示。该电子设备包括通过内部总线连接的处理器、网络接口、内存储器和非易失性存储器,其中,该非易失性存储器存储有操作系统、计算机程序和数据库。处理器用于提供计算和控制能力,网络接口用于与外部的终端通过网络连接通信,内存储器用于为操作系统和计算机程序的运行提供环境,计算机程序被处理器执行时以实现一种基于区块链创建数字签名的方法,数据库用于存储数据。
282.本领域技术人员可以理解,图12中示出的结构,仅仅是与本技术方案相关的部分结构的框图,并不构成对本技术方案所应用于其上的电子设备的限定,具体的电子设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
283.本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本技术所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括
非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。
284.本领域的技术人员应该明白,以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
285.以上所述实施例仅表达了本技术的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本技术构思的前提下,还可以做出若干变形和改进,这些都属于本技术的保护范围。因此,本技术专利的保护范围应以所附权利要求为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1