关于提高基于OpenSSL软件的运行效率的研究
时间:2006-04-21 来源:fenge1981
摘要:目前,基于OpenSSL的软件并不能完全发挥这个开放库的高效率和高稳定性的特点,原因在于这些软件的开发人员对OpenSSL这个开放库的高级应用所知甚少,本文在提高软件运行效率的角度对OpenSSL的高级应用进行论述。
关键词:SSL OpenSSL Multithread
文献标识码:A 中图分类号:TP3
0 引言
SSL是 Secure Sockets Layer(网络套接层)的缩写,它是在 Internet 上进行安全通信的标准协议,运行在TCP/IP层之上、应用层之下。OpenSSL 不仅是 SSL,它还可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字等功能。使用 OpenSSL API将信息在离开用户的计算机之前进行加密,然后到达它预定的目标计算机后同样使用OpenSSL API进行解密,即使在信息传输的过程中被截获,没有密钥黑客仍然不能破译用户的信息。可见调用OpenSSL的软件都是采用软件的方式实现信息的加密,因此如何提高软件的效率和可靠性是一个关键性问题。
1 使用内嵌密码加速引擎
OpenSSL从0.9.6版本开始,具有对内嵌密码加速的支持。从OpenSSL0.9.7开始,这种支持在OpenSSL的主分支中得到限制。OpenSSL0.9.6的引擎包中只有建立一个引擎对象的简易功能,而OpenSSL0.9.7具有更健壮的特性用于对引擎包的支持。使用内嵌密码加速引擎,主要是通过使用引擎对象模型,使应用程序获得对可变化的底层描述的引用,此底层描述大部分是针对底层硬件的描述。大概的思想很简单:声明一个对象,然后用我们希望使用的硬件的描述符(见表1)来初始化这个对象。下面用一小段程序来演示如何实现这种操作。
// 例1 如何使用密码加速引擎
ENGINE *e; // 声明一个指向引擎对象的指针
if (!(e = ENGINE_by_id("cswift"))) //使用ENGINE_by_id 初始化引擎对象
fprintf(stderr, "Error finding specified ENGINE\n");
else if (!ENGINE_set_default(e, ENGINE_METHOD_ALL))
fprintf(stderr, "Error using ENGINE\n");
else
fprintf(stderr, "Engine successfully enabled\n")
在上面这段程序中,函数ENGINE_by_id 在OpenSSL支持的所有硬件和软件加速引擎中查询用户指定的加速引擎,然后返回一个实例化的引擎对象。其中cswift是OpenSSL支持的密码加速引擎的一种。表1显示了OpenSSL支持的硬件和软件加速引擎。如果ENGINE_by_id执行错误则返回NULL值,如果执行成功则返回一个指向引擎对象的指针,并且把这个指针赋值给变量e。函数ENGINE_set_default的功能是通过给ENGINE_by_id返回的引擎对象e设置标志位来限制引擎对哪种加密算法起作用。这个函数有两个参数,第一个参数是一个指向引擎对象的指针,第二个参数是用来设置引擎的标志位。在例1中,用ENGINE_METHOD_ALL标志设置的引擎可以对任何加密算法进行加速,但是如果用ENGINE_METHOD_RSA标志设置引擎,则这个引擎只能用来对RSA算法进行加速。表2中所列出的这些标志位可以被根据需要组合使用,组合逻辑是或,例如;
ENGINE_set_default(e, ENGINE_METHOD_DSA| ENGINE_METHOD_RSA);
//引擎e只能对DSA和RSA加速。
OpenSSL支持硬件和软件加速的引擎 |
|
ID(硬件描述字符串) |
描述 |
OpenSSL |
本引擎使用普通的嵌入式功能完成加密操作 |
openbsd_dev_crypto |
本引擎建使用内嵌于freebsd操作系统的核心层次的加密功能。 |
Cswift |
用于快速加密的加速硬件。 |
Chil |
用于nCipher CHIL硬件加速。 |
Atalla |
用于康柏Atalla硬件加速。 |
Nuron |
用于Nuron硬件加速。 |
Ubsec |
用于Broadcom uBSec硬件加速。 |
Aep |
用于Aep硬件加速。 |
Sureware |
用于SureWare硬件加速。 |
表 1 OpenSSL支持的硬件和软件加速引擎
ENGINE_set_default的标志位 |
|
标志位 |
表述位 |
ENGINE_METHOD_RSA |
限制引擎仅对RSA算法进行加速。 |
ENGINE_METHOD_DSA |
限制引擎仅对DSA算法进行加速。 |
ENGINE_METHOD_DH |
限制引擎仅对DH算法进行加速。 |
ENGINE_METHOD_RAND |
限制引擎仅对RAND算法进行加速。 |
ENGINE_METHOD_ |
限制引擎仅对CIPHERS。 |
ENGINE_METHOD_ |
限制引擎仅对DIGESTS算法进行加速。 |
ENGINE_METHOD_ALL |
允许OpenSSL对任何以上提到的算法进行加速。 |
表2 标志位描述
除去设置默认引擎,在OpenSSL0.9.7中引擎对象还可以典型的应用于其他几个地方。例如,函数EVP_EncryptInit已经被函数EVP_EncryptInit_ex代替。函数EVP_EncryptInit_ex比函数EVP_EncryptInit多引擎对象这个参数。如果给这个参数赋一个空值,OpenSSL就使用默认的引擎。如果再调用ENGINE_set_default对引擎的标志位进行设置,再次请求则默认的引擎就已改变;如果没有这些请求,则OpenSSL内嵌的软件加速引擎(默认的)将被应用。
Multithread
Multithread 支持最现代操作系统为multithreaded 应用提供支持, 并且对于申请来说,利用那支持正变得越来越更普通。 OpenSSL 当然能被在一种multithreaded环境里使用; 不过,它要求为了使一个计划安全思路,开发者做一些工作。 很多开发者用OpenSSL犯的一个普通错误是他们以为图书馆没有要求特别的任何事情被在应用过程中做是安全线的。 这最当然是错误的假定, 并且不能建立OpenSSL供一种multithreaded环境使用能导致非常难调试的无法预言的行为和好象随便的碰撞事故。 OpenSSL使用操作一定是原子的的很多数据结构。 即,必须保证只有一根线将一次进入他们。 如果两根或更多线被允许同时修改相同的结构,没有方法预言变化将实现哪一个。 什么更坏, 行动能结束第1 根线的变化的混合部分可能被做,而第二次线的变化的部分也能被做。 无论发生哪种情况,结果是无法预言的,因此措施一定被花费使结构安全线。 OpenSSL为它的数据结构的思路安全作准备, 通过要求每根线获得一把相互专有的称为保护结构的mutex的锁在允许它被进入之前。 线完成数据结构什么时候,它释放mutex,允许另一线获得锁和进入数据结构。 因为OpenSSL在在他们的穿过的实施方面不同的多个平台上是为使用设计的, OpenSSL不打直接的电话建立,破坏,获得,并且释放mutexes: 它要求应用程序员用一种适合于它正在进行这些手术上运转的平台的方式, 在使给应用注册适合这目的的OpenSSL的功能的回叫时。