openssl是一个非常知名的库,在很多的开源项目中都可以看到它的存在,同时有也很多开源的类库和框架中也预留了openssl的功能扩展,比如ACE。openssl库基本上可以分为”加密算法库”和”SSL库”,这一点从openssl在linux下编译之后生成的库文件”libcrypto.a”和”libssl.a”可以看出。openssl中包括了大部分的加密算法的实现: AES,DES,RSA…以及MD4,MD5,SHA…等算法的实现。openssl中的SSL库是建立在加密算法库基础之上的,网络安全套接字操作,这也是大部分的C/C++类库,框架使用openssl的重要原因之一。
尽管openssl的功能强大,应用广泛,但是openssl本身还是有几个显著的缺点:
1. 缺少文档说明,大部分的openssl函数,组件都没有对应的功能,接口说明,即使可以在openssl官网上找到对应的文档说明,基本上也只是寥寥数语就结束了,很难从中获取到有用的信息。这一点也大大增加了广大开发者在使用openssl时的难度,初次接触一个功能庞大的类库,没有文档,没有说明是一件多么麻烦的事情,大量的信息只能去查阅源代码来揣测代码的功能和意图,甚至是参数的含义和返回值的含义。当然,作为一个免费开源的类库,能做到这个样子已经很不错了(在文档方面,Boost类库是一个值得学习的楷模),我们可以帮助完善openssl,写出一些使用心得和使用方法,来帮助更多的人使用openssl。这也是本站将针对于openssl写一个系列文章的出发点,欢迎大家交流学习。
2. 整个openssl类库的历史比较长,从openssl出现到现在大概有20年时间,其间有大量的开源爱好者贡献了代码,这也使得openssl中存在一个很严重的问题,那就是代码风格的不统一,对于这一点,那些仔细阅读过openssl源代码的同学应该更加懂得我在说什么。有的函数以返回0表示成功,有的函数以返回1表示成功,乍一看没什么,只是用不同的返回值表示”成功状态”而已,但是关键是,这些函数并没有对这些返回码做任何的说明,因为openssl的代码风格不统一,所以你很难以类似于C语言中返回0表示成功这种”约定俗成”来使用openssl库,这个时候,我们想起了”源码面前了无秘密”这句名言,只能去看代码了。对于函数的参数,还有更让人麻烦的事情,对于一个函数原型”void func( char *buf , int len)”,一般情况下,或者说约定俗成的情况下,我们都知道这里的”len”是以字节来计算的,表示buf的字节数。但是在openssl的加密算法库中,对于”void func( char *buf , int len)”这样一个加密函数,有的是以字节为单位,有的是以bit为单位,问题是也是没有文档说明。这也让那些openssl的新手们郁闷无比,明明是”正确”的调用,但计算的结果却是错的(因为他以为这个buf以字节为单位,实际上是以bit为单位)。这也是为什么类似于Linux,ACE之类的大规模开源项目会有一个”代码规范”,一个大量人员参加的开源项目,如果没有统一的代码规范,这样的项目越大,质量也会越低,因为它使得后期的代码维护成为一个漫长而困难的过程。
使用openssl也有一段时间,遇到了不少问题,也总结了不少经验。本站将会针对openssl写一个系列文章,与大家交流分享。
本站原创文章,转载请注明出处。
评论
发表评论 反向链接