Openssl

openssl之IO

在BIO的所用成员中,method可以说是最关键的一个成员,它决定了BIO的类型,可以看到,在声明一个新的BIO结构时,总是使用下面的声明:

BIO* BIO_new(BIO_METHOD *type);
在源代码可以看出,BIO_new函数除了给一些初始变量赋值外,主要就是把type中的各个变量赋值给BIO结构中的method成员。一般来说,上述type参数是以一个类型生成函数的形式提供的,如生成一个mem型的BIO结构,就使用下面的语句:
BIO *mem = BIO_new(BIO_s_mem());
这样的函数有以下一些:
2.1 source/sink型
1.       BIO_s_accept():是一个封装了类似TCP/IP socket Accept规则的接口,并且使TCP/IP操作对于BIO接口是透明的。
2.       BIO_s_bio():封装了一个BIO对,数据从其中一个BIO写入,从另外一个BIO读出。
3.       BIO_s_connect():是一个封装了类似TCP/IP socket Connect规则的接口,并且使TCP/IP操作对于BIO接口是透明的。
4.       BIO_s_fd():是一个封装了文件描述符的BIO接口,提供类似文件读写操作的功能。
5.       BIO_s_file():封装了标准的文件接口的BIO,包括标志的输入输出设备如stdin等。
6.       BIO_s_mem():封装了内存操作的BIO接口,包括了对内存的读写操作。
7.       BIO_s_null():返回空的sink型BIO接口,写入这种接口的所有数据读被丢弃,读的时候总是返回EOF。
8.       BIO_s_socket():封装了socket接口的BIO类型。
2.2 filter型
1.       BIO_f_base64():封装了base64编码方法的BIO,写的时候进行编码,读的时候解码。
2.       BIO_f_buffer():封装了缓冲区操作的BIO,写入该接口的数据一般是准备传入下一个BIO接口的,从该接口读出的数据一般也是从另一个BIO传过来的。
3.       BIO_f_cipher():封装了加解密方法的BIO,写的时候加密,读的时候解密。
4.       BIO_f_md():封装了信息摘要方法的BIO,通过该接口读写的数据都是已经经过摘要的。
5.       BIO_f_null():一个不作任何事情的BIO,对它的操作都简单传到下一个BIO去了,相当于不存在。
6.       BIO_f_ssl():封装了openssl 的SSL协议的BIO类型,也就是为SSL协议增加了一些BIO操作方法。

上述各种类型的函数正是构成BIO强大功能的基本单元,所以,要了解BIO的各种结构和功能,也就应该了解这些函数类型相关的操作函数。所有这些源文件,都基本上包含于/crypto/bio/目录下的同名.c文件(大部分是同名的)中。

MD5加密

MD5是最常用的一个信息摘要算法,虽然现在慢慢被SHA1算法替代,但还是应用广泛。MD5的计算结果是16个字节。

//打开/usr/include/openssl/md5.h这个文件我们可以看到一些函数
  // 初始化 MD5 Contex, 成功返回1,失败返回0
  int MD5_Init(MD5_CTX *c);
  // 循环调用此函数,可以将不同的数据加在一起计算MD5,成功返回1,失败返回0
  int MD5_Update(MD5_CTX *c, const void *data, size_t len);
  // 输出MD5结果数据,成功返回1,失败返回0
  int MD5_Final(unsigned char *md, MD5_CTX *c);
  // MD5_Init,MD5_Update,MD5_Final三个函数的组合,直接计算出MD5的值
  unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
 // 内部函数,不需要调用
 void MD5_Transform(MD5_CTX *c, const unsigned char *b);

新建一个cpp文件用于计算MD5值

  #include <openssl/md5.h>
  #include <string.h>
  #include <stdio.h>
 
  int main()
  {
      MD5_CTX ctx;
      unsigned char outmd[16];
      int i=0;
 
     memset(outmd,0,sizeof(outmd));
     MD5_Init(&ctx);
     MD5_Update(&ctx,"hel",3);
     MD5_Update(&ctx,"lo\n",3);
     MD5_Final(outmd,&ctx);
     for(i=0;i<16;i<i++)
     {
         printf("%02X",outmd[i]);
     }
     printf("\n");
     return 0;
 }

编译选项为: g++ MD5test.cpp -lssl -o MD5test
运行后的结果为: B1946AC92492D2347C6235B4D2611184
注意这里用到openssl库,可以运行 yum install openssl  和 yum install openssl-devel 进行安装。

nginx里的开发

    u_char     *last, key[16],newkey[4];
    ngx_md5_init(&md5);
    ngx_md5_update(&md5, r->uri.data, r->uri.len);
    ngx_md5_update(&md5, r->args.data, r->args.len);
    ngx_md5_final(key, &md5);
    ngx_hex_dump(newkey, key + 14, 2);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值