00. 目录

文章目录

  • 00. 目录
  • 01. MD5简介
  • 02. 发展历史
  • 03. MD5应用场景
  • 04. OpenSSL中MD5
  • 05. MD5测试代码
  • 06. 附录

01. MD5简介

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的哈希算法,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

02. 发展历史

1992年8月,罗纳德·李维斯特向互联网工程任务组(IETF)提交了一份重要文件,描述了这种算法的原理。由于这种算法的公开性和安全性,在90年代被广泛使用在各种程序语言中,用以确保资料传递无误等 。

MD5由MD4、MD3、MD2改进而来,主要增强算法复杂度和不可逆性。MD5算法因其普遍、稳定、快速的特点,仍广泛应用于普通数据的加密保护领域 。

MD2

Rivest在1989年开发出MD2算法 。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的校验和追加到信息末尾,并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了校验和MD2将产生冲突。MD2算法加密后结果是唯一的(即不同信息加密后的结果不同) 。

MD4

为了加强算法的安全性,Rivest在1990年又开发出MD4算法 。MD4算法同样需要填补信息以确保信息的比特位长度减去448后能被512整除(信息比特位长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damgard/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。

MD5

1991年,Rivest开发出技术上更为趋近成熟的MD5算法。它在MD4的基础上增加了"安全带"(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。

03. MD5应用场景

3.1 用于密码管理

当我们需要保存某些密码信息以用于身份确认时,如果直接将密码信息以明码方式保存在数据库中,不使用任何保密措施,系统管理员就很容易能得到原来的密码信息,这些信息一旦泄露, 密码也很容易被破译。为了增加安全性,有必要对数据库中需要保密的信息进行加密,这样,即使有人得到了整个数据库,如果没有解密算法,也不能得到原来的密码信息。MD5算法可以很好地解决这个问题,因为它可以将任意长度的输入串经过计算得到固定长度的输出,而且只有在明文相同的情况下,才能等到相同的密文,并且这个算法是不可逆的,即便得到了加密以后的密文,也不可能通过解密算法反算出明文。这样就可以把用户的密码以MD5值(或类似的其它算法)的方式保存起来,用户注册的时候,系统是把用户输入的密码计算成 MD5 值,然后再去和系统中保存的 MD5 值进行比较,如果密文相同,就可以认定密码是正确的,否则密码错误。通过这样的步骤,系统在并不知道用户密码明码的情况下就可以确定用户登录系统的合法性。这样不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。

3.2 电子签名

MD5 算法还可以作为一种电子签名的方法来使用,使用 MD5算法就可以为任何文件(不管其大小、格式、数量)产生一个独一无二的“数字指纹”,借助这个“数字指纹”,通过检查文件前后 MD5 值是否发生了改变,就可以知道源文件是否被改动。我们在下载软件的时候经常会发现,软件的下载页面上除了会提供软件的下载地址以外,还会给出一串长长的字符串。这串字符串其实就是该软件的MD5 值,它的作用就在于下载该软件后,对下载得到的文件用专门的软件(如 Windows MD5 check 等)做一次 MD5 校验,以确保我们获得的文件与该站点提供的文件为同一文件。利用 MD5 算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面 。

3.3 垃圾邮件筛选

在电子邮件使用越来越普遍的情况下,可以利用 MD5 算法在邮件接收服务器上进行垃圾邮件的筛选,以减少此类邮件的干扰,具体思路如下:

  1. 建立一个邮件 MD5 值资料库,分别储存邮件的 MD5 值、允许出现的次数(假定为 3)和出现次数(初值为零)。
  2. 对每一封收到的邮件,将它的正文部分进行MD5 计算,得到 MD5 值,将这个值在资料库中进行搜索。
  3. 如未发现相同的 MD5 值,说明此邮件是第一次收到,将此 MD5 值存入资料库,并将出现次数置为1,转到第五步。
  4. 如发现相同的 MD5 值,说明收到过同样内容的邮件,将出现次数加 1,并与允许出现次数相比较,如小于允许出现次数,就转到第五步。否则中止接收该邮件。结束。
  5. 接收该邮件。

04. OpenSSL中MD5

OpenSSL中的MD5函数分析

md5.h内容如下:

/** Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.** Licensed under the OpenSSL license (the "License").  You may not use* this file except in compliance with the License.  You can obtain a copy* in the file LICENSE in the source distribution or at* https://www.openssl.org/source/license.html*/#ifndef HEADER_MD5_H
# define HEADER_MD5_H# include <openssl/opensslconf.h># ifndef OPENSSL_NO_MD5
# include <openssl/e_os2.h>
# include <stddef.h>
# ifdef  __cplusplus
extern "C" {# endif/** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!* ! MD5_LONG has to be at least 32 bits wide.                     !* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
# define MD5_LONG unsigned int# define MD5_CBLOCK      64
# define MD5_LBLOCK      (MD5_CBLOCK/4)
# define MD5_DIGEST_LENGTH 16typedef struct MD5state_st {MD5_LONG A, B, C, D;MD5_LONG Nl, Nh;MD5_LONG data[MD5_LBLOCK];unsigned int num;
} MD5_CTX;int MD5_Init(MD5_CTX *c);
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
int MD5_Final(unsigned char *md, MD5_CTX *c);
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
void MD5_Transform(MD5_CTX *c, const unsigned char *b);
# ifdef  __cplusplus
}
# endif
# endif#endif

相关函数分析

// 初始化 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);

05. MD5测试代码

MD5测试参考代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>#include <openssl/md5.h>using namespace std;int main()
{int ret = -1;int i = 0;unsigned char md[MD5_DIGEST_LENGTH];unsigned char buf[MD5_DIGEST_LENGTH * 2 + 1];MD5_CTX c;const void *data = "程序改变世界";//1. 初始化ret = MD5_Init(&c);if (1 != ret){printf("MD5_Init failed...\n");return 1;}//2. 添加数据ret = MD5_Update(&c, (const void *)data, strlen((char *)data));if (1 != ret){printf("MD5_Update failed...\n");return 1;}//3. 计算结果ret = MD5_Final(md, &c);if (1 != ret){printf("MD5_Final failed...\n");return 1;}//4. 输出结果cout << "md: " << md << endl;memset(buf, 0, MD5_DIGEST_LENGTH * 2 + 1);for (i = 0; i < MD5_DIGEST_LENGTH; i++){sprintf((char*)&buf[i * 2], "%02X", md[i]);}cout << buf << endl;cout << "==============================" << endl;memset(md, 0, MD5_DIGEST_LENGTH);MD5((unsigned char *)data, strlen((char*)data), md);memset(buf, 0, MD5_DIGEST_LENGTH * 2 + 1);for (i = 0; i < MD5_DIGEST_LENGTH; i++){sprintf((char*)&buf[i * 2], "%02X", md[i]);}cout << buf << endl;cout << "hello itcast" << endl;system("pause");return 0;
}

测试结果

06. 附录

  1. 参考:百度百科

  2. 维基百科:Crypto++

  3. 维基百科 MD5

  4. 官方网站: https://www.openssl.org/

【OpenSSL】OpenSSL之MD5相关推荐

  1. rsa php openssl,openssl rsa 使用简介

    openssl命令的用法 密钥的生成 a. 生成非对称密钥对 openssl genrsa -out rsa.key b. 指定生成的密钥的位数,默认512 openssl genrsa -out r ...

  2. Linux下C语言使用openssl库进行MD5校验

    http://blog.csdn.net/cassie_huang/article/details/53212933 作者:无脑仔的小明  出处:http://www.cnblogs.com/wuna ...

  3. openssl算法 —— 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    openssl 加密字符串的方法: 一.利用openssl命令进行BASE64编码解码(base64 encode/decode): 1. BASE64编码命令 对字符串'abc'进行base64编码 ...

  4. Linux OpenSSL获取证书指纹值(443、MD5、SHA1、SHA256)

    md5:openssl x509 -fingerprint -md5 -in certfile.crt sha1:openssl x509 -fingerprint -sha1 -in certfil ...

  5. 对称加密算法AES之GCM模式简介及在OpenSSL中使用举例

    AES(Advanced Encryption Standard)即高级加密标准,由美国国家标准和技术协会(NIST)于2000年公布,它是一种对称加密算法.关于AES的更多介绍可以参考:https: ...

  6. OpenSSL简介及在Windows、Linux、Mac系统上的编译步骤

    OpenSSL介绍:OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. SSL是SecureSock ...

  7. 22.加密与安全相关,证书申请CA(gpg,openssl)

    安全机制 信息安全防护的目标 保密性 Confidentiality 完整性 Integrity 可用性 Usability 可控制性 Controlability 不可否认性 Non-repudia ...

  8. OpenSSL使用指南

    OpenSSL使用指南 1     介绍 OpenSSL是使用非常广泛的SSL的开源实现.由于其中实现了为SSL所用的各种加密算法,因此OpenSSL也是被广泛使用的加密函数库. 1.1   SSL ...

  9. openssl——初了解

    Openssl OpenSSL是一个开源的.用于SSL/TLS协议的加密工具,是互联网加密传输的核心基础组件,由加拿大的Eric Yang等发起编写的,当前互联网安全传输的大部分场景(如HTTPS)均 ...

最新文章

  1. 希捷+ 加了些什么?
  2. thinkphp链接mssql以及查询中文乱码问题
  3. 使用android SDk帮助文档(英文) 下载中文SDK帮助文档(中文)
  4. 挖掘形态数轴的不确定性
  5. Nutch爬虫解决页面相对路径问题
  6. 诺基亚在2016年资本市场日上公布重点财务及战略目标
  7. Python计算任意数据的分布函数(累积概率函数CDF)与概率密度(PDF),并绘图
  8. 【蓝桥杯单片机】数码管
  9. oracle的LAG和LEAD分析函数
  10. 【Sublime Text3 】——代码片段
  11. 关于神经网络的英语单词有,神经网络的英文单词
  12. Python之快捷键
  13. HTML-错误页面介绍
  14. 网络上的计算机找不到打印机,网络打印机找不到,详细教您网络打印机找不到怎么办...
  15. php财务软件的报表如何实现,浪潮财务软件如何实现汇总报表系统调整表的接收 | 浪潮888博客...
  16. impala:Negotiation complete: Invalid argument: Client connection negotiation failed: client connect
  17. GB28181平台对接接口详解
  18. ionic3开发Android相关资料
  19. 直播报名 | Apache Kylin Meetup
  20. [附源码]SSM计算机毕业设计动物保护网站JAVA

热门文章

  1. 脚本语言语言脚本语言:Shell , JavaScript、VBScript、Perl、PHP、Python、Ruby、Lua
  2. OS开发之纯代码界面--基本控件使用篇
  3. javascript王者归来--属性和方法的类型
  4. ie里的button标签的一个bug
  5. 解决deepin微信无法登录
  6. 如果一个c语言float型变量被赋予初值,计算机组成原理B.doc
  7. cad修改快捷键_超全CAD快捷键命令汇总!助你成为CAD大神!
  8. 云笔记项目-过滤器与拦截器学习
  9. [UE4]瞬移前后屏幕亮度变化,Get Player Camera Manager.Start Camera Fade
  10. 这短短几行代码价值一万