具体实施方式
为了使本领域技术人员更好地理解本说明书实施例中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行详细地描述,显然,所描述的实施例仅仅是本说明书的一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于保护的范围。
首先对本说明书实施例中所涉及的块链式账本进行简要说明,如图1所示,图1为本说明书实施例所提供的一种链式账本中的数据块生成方法的流程示意图,该流程具体包括如下步骤:
S301,接收待存储的数据记录,确定各数据记录的哈希值。此处的待存储的数据记录,可以是客户端个人用户的各种消费记录,也可以是应用服务器基于用户的指令,在执行业务逻辑时产生的业务结果、中间状态以及操作记录等等。具体的业务场景可以包括消费记录、审计日志、供应链条、政府监管记录、医疗记录等等。
S303,当达到预设的成块条件时,确定待写入数据块中的各数据记录,生成包含数据块的哈希值和数据记录的第N个数据块。
所述预设的成块条件包括:待存储的数据记录数量达到数量阈值,例如,每接收到一千条数据记录时,生成一个新数据块,将一千条数据记录写入块中;或者,距离上一次成块时刻的时间间隔达到时间阈值,例如,每隔5分钟,生成一个新数据块,将在这5分钟内接收到的数据记录写入块中。
此处的N指的是数据块的序号,换言之,在本说明书实施例中,数据块是以块链的形式,基于成块时间的顺序先后排列,具有很强的时序特征。其中,数据块的块高基于成块时间的先后顺序单调递增。块高可以是序号,此时第N个数据块的块高即为N;块高也可以其它方式生成,例如,将数据块的成块时间戳转换为单调递增的大整型数据,以该大整型数据作为数据块的块高。
当N=1时,即此时的数据块为为初始数据块。初始数据块的哈希值和块高基于预设方式给定。例如,初始数据块中不包含数据记录,哈希值则为任一给定的哈希值,块高blknum=0;又例如,初始数据块的生成触发条件与其它数据块的触发条件一致,但是初始数据块的哈希值由对初始数据块中的所有内容取哈希确定。
当N>1时,由于前一数据块的内容和哈希值已经确定,则此时,可以基于前一数据块(即第N-1个数据块)的哈希值生成当前数据块(第N个数据块)的哈希值。
具体而言,可以确定每一条将要写入第N个块中的数据记录的哈希值,按照在块中的排列顺序,生成一个默克尔树,将默克尔树的根哈希值和前一数据块的哈希值拼接在一起,再次采用哈希算法,生成当前块的哈希值,以及还可以根据默克尔树的根哈希值和其它一些元数据(例如版本号、数据块的生成时间戳等等)生成当前快的哈希值。并且,将所述数据记录写入数据块的块体中,将所述根哈希写入数据块的块头中,其中,数据块的块高基于成块时间的先后顺序单调递增。
块链式账本中的数据块,可以包括块头和块体两个部分。块体中可以用于存储拼接数据的明文,或者拼接数据的哈希值等等;块头中可以用于存储有关本数据块的元数据,例如,账本的版本号,前一数据块的哈希值,自身数据块中的拼接数据所组成的默克尔树的根哈希值,自身数据块的哈希值,用于记录拼接数据的被操作状态的状态数组等等。如图2所示,图2为本说明书实施例所提供的一种数据块的块头的示意图。
用户在上传数据成功后,即可以得到对应的数据记录的哈希值以及所处的数据块的哈希值,并保存,并且可以基于该哈希值发起完整性验证。
完整性验证包括对于一个数据块的完整性验证,即,根据数据块中数据记录的哈希值重新组成默克尔树,计算默克尔树的根哈希值,并且根据默克尔树的根哈希值与前一数据块的哈希值重新计算该数据块的哈希值,与事先保存的数据块的哈希值进行一致性对比。
完整性验证还可以包括对于若干连续数据块的完整性验证,即根据数据块的块头中所保存的默克尔树的根哈希值与前一数据块的哈希值重新计算该数据块的哈希值,并与事先保存的数据块的哈希值进行对比。
通过前述的数据块的生成方式,每一个数据块通过哈希值确定,数据块的哈希值由数据块中的数据记录的内容、顺序以及前一数据块的哈希值决定。用户可以随时基于数据块的哈希值或者数据记录的哈希值发起验证,对于数据块中任何内容(包括对于数据块中数据记录内容或者顺序的修改)的修改都会造成在验证时计算得到的数据块的哈希值和数据块生成时的哈希值不一致,而导致验证失败,从而实现了中心化下的不可篡改。
进一步地,在本说明书实施例中,用户还可以对于自己在数据库中的相关操作和数据记录进行数字签名。例如,用户在服务端中对整个账本进行完整性验证,在验证之后,数据库服务端首先进行签名,并发送包含服务端数字签名的验证结果至用户,而用户则对于该验证结果进行进一步的数字签名,生成同时包含有用户签名和服务端签名的验证结果,并保存至服务端中。
前述的签名过程可以是一个用户进行了签名设置之后默认进行的操作,即,用户只需事先配置“需要签名”,并上传自己的相关密钥(可以是公钥加私钥,或者仅包含公钥),则服务端和客户端可以进行自动式的数字签名,用户对此并无感知。容易理解,这个过程中,用户的公钥则是必须公开的。因此,就有可能发生冒用或者冲撞的现象。
基于此,本说明书实施例还提供一种在块链式账本中对公钥进行有效管理的方案。如图3所示,图3是本说明书实施例提供的一种在块链式账本中公钥管理方法的流程示意图,该流程具体包括如下步骤:
S301,获取用户标识,确定用户标识所待使用的公钥。
通常而言,在块链式账本中对于每一个新授权的用户都会需要确定其待使用的公钥。
例如,对于一个已经拥有账本的机构而言,其在账本中有一个统一的管理员用户,该管理员用户在账本中已经预先存在一个可以使用的可用公钥。每当该机构需要授权一个其分支机构或者用户在账本中相应的权限时,该新授权的用户都需要关联至该可用公钥。
又例如,对于一个还没有拥有账本的机构而言,其需要在账本中创建管理员用户的同时,确定该管理员用户所可以使用的公钥。具体而言,可以是服务端通过预设的算法给定相应的密钥(包括私钥和公钥),也可以是用户本身导入已经得到过证书认证机构背书的公钥。
在一种实施方式中,可以在创建管理员用户之后,即在可信执行环境(TrustedExecution Environment,TEE)中生成对应的公钥和私钥对。TEE可以起到硬件中的黑箱作用,在TEE中执行的代码和数据操作系统层都无法偷窥,只有代码中预先定义的接口才能对其进行操作。
可信执行环境是基于CPU硬件的安全扩展,且与外部完全隔离的可信执行环境。TEE最早是由Global Platform提出的概念,用于解决移动设备上资源的安全隔离,平行于操作系统为应用程序提供可信安全的执行环境。ARM的Trust Zone技术最早实现了真正商用的TEE技术。
伴随着互联网的高速发展,安全的需求越来越高,不仅限于移动设备,云端设备,数据中心都对TEE提出了更多的需求。TEE的概念也得到了高速的发展和扩充。现在所说的TEE相比与最初提出的概念已经是更加广义的TEE。例如,服务器芯片厂商Intel,AMD等都先后推出了硬件辅助的TEE并丰富了TEE的概念和特性,在工业界得到了广泛的认可。现在提起的TEE通常更多指这类硬件辅助的TEE技术。不同于移动端,云端访问需要远程访问,终端用户对硬件平台不可见,因此使用TEE的第一步就是要确认TEE的真实可信。因此现在的TEE技术都引入了远程证明机制,由硬件厂商(主要是CPU厂商)背书并通过数字签名技术确保用户对TEE状态可验证。换言之,在TEE中执行的结果可以得到硬件厂商的数字签名。
同时仅仅是安全的资源隔离也无法满足的安全需求,进一步的数据隐私保护也被提出。包括Intel SGX,AMD SEV在内的商用TEE也都提供了内存加密技术,将可信硬件限定在CPU内部,总线和内存的数据均是密文防止恶意用户进行窥探。例如,英特尔的软件保护扩展(SGX)等TEE技术隔离了代码执行、远程证明、安全配置、数据的安全存储以及用于执行代码的可信路径。在TEE中运行的应用程序受到安全保护,几乎不可能被第三方访问。
以Intel SGX技术为例,SGX提供了围圈(enclave,也称为飞地),即内存中一个加密的可信执行区域,由CPU保护数据不被窃取。以服务端采用支持SGX的CPU为例,利用新增的处理器指令,在内存中可以分配一部分区域EPC(Enclave Page Cache,围圈页面缓存或飞地页面缓存),通过CPU内的加密引擎MEE(Memory Encryption Engine)对其中的数据进行加密。EPC中加密的内容只有进入CPU后才会被解密成明文。因此,在SGX中,用户可以不信任操作系统、VMM(Virtual Machine Monitor,虚拟机监控器)、甚至BIOS(Basic InputOutput System,基本输入输出系统),只需要信任CPU便能确保代码的执行。
在本说明书实施例中,可以通过在可信执行环境中执行预设的密钥生成算法,并将私钥在TEE中进行保存,并且只需对外公开公钥即可。密钥的真实可靠性由可信执行环境的硬件提供方所保障。当然,也可以将私钥返回至用户自行保存。
TEE中密钥生成算法可以以代码的形式对外公开,从而保证密钥的生成过程服务端是不能感知的,保障密钥的隐私性。通过前述方式,对于每一个新授权的用户标识,总是可以得到其待使用的公钥。
S303,在预先建立的公钥管理文件中查询所述公钥是否存在,若存在,确定所述公钥不可使用。
公钥管理文件是在服务端中所存在的用于保存公钥的使用痕迹的文件。其可以是数据库中的表格或者配置文件等等。
具体而言,公钥管理文件中一条数据记录至少应该如下信息,公钥的字符串(或者公钥的哈希值)和公钥在块链式账本中的初次使用时间。当然,在该数据记录中还可以包含其他信息,例如,使用的用户标识,使用时长、使用次数等等。
若一个公钥在该管理文件中存在,则可以确定账本中该公钥已经被某个用户所使用过,从而无论该公钥在当前是有效还是无效,该公钥都不应被继续使用,即确定所述公钥不可使用。
S305,若不存在,确定当前的可信时间点,建立所述公钥与所述可信时间点的对应关系,将所述对应关系以数据记录的形式写入所述公钥管理文件中。
如果该公钥在管理文件中不存在,则说明该公钥是初次使用,但是这并不能就能说明该公钥就是该用户的。因此,并且为了以后的查证,仍然需要将公钥在账本中的初始使用时间进行记录。当前的可信时间点
由于初始使用时间是需要用作以后查证中的重要特征,因此实际上,此时的用户时间、服务端的系统时间均可能不被采信。基于此,需要获取当前的可信时间点来描述该公钥在系统中的初始使用时间。
具体而言,服务端可以向可信授时机构要求对当前的公钥信息进行授时认证,即服务端可以发送该公钥信息、或者该公钥信息的哈希值或者包含该公钥信息的数据记录至可信授时机构,可信授时机构接收到上述信息,即给出一个可信时间戳,并且对可信时间戳进行数字签名认证,生成一个包含可信时间戳和数字签名的授时证书,同过该可信时间戳表明该公钥信息的首次使用时间。
服务端在接收到该授时证书即可以从中获取可信时间点,并建立该公钥与所述可信时间点的对应关系,将所述对应关系以数据记录的形式写入所述公钥管理文件。如前所述,在该数据记录中还可以包含对应的用户标识等等其它信息。
S307,从所述公钥管理文件中获取包含所述对应关系的数据记录,将所述数据记录写入所述用户标识所对应的块链式账本中。
将数据记录写入了账本的过程已经在前文进行了藐视,如前所述,对于用户而言,就形成了服务端也不可随意篡改的数据记录,用户可以随时查询或者验证;而对于服务端而言,用户使用该公钥的记录,也是写入了账本,并且首次使用时间也得到了认证,是不可抵赖的,从而可以防止公钥在账本中的盗用或者滥用,从多个方面实现对于账本中公钥的有效管理。
通过本说明书实施例所提供的方案,对于任何一个需要向服务端导入公钥的用户标识,服务端首先在公钥管理文件中查询该公钥是不是已经被使用,如果不是,则确定该公钥的首次被使用的可信时间点,并和公钥建立对应关系,写入所述公钥管理文件中,并将公钥管理文件中的数据记录写入用户标识所对应的账本中,以便用户随时查询和验证,从而形成在块链式账本中的单调时间上公钥的不可复用且不可抵赖。
在一种实施方式中,用户可能需要更换公钥(例如,用户的私钥丢失,需要更换公钥;或者用户的一组密钥已经使用较长时间,需要更换),此时用户还可以根据需要将该公钥无效。
具体而言,用户可以通过客户端发送相应的公钥无效请求,公钥无效请求中包含有用户标识和目标公钥,而服务端则可以在公钥管理文件中查询所述目标公钥,将包含所述目标公钥的数据记录中的可用特征设置为表征无效的特征值。此处的可用特征即为该目标公钥的一个属性,在数据记录中既表现为一个字段,通过对该字段的赋值,即可以表明该目标公钥是否可用。例如,“1”表明可用,“0”表明不可用;或者“TRUE”表明可用,“FALSE”表明不可用等等。
进一步地,每当用户发起了公钥无效请求,则服务端还可以生成包含公钥无效请求和目标公钥的数据记录,写入所述用户标识所对应的块链式账本中,作为证据保存。
如前所述,可以知道,在服务端中一个用户标识可能存在好几个公钥,而其中有一些是有效的,有一些则是无效的。基于此,在一种实施方式中,每当服务端接收到客户端所发送的数字签名指令时,还可以根据数字签名指令中所包含的用户标识去确定该用户标识当前所述使用的加密公钥,并且从公钥管理文件中进行查询,确定加密公钥的可用特征的特征值是否为表征无效的特征值,若是,则说明该加密公钥已经无效,则不执行所述数字签名指令,否则,使用所述加密公钥进行数字加密。
对应的,本说明书实施例还提供一种块链式账本中的公钥管理装置,应用于通过块链式账本存储数据的中心化的数据库服务端中,如图4所示,图4是本说明书实施例提供的一种块链式账本中的公钥管理装置的结构示意图,包括:
获取模块401,获取用户标识,确定用户标识所待使用的公钥;
查询模块403,在预先建立的公钥管理文件中查询所述公钥是否存在,若存在,确定所述公钥不可使用;
建立模块405,若不存在,确定当前的可信时间点,建立所述公钥与所述可信时间点的对应关系,将所述对应关系以数据记录的形式写入所述公钥管理文件;
写入模块407,从所述公钥管理文件中获取包含所述对应关系的数据记录,将所述数据记录写入所述用户标识所对应的块链式账本中。
进一步地,所述装置还包括无效模块409,接收客户端所发送的公钥无效请求,其中,所述公钥无效请求中包含有用户标识和目标公钥;在所述公钥管理文件中查询所述目标公钥,将包含所述目标公钥的数据记录中的可用特征设置为表征无效的特征值。
进一步地,所述装置还包括签名模块411,接收客户端所发送的数字签名指令,所述数字签名指令中包含有用户标识;确定所述用户标识当前所述使用的加密公钥;查询所述加密公钥的可用特征的特征值是否为表征无效的特征值,若是,不执行所述数字签名指令,否则,使用所述加密公钥进行数字加密。
进一步地,所述写入模块407还用于,生成包含所述公钥无效请求和目标公钥的数据记录,写入所述用户标识所对应的块链式账本中。
进一步地,所述获取模块401,在可信执行环境中生成所述用户标识所待使用的私钥和公钥;或者,接收所述用户标识所对应的客户端所上传的公钥。
进一步地,所述装置还包括数据块生成模块413,接收用户所发送的待存储的数据记录,确定所述数据记录的哈希值;当达到预设的成块条件时,确定待写入数据块中的各数据记录,生成包含数据块的哈希值和数据记录的第N个数据块:
当N=1时,初始数据块的哈希值和块高基于预设方式给定;
当N>1时,根据待写入数据块中的各数据记录和第N-1个数据块的哈希值确定第N个数据块的哈希值,生成包含第N个数据块的哈希值和各数据记录的第N个数据块,其中,数据块的块高基于成块时间的先后顺序单调递增。
更进一步地,在所述装置中,所述预设的成块条件包括:待存储的数据记录数量达到数量阈值;或者,距离上一次成块时刻的时间间隔达到时间阈值。
本说明书实施例还提供一种计算机设备,其至少包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行所述程序时实现图3所示的公钥管理方法。
图5示出了本说明书实施例所提供的一种更为具体的计算设备硬件结构示意图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。
处理器1010可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
存储器1020可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,并由处理器1010来调用执行。
输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现图3所示的公钥管理方法。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本说明书实施例可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本说明书实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本说明书实施例各个实施例或者实施例的某些部分所述的方法。
上述实施例阐明的系统、方法、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于方法实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的方法实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本说明书实施例方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本说明书实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本说明书实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本说明书实施例的保护范围。