OPENSSL ENGINE机制

1.  概念

OpenSSL项目是一个开放源代码安全项目,它的目标是开发一个健壮的、商业级的、完整的开放源代码的工具包,用强大的加密算法来实现安全的Socket层(Secure Sockets LayerSSL v2/v3)和传输层的安全性(Transport Layer SecurityTLS v1)。它包含了完整的加密算法,数字签名算法及证书算法等。可以很好地保证数据的完整,保密和正确性。OpenSSL可以和于商业用途,但是使用者应该考虑自己所使用的算法有没有受到本国专利的限制以及考虑是否符合国家制定的标准。

Engine机制 Engine机制的出现是在OpenSSL0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本分开的,到了OpenSSL0.9.7版,Engine机制集成到了OpenSSL的内核中,成为了OpenSSL不可缺少的一部分。

Engine机制目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。OpenSSLEngine机制成功地达到了这个目的,这使得OpenSSL已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加密设备更OpenSSL协调工作,需要写少量的接口代码,但是这样的工作量并不大,虽然还是需要一点密码学的知识。Engine机制的功能跟Windows提供的CSP功能目标是基本相同的。

目前,OpenSSL0.9.7版本支持的内嵌第三方加密设备有8种,包括:CryptoSwiftnCipherAtallaNuronUBSECAepSureWare以及IBM 4758 CCA的硬件加密设备。现在还出现了支持PKCS#11接口的Engine接口,支持微软CryptoAPI的接口也有人进行开发。当然,所有上述Engine接口支持不一定很全面,比如,可能支持其中一两种公开密钥算法。表1OpenSSL-0.9.7版本支持的硬件及其对应的简要描述名称,这个简要描述名称在很多时候是要使用的,如编程或执行命令的时候,简要密钥名称是大小写敏感的,目前一般都是采用小写字符。

OpenSSL支持的Engine接口

简要名称

Engine接口描述

dynamic

动态加载Engine设备的接口

cswift

CryptoSwift的硬件加密设备Engine支持

chil

nChipher硬件加密设备Engine支持

atalla

Atalla硬件加密设备Engine支持

nuron

Nuron硬件加密设备Engine支持

ubsec

UBSEC硬件加密设备Engine支持

aep

Aep硬件加密设备Engine支持

sureware

SureWare硬件加密设备Engine支持

4758cca

IBM 4758 CCA硬件加密设备Engine支持

2.  实现

ENGINEOPENSSL预留的用以加载第三方加密库引擎,主要包括了动态库加载的代码和加密函数指针管理的一系列接口。如果要使用Engine(假设你已经加载上该Engine了),那么首先要加载该Engine(比如ENGINE_load_XXXX),然后选择要使用的算法或者使用支持的所有加密算法(有相关函数)。这样你的应用程序在调用加解密算法时,它就会指向你加载的动态库里的加解密算法,而不是原先的OPENSSL的库里的加解密算法。

上面提到的一些engine的实现在 openssl/crypto/engine/目录下可以找到,来分析一下具体的实现:

首先,每一个ENGINE_load_XXXX其实就是一个Engine的加载过程:

如:

void

ENGINE_load_rtl8651b(void)

{

        ENGINE *engine = ENGINE_new();

        if (engine == NULL)

                return;

        if (!ENGINE_set_id(engine, "rtl8651b") ||

            !ENGINE_set_name(engine, "BSD rtl8651b engine") ||

            !ENGINE_set_ciphers(engine, rtl8651b_engine_ciphers)||

            !ENGINE_set_digests(engine, rtl8651b_engine_digests)||

            !ENGINE_set_ctrl_function(engine, rtl8651b_ctrl) ||

            !ENGINE_set_cmd_defns(engine, rtl8651b_defns)

          ){

                ENGINE_free(engine);

                return;

        }

        if(!ENGINE_set_default(engine, ENGINE_METHOD_DIGESTS) )

        ENGINE_add(engine);

        ENGINE_free(engine);

        ERR_clear_error();

}

类似ENGINE_set_xxxx的函数是对engine机制各个方面的设定注册,有下面这些:

int ENGINE_set_id(ENGINE *e, const char *id);

int ENGINE_set_name(ENGINE *e, const char *name);

int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth);

int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth);

int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth);

int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth);

int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f);

int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f);

int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f);

int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f);

int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f);

int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f);

int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f);

int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f);

int ENGINE_set_flags(ENGINE *e, int flags);

int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns);

由此可知,具体的(RSADSADHRANDCHIPHERSDIGESTS)算法实现主要是这些函数实现的。

DIGESTS为例:首先要声明一个对应的数据结构(MD5):

const EVP_MD rtl8651b_hash_md5={

        NID_md5,

        NID_md5WithRSAEncryption,

        MD5_DIGEST_LENGTH,

        NULL,

        rtl8651b_digest_init,

        rtl8651b_digest_update,

        rtl8651b_digest_final,

        NULL,  

        NULL,

        EVP_PKEY_RSA_method,

        MD5_CBLOCK,

        sizeof(RTL_DIGEST_CTX)/* how big does the ctx->md_data need to be */

        };

具体的各项的含义,请参考EVP_MD数据结构。

这里rtl8651b_digest_init, rtl8651b_digest_update, rtl8651b_digest_final,就是具体的算法实现。

如果都完成了,则可以调用动态库中的ENGINE_load_XXXX(例子中是ENGINE_load_ rtl8651b)ENGINE对象加载到系统中即在ENGINE对象和DIGESTS的结构里的ENGINE对象建立了一个关联使用这种方法使ENGINE能够智能的判断是使用自定义的加解密算法还是使用默认的加解密算法。

ENGINE_load_ rtl8651b中,我们可以使用下面的方法来使用你所定义的算法。

ENGINE_set_default(ENGINE *e, int Flag)

其中Flag的说明如下:

ENGINE_METHOD_ALL 使用所有存在的算法(默认)

ENGINE_METHOD_RSA 仅使用RSA算法

ENGINE_METHOD_DSA 仅使用DSA算法

ENGINE_METHOD_DH 仅使用DH算法

ENGINE_METHOD_RAND 仅使用随机数算法

ENGINE_METHOD_CIPHERS 仅使用对称加解密算法

ENGINE_METHOD_DIGESTS 仅使用摘要算法

ENGINE_set_default(engine, ENGINE_METHOD_DIGESTS)

上面给出使用ENGINE有效替换OPENSSL中现有的所有的加密算法,使用这个特性也可以很好的加入一些OPENSSL中所没有的加解密算法,这使开发加解密算法的应用程序更加简便,相对于传统的开发方法是一个有效稳妥的方法。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mongoDB的副本机制

主机192.168.99.80[rootmaster ~]# grep -v "^#" /etc/mongod.conf | grep -v "^$" bind_ip 192.168.99.80 fork true pidfilepath /var/run/mongodb/mongod.pid logpath /var/log/mongodb/mongod.log unixSocketPrefix /var/run/mongodb dbpath /mo…

文件系统一些概念【更新完毕】

煮酒品茶:文章大多摘自《分布式文件系统研究》《构建高性能WEB站点》《大型网站技术架构》文件系统是操作系统的一个重要组成部分,通过对操作系统所管理的存储空间的抽象,向用户提供统一的、对象化的访问接口,屏蔽对物理设备的直接…

.NET下如何拦截鼠标、键盘消息?Win32NET来帮你

Win32NET是一个Win32API的.NET下封装的类库,包含:1: 常用win32的API的net封装2:鼠标、键盘、热键hook钩子模块,3:模拟键盘输入文字(支持各种字符文字、不同语言的文字)、模拟鼠标点击移动滚动等…

linux之如何快速在文本里面写入内容

一、创建文件 touch file 二、写入内容 echo "hello word">>file 图片举例 还有 echo "hello">file 是把之前的内容覆盖,然后内容只有hello 如图: 最后: 无论是echo "hello">file 还是 echo&quo…

css实战手册第四版 pdf_你真的了解CSS继承吗?看完必跪

也许你瞧不起以前的 css ,但是你不该再轻视眼下的 css 。近年来 css 的变量系统已逐步得到各大浏览器厂商支持,自定义选择器等强势袭来,嵌套系统/模块系统也在路上...为了更好的掌握 css 这门语言,很有必要把之前零零散散的 css 知…

hibernate级联操作详解

2019独角兽企业重金招聘Python工程师标准>>> 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) l Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade: none,all,save-update,delete, lock,ref…

Oracle数据库的备份与恢复

Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP)、热备份和冷备份。导出备件是一种逻辑备份,冷备份和热备份是物理备份。一、 导出/导入(Export/Import)…

关于Windows® API Code Pack for Microsoft® .NET Framework

相比之前的操作系统,Window 7(or Vista)提供了很多新特性,我们在应用实现中可以利用这些特性来提升用户体验。 这些特性主要包括以下几个方面: Shell EnhancementsDirectX TechnologiesApplication Restart and Recove…

出门就背他了!可伸缩的背包,自由变大变小,还有防盗功能!

▲ 点击查看出门能不背包就不背包,几乎是小爆身边每个男生的人生信条。不背包时,两手空空一身轻,潇洒有型。但一旦到了必须背包,比如五一外出回家或旅游的时候,男同胞们翻箱倒柜找出来的背包,大多都是这种双…

C#实现网页加载后将页面截取成长图片 | Playwright版

前言如何将网页生成预览图?要实现这个功能,可以用WebBrowser组件模拟浏览器,或者使用系统浏览器访问网页,再进行截图操作。但是,这样需要编写大量的控制代码。工欲善其事,必先利其器!利用Playwr…

Android安全与逆向之Dex动态加载

Dex动态加载是为了解决什么问题? 在Android系统中,一个App的所有代码都在一个Dex文件里面。 Dex是一个类似Jar的存储了多个Java编译字节码的归档文件。 因为Android系统使用Dalvik虚拟机,所以需要把使用Java Comp…

python链接mysql报错2003_Python连接Mysql报错问题解决

import MySQLdb #打开数据库 db MySQLdb.connect("127.0.0.1","root","123456","testdb",3306) #使用corsor()方法获取操作游标 cursor db.cursor() #使用execute方法执行SQL语句 cursor.execute("SELECT VERSION()") #使…

死锁示例代码

死锁产生实例&#xff0c;两个线程两个互斥锁&#xff0c;每个线程占有一个互斥锁&#xff0c;同时想获得另一个互斥锁则会产生死锁。解决方案&#xff1a;  1.一次占有全部资源  2.每个线程占有锁的顺序是一致的。比如都是同时占有A&#xff0c;然后占有B锁。#include <…

从服务器上的数据库备份到本地

可以直接在数据库进行操作&#xff1a;把需要备份的数据库选择生成脚本。生成脚本有一个高级选项&#xff0c;可以设置数据库架构跟数据。然后在本地新建一个跟备份数据库一样的数据库名称&#xff0c;进行运行脚本。就可以了。如果不新建一个数据库。就会报错。转载于:https:/…

Android之在ubuntu上用aapt查看apk的名字以及相关信息

第一步:如何快速找把手机里面的apk文件本地 如果我们不知道apk的包名,我们先打开需要的apk,然后再打开终端,输入下面命令获取这个apk的包名 adb shell dumpsys activity 查看当前apk的包名,有了包名,然后我们可以快快速获取apk,参照我的另外一篇博客 http://blog.csdn.n…

nodejs项目_多人群聊实现其实很简单:Nodejs+WebSocket+Vue轻松实现Web IM

点击右上方红色按钮关注“web秀”&#xff0c;让你真正秀起来前言在《Nodejs WebSocket简单介绍及示例 - 第一章》中简单的介绍了&#xff0c;Nodejs WebSocket的使用方法及作用&#xff0c;今天就用它来搭建一个简单的聊天室功能。1、NodejsWebSocket创建后台服务器功能 2、…

支付宝 .NET SDK 报错:RSA签名遭遇异常,请检查私钥格式是否正确。

AlipaySDKNet 是 .NET 平台下用于对接支付宝支付的官方 SDK。Alipay SDK for .NET 让您不用复杂编程即可访问支付宝开放平台开放的各项能力&#xff0c;SDK可以自动帮您满足能力调用过程中所需的证书校验、加签、验签、发送HTTP请求等非功能性要求。其 Nuget 链接如下&#xff…

交友软件上的两种网友类型......

1 轻轻松松月入五千的方法&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 像极了期末复习的你&#xff08;via.段子楼&#xff0c;侵删&#xff09;▼3 听说你想要中国的熊猫▼4 听说学校附近有野人出没&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼5…

meta标签的作用

meta标签共有两个属性&#xff0c;它们分别是http-equiv属性和name属性&#xff0c;不同的属性又有不同的参数值&#xff0c;这些不同的参数值就实现了不同的网页功能。 一.http-equiv属性 定义和用法&#xff1a;把 content 属性连接到 HTTP 头部&#xff0c;它可以向浏览器传…