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用法的主要内容,如果未能解决你的问题,请参考以下文章

OpenSSL之EVP用法

OpenSSL 之 MD5

5.openssl dgst

Openssl命令行用法简介

OpenSSL之内存用法

Linux OPENSSL的简单用法