一种摘要引擎的实现方法

文档序号:7756365阅读:208来源:国知局
专利名称:一种摘要引擎的实现方法
技术领域
本发明涉及信息安全领域,尤其是一种摘要引擎的实现方法。
背景技术
OpenSSL项目是一个开源代码的安全项目,目标是用强大的加密算法来实现安全 的Socket层和传输层的安全性。它包含了完整的加密算法,数字签名算法等,可以很好的 保证数据的完整性、保密性。引擎(Engine)机制的目的是为了使OpenSSL能够透明地使用第三方提供的软 件加密库或智能密钥设备进行加密。OpenSSL的引擎机制成功地达到了这个目的,这使得 OpenSSL不仅仅是一个加密库,而且还是一个通用的加密接口,能够与绝大部分的加密库或 智能密钥设备协调工作。

发明内容
本发明提供了一种摘要引擎的实现方法,实现利用智能密钥设备中的信息摘要算 法来完成数据的摘要运算,具体技术方案如下一种摘要引擎的实现方法,上层应用通过调用所述摘要引擎的引擎绑定接口、初 始化接口、第一摘要接口、第二摘要接口、引擎释放接口来实现,所述方法包括引擎绑定接口被上层应用调用时,摘要引擎与智能密钥设备建立连接,获取所述 智能密钥设备的算法列表,并填充第一数据结构,将所述第一数据结构登记到所述上层应 用中;初始化接口被上层应用调用时,所述摘要引擎根据传入的所述第一数据结构设置 所述智能密钥设备当前所使用的信息摘要算法,并为传入的上下文分配存储空间,及初始 化所述上下文;第一摘要接口被上层应用调用时,所述摘要引擎根据当前设置的信息摘要算法, 控制所述智能密钥设备对传入的信息摘要数据进行摘要运算;第二摘要接口被上层应用调用时,所述摘要引擎控制所述智能密钥设备结束摘要 运算,并输出运算结果;引擎释放接口被上层应用程序调用时,所述摘要引擎结束与所述智能密钥设备的 连接。所述引擎绑定接口、初始化接口、第一摘要接口、第二摘要接口、引擎释放接口具 体为:bind_engine 接 Π、init 接 Π、updata 接 Π、final 接 Π、cleanup 接 Π。所述摘要引擎通过硬件加密接口与所述智能密钥设备建立连接。所述硬件加密接口包括密码令牌接口和密码服务程序接口。所述第一数据具体为EVP_MD结构。所述填充第一数据结构具体为根据初始化接口、数据摘要接口、摘要输出接口、 引擎释放接口的指针及所述获取的算法列表来填充第一数据结构。
所述根据初始化接口、数据摘要接口、摘要输出接口、引擎释放接口的指针及所述 获取的算法列表来填充第一数据结构具体为根据上层应用中已有的定义,在所述第一数据结构中为所述算法列表中的信息摘 要算法设置对应的算法ID号;根据所述算法列表中的数值,在所述第一数据结构中为信息摘要算法的分组长 度、摘要值长度设置对应的数值,并为信息摘要算法所需要的上下文空间大小设置对应的 数值,为所述初始化接口、第一摘要接口、第二摘要接口、引擎释放接口设置对应的接口指 针。所述摘要引擎根据传入的所述第一数据结构设置所述智能密钥设备当前所使用 的信息摘要算法具体为所述初始化接口被上层应用调用时,所述填充后的第一数据结构传入所述摘要引 擎;所述摘要引擎根据所述传入的第一数据结构中的信息摘要算法ID查找对应的信 息摘要算法,如果查找不到,就将当前的信息摘要算法设置为默认的信息摘要算法,如果能 够查找到,则将当前的信息摘要算法设置为与所述传入的信息摘要算法ID相对应的信息 摘要算法。所述摘要引擎通过所述硬件加密接口与所述智能密钥设备进行通信。有益效果通过摘要引擎,将一些硬件摘要算法,尤其是一些未公开的,只能用硬 件实现的信息摘要算法添加扩展到现有的软件算法库中,提高了信息摘要运算的安全性。


图1为本发明实施例提供的引擎绑定接口被上层应用程序调用时的流程图;图2为本发明实施例提供的初始化接口被上层应用程序调用时的流程图。
具体实施例方式为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方 式做进一步的描述。实施例1在进行具体说明之前,需要对数据结构EVP_MD有所了解,该EVP_MD结构用于存放 信息摘要算法的信息,摘要引擎则正是通过实现该EVP_MD结构来完成相应的摘要运算的, EVP_MD结构的描述如下typedef struct env_md_st{int type ;int md_size ;int(*init) (EVP_MD_CTX*ctx);int (氺update) (EVP—MD—CTX氺ctx,const void氺data, unsigned longcount);int(*final)(EVP_MD_CTX*ctx, unsigned char*md);int(*cleanup)(EVP_MD_CTX*ctx);
5
int block_size ;int ctx_size ;} EVP_MD ;具体地,对该数据结构中的参数进行解释,如下type——信息摘要算法的NID标识(算法的ID号),用于指明所采用的信息摘要 算法;md_size——信息摘要算法所生成的摘要值长度(单位为字节),若该EVP_MD结构 封装的是SHAl算法,则该字段是SHA1_DIGEST_LENGTH,值为20 ;init——指向信息摘要算法的初始化函数,若该EVP_MD结构封装的是SM3算法, 则指向的是SM3_init ;update——指向计算摘要值的函数,若该EVP_MD结构封装的是MD5算法,则指向 的是 MD5_update ;final——指向在摘要值计算之后所要调用的函数,该函数完成最后一个数据块 的处理工作,若该EVP_MD结构封装的是SHA256算法,则指向的是SHA256_f inal ;block_size——指明进行摘要运算时的数据块的分组长度(单位是字节),若该 EVP_MD结构封装的是SHAl算法,则该字段是SHA1_CBL0CK,值为64 ;ctx_size——指明实现信息摘要算法所需要分配的CTX(上下文)的空间大小,若 该EVP_MD结构封装的是SHA算法,则该字段指的是sizeof (EVP_MD*) +sizeof (SHA_CTX);cleanup——用于做一些清理工作,清除EVP_MD结构。具体地,本发明提供的摘要引擎通过实现引擎绑定接口 bincLengineO及注册在 EVP_MD结构中的初始化接口 init ()、第一摘要接口 update ()、第二摘要接口 final ()、引擎 释放接口 cleanupO来实现现有软件算法库中信息摘要算法的扩展;其中,bincLengine () 用于绑定引擎,initO用于初始化摘要算法,updataO用于对传入的信息摘要数据进行摘 要运算,final ()用于结束摘要运算,并输出摘要值,cleanupO用于清除信息摘要算法的 EVP_MD 结构。本实施例中,摘要引擎通过 PKCS#11 (public key cryptography standards 密码 令牌)接口动态库与连接到主机上的智能密钥设备进行通信,实现将智能密钥设备中的信 息摘要算法添加到现有软件算法库中,调用智能密钥设备中的信息摘要算法来进行数据的 摘要运算。PKCS#11接口动态库由智能密钥设备的开发者提供,所述PKCS#11接口动态库的 内部细节不在本发明所描述的范围之内。参见图1,当引擎绑定接口 bincLengineO被上层应用程序调用时,摘要引擎执行 如下操作步骤101、引擎加载PKCS#11接口动态库;优选地,本步骤通过调用计算机的系统函数IoadlibraryO来完成。其中,PKCS#11接口动态库的文件名是预先约定的。步骤102、引擎获取PKCS#11接口动态库中的函数列表;优选地,本步骤通过调用PKCS#11接口中的C_GetFunctionList()函数来完成。进一步地,本步骤还可以先通过调用计算机系统函数GetProcAddress ()尝试 获取PKCS#11接口中的C_GetFunctionList()函数在PKCS#11接口的入口点,调用C_
6GetFunctionListO函数成功后,就可获得其他PKCS#11接口的入口点,并且能够调用这些 接口获得PKCS#11接口动态库的函数列表;如果尝试失败,则报错返回。具体地,PKCS#11接口动态库的函数列表可以是CK_FUNCTION_LIST_PTR。需要说明的是,获取的函数列表包含PKCS#11接口动态库中函数指针的指针,这 样,引擎在以后的操作中,就可以通过调用获取的函数指针的指针来实现PKCS#11接口动 态库中的函数的调用了,例如,引擎调用PKCS#11接口动态库中的(^Initialize (),就可以 通过调用获取的C_Initialize()指针的指针来实现,等等。步骤103、引擎调用C_Initialize(),初始化PKCS#11接口动态库;需要说明的是,根据PKCS#11接口的规范标准,在进行其他操作之前必须要首先 调用该 C_Initialize()接口。进一步地,在此过程中,还可以包括如下操作引擎创建并启动一个监控线程,用于监控智能密钥设备的插拔事件,以便在后续 的处理中及时作出反应;优选地,监控智能密钥设备的插拔事件(智能密钥设备的插入或拔除)是通过调 用PKCS#11接口动态库中定义的函数C_WaitForSlotEvent()来实现的。需要说明的是监控智能密钥设备的插拔状态是为了能及时告知引擎该智能密 钥设备的当前状态,如果智能密钥设备被拔除,则引擎及时关闭与智能密钥设备的会话,如 果,智能密钥设备被插入,则引擎及时开启与智能密钥设备的会话,以便提高工作效率,同 时,避免了引擎在使用智能密钥设备时临时开启会话,而智能密钥设备是拔除状态,从而造 成错误情况的出现。步骤104、引擎获取当前连接到主机的智能密钥设备句柄;具体地,引擎通过调用PKCS#11接口动态库中定义的函数C_GetSl0tList()来获 取智能密钥密钥设备列表;本实施例中,如果当前存在多个智能密钥设备连接到主机,则选择所述列表中的 第一个智能密钥设备。步骤105、引擎与智能密钥设备建立通信;优选地,引擎与智能密钥设备建立接连是通过调用PKCS#11接口动态库中定义的 函数C_0penSession()来实现的。步骤106、引擎创建一个引擎对象,如engine ;具体地,引擎通过调用ENGINE_neW()来实现;需要说明的是,通过ENGINE_neW()所创建的引擎对象是空的。步骤107、引擎为所创建的引擎对象设置id及名称;具体地,通过注册函数ENGINE_set_id(e, engine_cipher_id),ENGINE_set_ name(e, engine_cipher_name)来实现引擎 id 及名称的设置,例如 ENGI NE_set_ id (engine,”rtl8651b”),ENGINE_set_name (engine,” BSD rtl8651b engine”)。当上层 应用调用至丨J ENGINE_set_id (e, engine_cipher_id), ENGINE_set_name (e, engine_cipher_ name)时,选定相应的引擎。步骤108、获取智能密钥设备的算法列表;具体地,通过调用PKCS# 11接口动态库中定义的C_GetMechani smLi st来获取算法列表。其中,算法列表中包含信息摘要算法属性,如分组长度、摘要值长度等。例如,获取的算法列表是{CKM_SHA_1, {0,0, CKF_DIGEST}}。步骤109、根据所获取的算法列表填充EVP_MD结构,以便供上层应用调用;具体的填充方法是,对所获取的算法列表中的任一摘要算法,根据上层应用的 定义设置对应的算法ID号;根据算法列表中的数值,设置摘要值长度md_size,分组长度 block_Size,并指明实现摘要算法时所需要分配的上下文的空间的大小,及设置initO、 updataO、final ()、cleanup ()接口指针。步骤110、获取摘要算法的EVP_MD结构;具体地,通过调用ENGINE_set_digests来实现;需要说明的是,调用ENGI NE_Set_digeStS设置当前引擎所支持的摘要算法,并得 到摘要算法的EVP_MD结构,从而得到EVP_MD结构中封装的操作接口及摘要算法属性,包 括init操作接口、update操作接口、final操作接口 cleanup操作接口,信息摘要算法的 分组长度、摘要值长度、上下文的空间大小等属性。需要说明的是,引擎默认支持的摘要算法包括MD5和shal步骤111、实现信息摘要算法与引擎的绑定;具体地,通过调用ENGINE_register_digests 来实现,ENGINE_register_digests 将当期引擎所支持的信息摘要算法添加到到上层应用中的算法列表中,与引擎建立关联, 这样,当上层应用使用信息摘要算法时,就可以得到该信息摘要算法的EVP_MD结构及相关 的属性了。需要说明的是,当initO接口、updataO接口、final ()接口被上层应用调用时, 传入的参数一般包括上下文及EVP_MD结构中存放的信息摘要算法的信息,包括信息摘要 算法的分组长度,摘要值长度、信息摘要算法ID等。参见图2、当initO接口被上层应用程序调用时,摘要引擎执行如下操作其中,initO的参数描述如下int (*init) (EVP_MD_CTX*ctx// 上下文);具体地,对EVP_MD_CTX进行简单的说明,如下typedef struct env_md_ctx_st{const EVP_MD氺digest ;ENGINE氺engine ;unsigned long flags ;void*md_data ;}EVP_MD_CTX ;具体地,EVP_MD_CTX结构中参数的介绍如下digest——指向EVP_MD结构的指针;engine——如果算法由引擎提供,该指针指向引擎;md_data——信息摘要数据;
8
具体地,engine由上层应用创建,并在调用bincLengine ()时与算法列表建立关 联,信息摘要数据由具体运算过程决定。步骤201、设置当前使用的信息摘要算法;具体地,根据传入的信息摘要算法ID查找相应的信息摘要算法,如果查找不到, 则将当前使用的信息摘要算法设置为默认的信息摘要算法,如果能够找到,则将当前使用 的信息摘要算法设置为与传入的信息摘要算法类型相对应的信息摘要算法;具体地,信息摘要算法ID是伴随EVP_MD_CTX而传入的,当EVP_MD_CTX结构中的 digest被执行时,就指向了 EVP_MD结构,该结构中的信息摘要算法ID就被传入init()接 口了。步骤202、为EVP_MD_CTX(上下文)分配内存空间;具体地,根据bincLengine ()接口被调用时,设置的上下文空间大小进行内存的 分配。例如,建立一个双向链表,该双向链表用来存储信息摘要数据。步骤203、初始化上下文;具体地,为上下文赋初始值,由具体的运算过程决定。当updataO接口被上层应用程序调用时,传入的参数包括int (^update) (EVP_MD_CTX*ctx,// 上下文const void*data,// 信息摘要数据unsigned long count//迭代运算次数)当updataO接口被上层应用程序调用时,摘要引擎缓存传入的信息摘要数据,并 控制智能密钥设备根据当前设置的信息摘要算法对传入的信息摘要数据进行摘要运算,并 缓存运算结果;需要说明的是,updataO接口被调用时,在该接口中进行不止一次的摘要运算,运 算次数由具体的运算过程所决定。具体地,可以通过调用PKCS#11接口的C_DigeStUpdate函数来完成摘要运算。当final ()接口被上层应用程序调用时,传入的参数包括int (*final) (EVP_MD_CTX*ctx,// 上下文unsigned char氺md//摘要输出数据)当final ()接口被上层应用程序调用时,摘要引擎控制智能密钥设备结束摘要运 算,并将运算结果输出,具体地,通过md字段将结果输出;具体地,可以通过调用PKCS#11接口的C_DigestFinal函数来完成摘要运算。当finalO接口调用结束后,cleaupO接口将被调用,用于清理环境;当cleaupO接口被上层应用程序调用时,通过PKCS#11接口 C_CloseSession关 闭与智能密钥设备的通信;清除摘要引擎所占用的应用资源,结束对摘要引擎的使用。类似地,摘要引擎中也可以通过加密服务程序CSP (CryptographicService Provider)接口与智能密钥设备进行通信。例如,通过CSP接口的CryptAcquireContext与智能密钥设备建立连接;通过CSP接口的CryptGetProvParam取得智能密钥设备的算法列表;
9
通过CSP接口的cryptGreateHash设置智能密钥设备当前所使用的算法;通过CSP接口的CrypthashData对传入的数据进行摘要运算;通过CSP接口的CryptGetHashParam输出摘要运算的结果;通过CSP 接口的 CryptReleaseContext 清理环境;具体流程与通过PKCS#11接口进行通信时的流程相似,此处就不再赘述。这样,通过摘要引擎实现上述操作后,就可以将一些硬件摘要算法,尤其是一些未 公开的,只能用硬件实现的摘要算法添加扩展到软件算法库中了。以上所述,仅为本发明较佳的具体实施方式
,但本发明的保护范围并不局限于此, 任何熟悉本技术领域的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换, 都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围 为准。
10
权利要求
一种摘要引擎的实现方法,上层应用通过调用所述摘要引擎的引擎绑定接口、初始化接口、第一摘要接口、第二摘要接口、引擎释放接口来实现,其特征在于,所述方法包括引擎绑定接口被上层应用调用时,摘要引擎与智能密钥设备建立连接,获取所述智能密钥设备的算法列表,并填充第一数据结构,将所述第一数据结构登记到所述上层应用中;初始化接口被上层应用调用时,所述摘要引擎根据传入的所述第一数据结构设置所述智能密钥设备当前所使用的信息摘要算法,并为传入的上下文分配存储空间,及初始化所述上下文;第一摘要接口被上层应用调用时,所述摘要引擎根据当前设置的信息摘要算法,控制所述智能密钥设备对传入的信息摘要数据进行摘要运算;第二摘要接口被上层应用调用时,所述摘要引擎控制所述智能密钥设备结束摘要运算,并输出运算结果;引擎释放接口被上层应用程序调用时,所述摘要引擎结束与所述智能密钥设备的连接。
2.根据权利要求1所述的方法,其特征在于,所述引擎绑定接口、初始化接口、第一摘 要接口、第二摘要接口、引擎释放接口具体为bind_engine接口、init接口、update接口、 final ^ Π、cleanup ^ Π。
3.根据权利要求1所述的方法,其特征在于,所述摘要引擎通过硬件加密接口与所述 智能密钥设备建立连接。
4.根据权利要求2所述的方法,其特征在于,所述硬件加密接口包括密码令牌接口和 密码服务程序接口。
5.根据权利要求1所述的方法,其特征在于,所述第一数据具体为EVP_MD结构。
6.根据权利要求5所述的方法,其特征在于,所述填充第一数据结构具体为根据初始 化接口、数据摘要接口、摘要输出接口、引擎释放接口的指针及所述获取的算法列表来填充 第一数据结构。
7.根据权利要求6所述的方法,其特征在于,所述根据初始化接口、数据摘要接口、摘 要输出接口、引擎释放接口的指针及所述获取的算法列表来填充第一数据结构具体为根据上层应用中已有的定义,在所述第一数据结构中为所述算法列表中的信息摘要算 法设置对应的算法ID号;根据所述算法列表中的数值,在所述第一数据结构中为信息摘要算法的分组长度、摘 要值长度设置对应的数值,并为信息摘要算法所需要的上下文空间大小设置对应的数值, 为所述初始化接口、第一摘要接口、第二摘要接口、引擎释放接口设置对应的接口指针。
8.根据权利要求1所述的方法,其特征在于,所述摘要引擎根据传入的所述第一数据 结构设置所述智能密钥设备当前所使用的信息摘要算法具体为所述初始化接口被上层应用调用时,将所述填充后的第一数据结构传入所述摘要引擎;所述摘要引擎根据所述传入的第一数据结构中的信息摘要算法ID查找对应的信息摘 要算法,如果查找不到,就将当前的信息摘要算法设置为默认的信息摘要算法,如果能够查 找到,则将当前的信息摘要算法设置为与所述传入的信息摘要算法ID相对应的信息摘要算法。
9.根据权利要求1至8所述的方法,其特征在于,所述摘要引擎通过所述硬件加密接口 与所述智能密钥设备进行通信。
全文摘要
本发明公开了一种摘要引擎的实现方法,属于信息安全领域。方法包括引擎绑定接口被调用时,摘要引擎与智能密钥设备建立连接,获取智能密钥设备的算法列表,并填充第一数据结构,将第一数据结构登记到上层应用中;初始化接口被调用时,摘要引擎根据传入的第一数据结构设置智能密钥设备当前所使用的信息摘要算法,并为传入的上下文分配存储空间,及初始化所述上下文;第一摘要接口被调用时,摘要引擎根据当前设置的信息摘要算法,控制智能密钥设备对传入的信息摘要数据进行摘要运算;第二摘要接口被调用时,摘要引擎控制智能密钥设备结束摘要运算,并输出运算结果;引擎释放接口被调用时,摘要引擎结束与智能密钥设备的连接。
文档编号H04L9/32GK101908963SQ20101024845
公开日2010年12月8日 申请日期2010年8月9日 优先权日2010年8月9日
发明者于华章, 陆舟 申请人:北京飞天诚信科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1