MD5校验
MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
最近做项目过程中,对接iot平台,实现fota升级时,需要对下载的文件进行校验,确保文件完整性才可以进行设备升级,防止设备变成砖头。服务器下发fota升级指令的同时,会将设备安装包的md5值一起下发给我们设备,我们只需要获取下发文件的md5值与服务器下发的md5值比较,如果一致,则进行升级操作即可。
一.md5源码
md5源码下载路径:https://sourceforge.net/projects/libmd5-rfc/files/latest/download
解压后文件如下:
二.md5测试程序
关于md5的使用,我们可以获取字符串的md5值,也可以获取一个文件的md5值,下面时测试代码,获取hello world的md5值和文件md5.h的md5值。
#include <stdio.h>
#include <string.h>
#include "md5.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
//字符串md5值
char data[30] = "hello world";
int i = 0;
md5_byte_t digest[16];
md5_state_t md5StateT;
//md5值获取
md5_init(&md5StateT);
md5_append(&md5StateT, data, strlen(data));
md5_finish(&md5StateT, digest);
char md5String[33] = { '\0' }, hexBuffer[3];
//将字符转换成16进制数1
for(i = 0; i != 16; i++)
{
if (digest[i] < 16)
sprintf(hexBuffer, "0%X", digest[i]);
else
sprintf(hexBuffer, "%X", digest[i]);
strcat(md5String, hexBuffer);
}
printf("字符串:%s",data);
printf("字符串md5值:%s\n", md5String);
//将字符转变成16进制数2
for(i = 0;i<16;i++)
{
snprintf(md5String+i*2,3,"%02X",digest[i]);
}
md5String[33] = '\0';
printf("the string md5 is %s\n",md5String);
//文件md5值获取
int fd;
char buf[1204];
int ret;
//打开文件
fd = open("./md5.h",O_RDONLY,777);
if(fd < 0)
{
printf("open file fail\n");
}
//md5值获取,md5_init开头已经执行
while((ret = read(fd,buf,sizeof(buf)) <= 0))
{
md5_append(&md5StateT,buf,ret);
}
md5_finish(&md5StateT, digest);
#if 0
for(i = 0; i != 16; i++)
{
if (digest[i] < 16)
sprintf(hexBuffer, "0%X", digest[i]);
else
sprintf(hexBuffer, "%X", digest[i]);
strcat(md5String, hexBuffer);
}
printf("the file md5 is %s\n",md5String);
#endif
for(i = 0;i<16;i++)
{
snprintf(md5String+i*2,3,"%02X",digest[i]);
}
md5String[33] = '\0';
printf("the file md5 is %s\n",md5String);
close(fd);
return 0;
}
编译,执行,结果如下:
文件md.h的md5值是F2DC6BB8F7E5394F1D306989D47395C3,若谁在上述网址下载解压出md5.h,采用上述方法获取md.h的md5值与此值不用,说明我们下载的文件就有差异。