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) 



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273969

相关文章
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
810 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
缓存 网络协议 Linux
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
|
Linux 开发者
交叉编译工具链的下载与安装
交叉编译工具链的下载与安装
2528 1
|
Java Linux 程序员
linux实现定时备份文件到百度网盘详细教程
作为一个程序员,数据备份尤为重要,本文主要介绍的是将服务器上的某文件定时备份到百度网盘中。主要实现思路是:安装pip、byp --> 百度网盘进行授权登陆 --> 使用crontab+bypy实现定时自动数据备份。
1727 0
|
11月前
|
前端开发 JavaScript API
前端如何访问文件夹
前端如何访问文件夹
前端如何访问文件夹
|
机器学习/深度学习 分布式计算 安全
Hadoop集群常见报错汇总
这篇博客总结了Hadoop集群中可能遇到的各种常见错误,包括Kerberos认证问题、配置错误、权限问题等,并为每个问题提供了详细的错误复现、原因分析以及相应的解决方案。
1462 1
Hadoop集群常见报错汇总
|
机器学习/深度学习 网络安全 网络协议
|
存储 分布式计算 监控
Spark作业的调度与执行流程
Spark作业的调度与执行流程
|
Android开发
android 12 U盘 /mnt/media_rw 下读取文件异常 没有权限
android 12 U盘 /mnt/media_rw 下读取文件异常 没有权限
806 0
|
Windows
CMake 如何设置 Debug 和 Release 下的不同配置
CMake 设置 Debug 和 Release 下不同的工程依赖库,编译选项宏隔离等
1386 1
CMake 如何设置 Debug 和 Release 下的不同配置