OpenSSL之摘要MD5用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenSSL之摘要MD5用法相关的知识,希望对你有一定的参考价值。
参考技术A MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。
MD5相关的头文件在md5.h中、源文件在crypto/md5目录中。
这个结构定义了MD5运算的海棉算法上下文。主要字段含义:
A, B, C, D —— 存放海棉运算的中间结果。
data —— 数据分组缓冲区,用于暂存不够分组大小的数据。
num —— 缓冲区数据大小。
在1.1.1中,大多数的数据结构已经不再向使用者开放,从封装的角度来看,这是更合理的。如果你在头文件中找不到结构定义,不妨去源码中搜一搜。
int MD5_Init(MD5_CTX *c);
初使化MD5上下文结构。
总是返回1。
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摘要串。
成功返回1,失败返回0。
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
对于短的字符串,可以使用该函数一次性生成MD5摘要,简化调用。
下面这个例子演示了使用两种方式生成MD5摘要,并对比结果。
输出:
ret:1
e380e88e8d09ebf8d8659a15b0ea70b5
ret 0x7fff90096b20
SMD5 0x7fff90096b20
e380e88e8d09ebf8d8659a15b0ea70b5
OpenSSL 之 MD5
学习一下,OpenSSL,使用OpenSSL有两种方式:命令执行和库调用。对于我来说,学习是为了写代码。直奔库调用了。先从最简单的MD5入手吧!
OpenSSL官网上找到MD5简介只有函数的声明,没有相对明确的解释:
#include <openssl/md5.h> unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md); int MD5_Init(MD5_CTX *c); int MD5_Update(MD5_CTX *c, const void *data, unsigned long len); int MD5_Final(unsigned char *md, MD5_CTX *c);
从函数的声明中只有看到,提供了4个函数。翻阅了下代码可大概理解了。上面的MD5函数与下面三个函数(MD5_Init,MD5_Update,MD5_Final)是两种使用方式。上面的MD5函数的内部实现其实也是调用下面的三个函数来完成的。
MD5函数可以直接获取到对应的MD5值,但需要传的内容为指定的unsigned char类型的数据。这个相对使用场景要可能少一些。下面的MD5_Update则可以传任意类型的地址,这个相对更加适合对普通的文本或数据包来进行计算。
下面代码是MD5的使用例子:
#include <stdio.h> #include <iostream> #include <string.h> #include <openssl/md5.h> int main( int argc, char **argv ) { unsigned char md[MD5_DIGEST_LENGTH]; char strMd5[MD5_DIGEST_LENGTH+1]; const char *data = "hello world!"; MD5_CTX c; if( !MD5_Init(&c) ) { std::cout<<"MD5_Init failed"<<std::endl; return -1; } MD5_Update(&c, data, strlen(data)); MD5_Final(md, &c); for( int nIndex = 0; nIndex < MD5_DIGEST_LENGTH; nIndex ++ ) { sprintf(strMd5+nIndex*2, "%02x\t", md[nIndex]); } std::cout<<strMd5<<std::endl; return 0; }
编译链接为:
g++ -o myMD5 -I /usr/local/openssl/include/ -L /usr/local/openssl/lib/ -lcrypto myMD5.cpp
本文出自 “点滴成长” 博客,请务必保留此出处http://xdataplus.blog.51cto.com/3614757/1956372
以上是关于OpenSSL之摘要MD5用法的主要内容,如果未能解决你的问题,请参考以下文章