在linux下,我们经常可以看到一个叫做openssl-x.x.rpm的包,或许许多人猜想它和ssl有关,没错!但是远不完全,openssl不但实现了ssl的一些接口,它所涵盖的内容从底层对称、非对称加密算法的到建立在其上的PKCS(Public Key Infrastrature)的接口(包括X509证书、PKCS标准、ASN.1等)的实现是一应俱全,甚至还给了一个有关CA的例子。openssl这个包是由两部分组成的:ssleay和openssl,它两者的关系是,ssleay是一套接口库,openssl是建立在这个库接口之上的一个应用。时至今日,openssl也展到了0.95版,它的功能也越来越丰富。ssleay本身是一个跨平台的东西,主要是用标准C写成的,支持Linux自不必说,其他大部分Unix和WINNT它都支持,对于做不同平台下有关信息安全的应用,ssleay自然是个不错的选择。现在我们就将openssl所完成的功能及其应用细细道来。
openssl包中的ssleay是整个包的核心,ssleay这个加密库所涉及的范围之广、功能之齐全逻辑之合理、结构之复杂(这也能算优点?或许是仁者见仁、智者见智,复杂是说它包含的接口多,大约2000多个,而且功能上有重复,但是如果函数用熟了的话也会觉得方便),不能不让人惊叹它的原作者Eric A. Young和Tim J. Hudson的厉害,呵呵。ssleay实现了常用的关于对称加密的des、idea、rc2、rc4、rc5、blowfish、CAST;实现了非对称算法中的RSA、DH、DSA。哈稀算法中的MD2、MD5、SHA、SHA-1、RIPEMD、MDC2。单从这些算法看来,已经可以用它来构建各种有关数据加密的应用了和PKCS接口了。更可贵的,它打破了美国的不允许强加密产品出口的限制。使用ssleay,我们完全可以替代微软所提供的那套用来构件加密应用的低强度的加密库,并且通过使用ssleay开发自己的应用,我们完全可以做到ssl的128甚至更高位数的数据加密。
ssleay将实现的加密算法有对称、非对称算法、哈稀算法。基本上常用的、标准的算法都包含在里面了,如des,idea,md5,sha-1,rsa,dsa。同时,对同一算法的各个加密模式也基本上都同时予以实现,比如对des加密算法,它不但实现了块加密模式的ECB(Electronic Codebook Mode)、CBC(Cipher Block Chaining Mode),还实现了流加密的CFB(Cipher Feedback Mode)、OFB(Output Feedback Mode)。这些算法基本上都是以独立形式存在于openssl这个包所解开的源文件中,因此,如果我们在做自己的应用的时候如果,如果要用到有关加密、base64编码、MD5等算法,完全可以将ssleay所提供的这一套方便摘取出来,直接利用这些现成的代码来为我们自己的程序服务,其实这也是自由软件思想所要推崇的一个方面,那就是代码的重利用。
ssleay除过提供这些底层的有关加密算法的实现外,还实现了大部分PKCS(Public Key Cryptographic Standard)标准。PKCS是一套由RSA公司提出公开密钥加密标准,主要作用是用来规范加密算法的处理,规范数字证书、数据封装、数字签名,以及个人私有信息保护的一些标准。ssleay对PKCS1(对RSA加密算法的描述)、PKCS3(Diffie-Hellmen Key Agreement)、PKCS5(基于口令进行加密的标准)、PKCS6(扩展证书语法标准)、PKCS7(加密信息表示的语法标准)、PKCS8(私钥信息语法标准)、PKCS10(证书申请语法标准)、PKCS12(个人身份信息迁移语法标准)等。PKCS是用来构建PKI的。通过ssleay提供的PKCS的实现,我们可以方便的在有关PKI的应用里做到标准数字证书的申请、签发,个人信息(如证书、私钥等)的安全又标准的存放,作到标准的、通用的数据加密、数据封撞、数据签名信息格式。
从结构上看,ssleay是分为三层的,最底下为各种加密算法的实现,中间是加密算法的抽象接口,它对各种算法按对称、非对称、哈稀算法进行分类然后相应的给予一组简单的接口。最上面是围绕加密算法的PKCS的实现。ssleay不但实现了PKCS本身,还对采用ASN.1抽象描述PKCS提供了DER编码的接口,让这些抽象数据结构最终能够变成在网络上进行传输,在硬盘上能够存储的数据。
正如文章开始所说,ssleay也提供了对ssl的支持,它包含一组ssl的接口,允许我们使用它方便的建立起安全套接层,进行数据的安全传输。这里再重复一遍,使用ssleay提供的这些接口,完全可以作到ssl连接中加密钥匙的128位长度,只要你喜欢,192位都行。
在openssl的源程序编译、安装完之后,我们不但得到两个有用的库文件libcrypto.a和libssl.a,而且还包含一个使用这两个库所给的一个功能非常齐全的大的例子,也就是openssl可执行文件和其他的辅助文件,这个例子所完成的功能有钥匙对的产生、证书的申请、证书的签发、证书的吊销、证书吊销列表的处理、数据的加密、验证等等。可以说,它本身就是一个CA的例子。唯一的缺点就是没有有关这个程序使用方法的文档,只能从程序打印出来的提示信息里试着用。
上面所写的只是一些总体介绍而已,事实上,openssl很复杂,如果相对程序有个透彻的了解,所要掌握的又有信息安全的知识也要比较丰富。从功能上讲,openssl是我所见到的最全的一套接口,让你觉得它是关于信息安全的一个集大成者,呵呵,有点吹嘘了,只是为了形容一下而已。正因为ssleay有这么强的功能并且开放源代码,所以它被怀着各种各样目的的人拿来用作自己的用途,openssl本身的license是Ssleay license和Openssl license的结合,而这两种license实际上都是bsd类型的license.按照license里面的说明,openssl可以被用做各种商业、非商业的用途,但是需要相应遵守一些协定,其实这都是为了保护自由软件作者及其作品的权利。他人如果想要在ssleay上或openssl上做开发,就必须要遵守这两个license。但是,现在吸自由软件血的厂商还是大有人在,改头换面、剽窃一番就成自己了。不过各位如果想要做和加密有关的东西,我的推荐仍然是--openssll.