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 ...
随机推荐
- 从尾到头打印链表--《剑指offer》
题目:非常easy,就是题目,将链表从尾到头打印出来. 可能我们首先想到的是将链表进行遍历,将之前的訪问的数据进行保存,最后进行反向输出,但是保存数据的空间是个问题:或者是我们将整个链表进行反向操作, ...
- Codeforces 61E Enemy is weak 乞讨i<j<k && a[i]>a[j]>a[k] 对数的 树阵
主题链接:点击打开链接 意大利正在寻求称号 i<j<k && a[i]>a[j]>a[k] 的对数 假设仅仅有2元组那就是求逆序数的做法 三元组的话就用一个树状 ...
- SQL Server Compact免安装部署
原文:SQL Server Compact免安装部署 情况 应用程序中的EF使用了SQL Server Compact,打包部署到客户机器上后提示数据库连接异常,信息类似”配置节“.”Provider ...
- 在内网架设一个可供外网登录的ftpserver
ftpserver是使用比較寻常的server,可是IP资源是有限的.那么怎么让内网的server給外网的用户提供服务了? 首先须要找一个FTPserver程序,我在这边使用pure-ftpd-mys ...
- 原声JS瀑布流加延迟载入
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- adt-bundle-windows-x86_32-20140702
adt-bundle-windows-x86_32-20140702 Windows > Preference,在Android里没有NDK选项 法一:help->install new ...
- Thread Dump 和Java应用诊断(转)
Thread Dump 和Java应用诊断 Thread Dump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的thread-dump的能力.虽然各 ...
- 动态接口服务 webservice
private void GetDll() { WebClient client = new WebClient(); string url = "http://xxxx/services/ ...
- java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor An ExecutorService that executes each submitted task using o ...
- 同时显示多个 Notification
主要出在PendingIntent.getActivity();的第二个参数,API文档里虽然说是未被使用的参数(给出的例子也直接写0的),实际上是通过该参数来区别不同的Intent的,如果id相同, ...