目录

MD5 对数据加密与校验

一、前言

对于网络传输的数据,无非就是三点要求:一、保证数据传输的正确性;二、防止数据被篡改;三、对数据进行加密。对于前两点要求,普遍使用 MD5 来处理。

二、介绍

点击展开内容

MD5 的全称是 Message-Digest Algorithm 5,在90年代初由 MIT 的计算机科学实验室和 RSA Data Security Inc 发明,经 MD2、MD3 和 MD4 发展而来。MD5 将任意长度的“字节串”变换成一个 128bit(即:16字节) 的大整数,相当于这串数据的“数据指纹”。主要用于确保信息传输完整一致,更多用在文档校验上,用来生成密钥检测文档是否被篡改。是计算机广泛使用的摘要算法(哈希算法)之一,主流编程语言普遍已有 MD5 实现。
MD5 算法具有以下特点:

  1. 压 缩 性:任意长度的数据,算出的 MD5 值长度都是固定的。
  2. 容易计算:从原数据计算出 MD5 值很容易。
  3. 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的 MD5 值都有很大区别。
  4. 强抗碰撞:已知原数据和其 MD5 值,想找到一个具有相同 MD5 值的数据(即伪造数据)是非常困难的。
  5. 不可逆性:加密过程本身就是一个有损的加密过程,因此几乎不能还原出原始数据。

三、用途

点击展开内容

本人理解它有三大类用途:

  1. 校验数据传输/存储是否出错。例如:我们使用电脑读取文件时,曾经就遇过提示文件破损。那么电脑如何知道文件破损了?其原理就是读文件前先运算 MD5 码,再与文件保存那时存储的 MD5 码进行比较,MD5 码不一样,那就说明文件破损了。
  2. 校验用户密码,保护用户隐私。例如:在手机输入登录某网站密码,手机 APP 发送的是由密码生成的 MD5 码给网站服务器。服务器则是使用用户注册密码生成的 MD5 码与手机 APP 发来的 MD5 码进行比较。如果一样,则表示密码正确。这样的好处是保护用户密码在传输过程中不被泄漏。(补注:实际应用中服务器是不保存用户原始密码,只保存 MD5 码,这样连服务器也不知道用户原始密码,可以更有效保护用户私隐)
  3. 校验证书的唯一性,防止证书或内容被篡改。例如:一个简单支付业务操作,把用户支付帐号、支付金额、支付密码拼接起来生成 MD5 码证书,最后把支付帐号、支付金额、MD5 码证书三项内容发给支付平台进行支付操作。因为坏人不知道你密码,如果他中途拦截并恶意篡修支付金额,但支付平台使用相同方法运算的 MD5 码证书发现不一致,就会拒绝本次支付操作,这样就有效地保护用户的支付安全。

四、应用

点击展开内容

比如由网友 talent518 分享的 C 语言版本:
https://github.com/talent518/md5
直接把“md5.c”“md5.h”加入工程使用即可。

1
2
3
4
5
6
7
8
 MD5_CTX md5; //MD5对象
 unsigned char datasrc[13] = {12, 214, 234, 3, 4, 5, 89, 21, 48, 92, 14, 7, 10}; //要运算的数据
 unsigned char decrypt[16]; //结果寄存器
 
 //每次运算 MD5 码,必须依次调用 3 个函数进行操作
 MD5Init(&md5);                             //初始化
 MD5Update(&md5, datasrc, sizeof(datasrc)); //导入数据(此处可以多次导入多段数据)
 MD5Final(&md5, decrypt);                   //计算并输出 16 字节 MD5 到 decrypt[]