SSL探03
本文探讨了Openssl的Engine机械.Openssl硬件引擎(Engine)可以使用户比較easy地将自己的硬件增加到openssl中去,替换其提供的软件算法.
ENGINE 是 OPENSSL 预留的用以载入第三方加密库引擎,主要包含了动态库载入的代码和加密函数指针管理的一系列接口.如果要使用 Engine(如果你已经载入上
该 Engine 了 ) , 那 么 首 先 要 加 载 该Engine(比方 ENGINE_load_XXXX),然后选择要使用的算法或者使用支持的全部加密算法。这样你的应用程序在调用加解密算法时,它就会指向你载入的动态库里的加解密算法,而不是原先的
OPENSSL的 库里的加解密算法.
使用Engine的基本流程:
①//Engine_load_xxxx();
初始化Engine对象,对engine的属性及方法进行设置(自己实现的算法),将engine载入到系统中,
②//e =Engine_by_id("ID_ali");
获取engine
③选择使用哪些算法
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传入方法就可以.
EVP_EncryptInit_ex(ctx,ciper,e,key,iv);
这样便使用engine中的算法替换掉了SSL的自带算法.
说明:
a.ENGINE_load_hwcipher();这种方法进行Engine的初始化.
void ENGINE_load_hwcipher() {
ENGINE *e_hw = engine_hwcipher();
if (!e_hw)
return;
ENGINE_add(e_hw);
ENGINE_free(e_hw);
ERR_clear_error();
}
当中又调用engine_hwcipher()
static ENGINE *engine_hwcipher(void) {
ENGINE *ret = ENGINE_new();
if (!ret)
return NULL;
if (!bind_helper(ret)) {
ENGINE_free(ret);
return NULL;
}
return ret;
}
engine_hwcipher()中调用bind_helper(ENGINE *e);来看看bind_helper(ENGINE *e)的实现
static int bind_helper(ENGINE *e) {
int ret; ret = ENGINE_set_id(e, engine_hw_id);
if (ret != 1) {
printf("ENGINE_set_id failed\n");
return 0;
}
ret = ENGINE_set_name(e, engine_hw_name);
if (ret != 1) {
printf("ENGINE_set_name failed\n");
return 0;
}
ret = ENGINE_set_RSA(e, &hw_rsa);
if (ret != 1) {
printf("ENGINE_set_RSA failed\n");
return 0;
}
ret = ENGINE_set_RAND(e, &hw_rand);
if (ret != 1) {
printf("ENGINE_set_RAND failed\n");
return 0;
}
ret = ENGINE_set_destroy_function(e, hw_destroy);
if (ret != 1) {
printf("ENGINE_set_destroy_function failed\n");
return 0;
}
ret = ENGINE_set_init_function(e, hw_init);
if (ret != 1) {
printf("ENGINE_set_init_function failed\n");
return 0;
}
ret = ENGINE_set_finish_function(e, hw_finish);
if (ret != 1) {
printf("ENGINE_set_finish_function failed\n");
return 0;
}
ret = ENGINE_set_ctrl_function(e, hw_ctrl);
if (ret != 1) {
printf("ENGINE_set_ctrl_function failed\n");
return 0;
}
ret = ENGINE_set_load_privkey_function(e, hw_load_privkey);
if (ret != 1) {
printf("ENGINE_set_load_privkey_function failed\n");
return 0;
}
ret = ENGINE_set_load_pubkey_function(e, hw_load_pubkey);
if (ret != 1) {
printf("ENGINE_set_load_pubkey_function failed\n");
return 0;
}
ret = ENGINE_set_cmd_defns(e, hw_cmd_defns);
if (ret != 1) {
printf("ENGINE_set_cmd_defns failed\n");
return 0;
}
ret = ENGINE_set_ciphers(e, hw_ciphers);
if (ret != 1) {
printf("ENGINE_set_ciphers failed\n");
return 0;
}
ret = ENGINE_set_digests(e, hw_md);
if (ret != 1) {
printf("ENGINE_set_digests failed\n");
return 0;
}
return 1;
}
bind_helper(ENGINE *e)方法中对engine结构体中的属性及方法进行设置,自己实现各种加解密算法.
b.至此,engine的初始化工作完毕,然后 e = ENGINE_by_id("ID_hw");获取自己须要的engine.
c.选择要使用的算法.ENGINE_set_default(ENGINE *e, int Flag)
c.将engine传入加解密调用函数就可以. EVP_EncryptInit_ex(&ciph_ctx, cipher, e, key, iv);
这样便实现了使用自己定义算法替换openssl中默认算法.具体的代码可參考OpenSSL 源码中的 Demos/Engines
版权声明:本文博主原创文章。博客,未经同意不得转载。
SSL探03的更多相关文章
- POP3_使用SSL链接邮箱并获取邮件
Gmail目前已经启用了POP3和SMTP服务,与其他邮箱不同的是Gmail提供的POP3和SMTP是使用安全套接字层SSL的,因此常规的JavaMail程序是无法收发邮件的,下面是使用JavaMai ...
- Linux性能监控之Memory篇
首先说说虚拟内存和物理内存: 虚拟内存就是采用硬盘来对物理内存进行扩展,将暂时不用的内存页写到硬盘上而腾出更多的物理内存让有需要的进程来用.当这些内存页需要用的时候在从硬盘读回内存.这一切对于用户来说 ...
- Memcached 分布式缓存系统部署与调试
Memcache 分布式缓存系统部署与调试 工作机制:通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的;目前主要用来缓存数据库的数据;存放在内存的数据通过LRU算法 ...
- 安装Jenkins服务
1.下载Jenkins 下载地址:https://jenkins.io/download/ 选择rpm包 2.启动服务 [root@node1 ~]# rpm -ivh jenkins-2.138.3 ...
- Kubernetes 企业级集群部署方式
一.Kubernetes介绍与特性 1.1.kubernetes是什么 官方网站:http://www.kubernetes.io • Kubernetes是Google在2014年开源的一个容器集群 ...
- Django使用Redis进行缓存详细最全流程
背景和意义服务器数据非经常更新.若每次都从硬盘读取一次,浪费服务器资源.拖慢响应速度.而且数据更新频率较高,服务器负担比较大.若保存到数据库,还需要额外建立一张对应的表存储数据.在Django中建立表 ...
- start-stop-daemon: matching on world-writable pidfile /var/run/redis/redis-server.pid is insecurefailed
Microsoft Store上 看到最新的Ubuntu 20.04 LTS 已经适配到WSL上了, 于是卸载了老版本 18.04 LTS,安装上了最新版本的. 第一次启动会比较慢,需耐心等待 Ins ...
- 【CAS单点登录视频教程】 第03集 -- 配置 tomcat的 ssl
目录 ----------------------------------------- [CAS单点登录视频教程] 第06集[完] -- Cas认证 学习 票据认证FormsAuthenticati ...
- Wed Nov 01 13:03:16 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended.
报错:Wed Nov 01 13:03:16 CST 2017 WARN: Establishing SSL connection without server's identity verifica ...
随机推荐
- 具体解释java定时任务
在我们编程过程中假设须要运行一些简单的定时任务,无须做复杂的控制.我们能够考虑使用JDK中的Timer定时任务来实现. 以下LZ就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器 ...
- JavaScript中的对象(一)
Email:longsu2010 at yeah dot net 最近我和朋友谈起JavaScript中对象的问题.朋友以写JavaScript为生,而且生活的很好,然而我发现他并不真正懂这们语言的某 ...
- linux开机启动服务和chkconfig使用方法(转)
每个被chkconfig 管理的服务需要在对应的/etc/rc.d/init.d 下的脚本加上两行或者更多行的注释. 第一行告诉 chkconfig 缺省启动的运行级以及启动和停止的优先级.如果某服务 ...
- Android模拟器设置竖屏
使用Android模拟器測试自己开发的程序时,有时候会发现屏幕为横屏显示,查看效果非常不方便. 这里记录了一种禁止横屏的方法. 在文件 Mainfest.xml 中,在须要禁止横屏的 activit ...
- [cocos2dx-lua]"Hello Lua"分析
一年之前学的cocos2dx,那时候还是用C++编写的.但学完之后就找的一个新的方向--Unity3D开发的岗位,对我而言是一个新方向,那时候经过了几个月的每天熬夜奋战,从"0"基 ...
- c++多态的案例分析
近期在研究c++中多态的应用 ,当中遇到些许的疑问与问题,可是终于的结果是不容置疑的,以下记录下我的学习过程,以纪念本个知识点. 首先,是从一个案例開始的,题目大意是这种: 设定一个多边形的公共类,然 ...
- linux下查看进城(ps)的方法 与 杀死进程(kill)的N种方法
PS查看进程 inux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必 ...
- 国内云存储对比: 阿里云、腾讯云、Ucloud、首都在线
阿里云的数据存储<http://www.aliyun.com/product/rds/> RDS — 关系型数据库服务(Relational Database Service,简称RDS) ...
- shufe前辈名师
前辈名师 姓名 现职/原职 郭秉文 中国现代大学之父.国立东南大学校长.哥伦比亚大学教育学博士,该校第一任校长.为了纪念郭秉文先生,勉励优秀学子,郭夏瑜女士在上海财经大学等校设立了“郭秉文奖学金” 马 ...
- pcie inbound、outbound及EP、RC间的互相訪问
Inbound:PCI域訪问存储器域 Outbound:存储器域訪问PCI域 RC訪问EP: RC存储器域->outbound->RC PCI域->EP PCI域->inbou ...