`
totoxian
  • 浏览: 1095866 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

openssl的互斥回调机制

 
阅读更多

很不幸,openssl的底层实现不是线程安全的,虽然我可以通过我自己实现的锁来安全的在不同的线程中使用同一个 ssl连接,也就是一个ssl指针可以在多个线程中共用,但是我们能看到的最底层也就是这个SSL类型的指针了,这也是我们可以保护的最底层了,再往下的 层次中该如何实现线程互斥呢?大致看了一下openssl的代码,发现在底层加密的时候用到了很多的共享的数据结构或者共享变量,如此一来,虽然比较上层 的SSL指针可以很好的被保护,但是一旦两个线程同时读写而同时调用加密解密函数的话会很显然的用到那些共享变量和共享数据结构,如此一来就很容易出错, 比如我遇到的就是本来要SSL_read出100个字节的数据,可是可能由于SSL_write此时修改了数据结构,我的程序异常崩溃,分析dmp文件发 现是由于s3_read_bytes中将读取数据的长度填充成了0xedffffff,危险啊!
可是怎么解决这个问题呢?总要有解决的办法啊,是的,有办法,openssl提供了几个接口函数用于设置一些回调函数,在openssl本身它也自带了一 个,在th-lock.c中实现。这两个接口函数是:void CRYPTO_set_locking_callback(void (*func)(int mode,int type, const char *file,int line))设置加锁解锁回调函数;void CRYPTO_set_id_callback(unsigned long (*func)(void))设置得到线程id回调函数。其中我觉得第一个非常有创意,将如何加锁和解锁留给用户自己去实现,这就在库的底层将机制和用户 的策略分离中出来,并且底层可以保持一份平台无关的加密和解密代码,各个不同的操作系统平台可以提供自己实现的加锁和解锁回调函数,并且如果用户只是跑单 线程,那么加锁和解锁会带来很大不必要的开销,于是对共享数据的保护就成了可选的选择了,总之,策略不会污染机制,一切分得很清!对于上面的接口设置的回 调函数,在windows平台就是:
void win32_locking_callback(int mode, int type, char *file, int line)
{
if (mode & CRYPTO_LOCK)
{
WaitForSingleObject(lock_cs[type],INFINITE); //lock_cs是一个数组,数量为潜在的共享数据的数量,由CRYPTO_num_locks得到
}
else
{
ReleaseMutex(lock_cs[type]);
}
}
在linux平台上普通话pthread相应的回调函数就是:
void pthreads_locking_callback(int mode, int type, char *file, int line)
{
if (mode & CRYPTO_LOCK)
{
pthread_mutex_lock(&(lock_cs[type]));
lock_count[type]++;
}
else
{
pthread_mutex_unlock(&(lock_cs[type]));
}
}
不 能不说这一切很简单又很美,叹为观止!openssl默认不实现线程安全,就是说它默认不会付出可能用户根本就无意付出的代价,你的程序,由你自己掌控。 最终openssl的加密解密底层非常美观,非常平台无关化,因此非常简洁,如果不这么实现,那么本来就很复杂的加密解密算法加上平台相关的if- then-else(或者switch-case)的判断,然后再加锁解锁,让人一声叹息后发誓再也不读openssl了,无疑是雪上加霜。我们需要学习 的不是这里的代码本身,而是这种架构的思想,机制和策略分离,灵活性就可以由用户自己掌控。机制就是回调函数的调用路径或者说是调用堆栈或者说在一些情况 下激活回调函数,具体回调函数如何实现就是用户的策略,用户负责实现回调函数。一切看起来很美,实际上也是。

分享到:
评论

相关推荐

    OPENSSL_ENGINE机制

    OPENSSL_ENGINE机制 OPENSSL_ENGINE机制是OPENSSL项目中的一个重要组件,其目的是提供一个通用的加密接口,使得OPENSSL能够与第三方提供的软件加密库或者硬件加密设备进行加密。 Engine机制的出现是在OPENSSL的...

    微信企业号回调实例.zip

    首先,我们要理解的是微信企业号回调机制。微信企业号允许第三方应用接收并处理来自微信的特定事件,如用户交互、消息推送等。当微信服务器接收到这些事件后,会向预先配置的回调URL发送请求,这就是回调模式。为了...

    openssl和openssl-devel离线rpm安装包.zip_OPENSSL 库_openssl_openssl-deve

    `openssl-devel` 是OpenSSL的开发库,包含了头文件和静态链接库,用于编译和链接到OpenSSL功能的应用程序。开发人员在编写需要使用OpenSSL的软件时,需要安装这个包,以便在编译时可以正确地引用OpenSSL的函数和结构...

    openssl编程.pdf

    书中介绍了如何定义和使用回调函数,以及它们在openssl内部的实现机制,帮助读者更好地理解和应用openssl的高级特性。 ### openssl堆栈与哈希表 堆栈与哈希表是openssl中重要的数据结构,用于管理和存储各种类型的...

    Openssl Engine pkcs11 示例程序

    从OpenSSL的0.9.7版,Engine机制集成到了OpenSSL的内核中,成为了OpenSSL不可缺少的一部分。 Engine机制目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。OpenSSL的Engine机制...

    openssl-1.0.2u + openssl-1.0.2k

    标题中的"openssl-1.0.2u + openssl-1.0.2k"指的是OpenSSL库的两个不同版本,1.0.2u和1.0.2k。OpenSSL是一个开源项目,提供安全套接层(SSL)和传输层安全(TLS)协议的实现,用于加密通信,确保网络数据传输的安全...

    openssl源码分析

    1.4 回调函数:OpenSSL提供回调函数机制,使得开发者可以自定义某些操作,例如证书验证、随机数生成等。 第二章,OpenSSL简介,包括了以下内容: 2.1 OpenSSL简介:阐述了OpenSSL项目的目的、组成以及它在网络安全...

    openssl-1.0.0.tar.gz~~openssl-3.3.1.tar.gz.zip

    不同版本的OpenSSL压缩包: openssl-1.0.0.tar.gz openssl-1.0.1.tar.gz openssl-1.0.2.tar.gz openssl-1.1.0.tar.gz openssl-1.1.1.tar.gz openssl-3.0.14.tar.gz openssl-3.1.6.tar.gz openssl-3.2.2.tar.gz ...

    openssl-win32工具 win32OpenSSL

    用openSSL工具生成密钥使用说明: 安装后进入OpenSSL工具,输入如下命令: • Linux用户(以Ubuntu为例): $ openssl 进入OpenSSL程序 OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥 OpenSSL> pkcs8 -...

    openssl-1.0.2k

    **OpenSSL库详解** ...总之,OpenSSL是网络安全的基石,它的源代码分析和编译是理解底层加密机制和提升系统安全性的关键步骤。对于IT专业人士来说,熟悉并掌握OpenSSL的使用和维护是必备技能之一。

    centosopenssl-1.1.1u+openssl-1.1.1vopenssl1.1.1u+openssl1.1.1v

    centos7 最新版本的openssl rpm安装包 openssl-1.1.1u-1.el7.x86_64.rpm openssl-debuginfo-1.1.1u-1.el7.x86_64.rpm openssl-devel-1.1.1u-1.el7.x86_64.rpm openssl-1.1.1v-1.el7.x86_64.rpm openssl-debuginfo-...

    安装openssl和openssl-develd 的依赖包

    这里我们关注的是“openssl”和“openssl-devel”这两个关键组件,它们是实现安全套接字层(SSL)和传输层安全(TLS)协议的基础。SSL/TLS协议用于加密网络通信,确保数据在传输过程中不被窃取或篡改。 **openssl**...

    OpenSSL-for-iPhone-master.zip_OpenSSL-for-iPhone_openssl_openssl

    OpenSSL 是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现库,同时也包含各种加密算法、证书处理和其他安全功能。在iOS开发中,如果你的应用需要进行安全的网络通信,如HTTPS,或者需要对数据进行加密解密...

    OpenSSL3.0.12

    5. 恢复机制:OpenSSL 包含了错误恢复机制,使得在遇到错误时系统能够更优雅地处理,而不是突然崩溃。这种增强的错误处理能力对于维持服务连续性至关重要。 6. 支持多平台:OpenSSL 3.0.12 适用于多种操作系统,如 ...

    openssl 1.1.1g 安装包

    **OpenSSL 1.1.1g 安装详解** OpenSSL 是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现库,它不仅提供了加密算法,还包括证书处理、SSL/TLS 协议支持以及各种实用工具。在IT领域,OpenSSL 广泛用于Web...

    openssl库源码,3.2.0版本

    OpenSSL 是一个强大的安全套接层 (SSL) 和传输层安全 (TLS) 库,用于实现网络通信中的加密。这个库被广泛应用于各种操作系统,包括 ...通过阅读和分析源码,可以进一步理解这些底层机制,从而提升你的 IT 技术水平。

    openssl API 函数库

    在OpenSSL中,回调函数常用于错误处理、日志记录等场景。例如,通过设置错误回调函数可以自定义错误处理逻辑。 #### 二、OpenSSL简介 **2.1 OpenSSL简介** OpenSSL是一个开源的安全套件库,提供了强大的加密功能...

    openssl密钥生成工具

    **OpenSSL:强大的加密库与命令行工具** OpenSSL 是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现库,同时也包含了各种密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供丰富的应用程序供测试...

Global site tag (gtag.js) - Google Analytics