MD5学习总结

1. MD5简介

MD5,即消息摘要算法第五版,是一种被广泛使用的密码散列函数。散列算法的基本原理是:进行数据(如一段文字)运算,将原始数据变为另一段固定长度的值

MD5 可以产生出一个 128位(16字节)的散列值(hash value),用于确保传输信息的完整性。

MD5 由美国密码学家 Ronald Linn Rivest 设计,于 1992 年公开,用以取代 MD4 算法。

2. MD5原理

MD5将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的MD5信息摘要。文件的MD5类似于人的指纹,在世界上是独立无二的,如果任何人对文件做了任何改动,其MD5的值也就是对应的“数字指纹”都会发生变化。

对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

MD5与对称和非对称加密算法不同,这两种密码(对称和非对称加密算法)是防止信息被窃取,而摘要算法的目标是用于证明原文的完整性(本质上MD5不属于加密算法)。

3. MD5特性

  • 不可逆:没有系统有办法知道MD5原来的文字是什么。
  • 压缩性:任意长度的数据,运算得出的 MD5 值长度都是固定的(128位);
  • 抗修改性:对原数据进行的任何改动,哪怕只修改 1 个字节,所得到的 MD5 值都有很大区别;
  • 强抗碰撞:已知原数据和其 MD5 值,想找到一个具有相同 MD5 值的数据(即伪造数据)是非常困难的。

4. MD5的用途

  • 密码的加密存储,用户设置密码时,服务端只记录这个密码的MD5,而不记录密码本身,以后验证用户身份时,只需要将用户输入的密码再次做一下MD5后,与记录的MD5作一个比较即可验证其密码的合法性。
  • 数字签名,比如发布一个程序,为了防止别人在你的程序里插入病毒或木马,你可以在发布这个程序的同时,公开这个程序文件的MD5码,这样别人只需要在任何地方下载这个程序后做一次MD5,然后跟公开的这个MD5作一个比较就知道这个程序是否被第三方修改过。
  • 文件完整性验证,比如当下载一个文件时,服务器返回的信息中包括这个文件的md5,在本地下载完毕时进行md5,将两个md5值进行比较,如果一致则说明文件完整没有丢包现象。
  • 文件上传,比如百度云实现的秒传,就是对比你上传的文件md5在百度服务器是否已经存在了。

5、C/C++中MD5的使用

  • 方式一:openssl库中有很多用于摘要哈希、加密解密的算法,方便集成于工程项目,被广泛应用于网络报文中的安全传输和认证。其中MD5算法在openssl库也有被实现。

    // 方法一:
    #include<stdio.h>
    #include<openssl/md5.h>
    #include<string.h>
    
    int main( int argc, char **argv )
    {
        MD5_CTX ctx;
        unsigned char *data="123";
        unsigned char md[16];
        char buf[33]={'\0'};
        char tmp[3]={'\0'};
        int i;
    
        MD5_Init(&ctx);
        MD5_Update(&ctx,data,strlen(data));
        MD5_Final(md,&ctx);
    
        for( i=0; i<16; i++ ){
        	sprintf(tmp,"%02X",md[i]);
        	strcat(buf,tmp);
        }
    	printf("%s\n",buf);
    	return 0;
    }
    
    // 输出:
    // 202CB962AC59075B964B07152D234B70
    
    // 方法二:
    #include<stdio.h>
    #include<openssl/md5.h>
    #include<string.h>
    
    int main( int argc, char **argv )
    {
        unsigned char *data = "123";
        unsigned char md[16];
        int i;
        char tmp[3]={'\0'},buf[33]={'\0'};
        MD5(data,strlen(data),md);
            for (i = 0; i < 16; i++){
            sprintf(tmp,"%2.2x",md[i]);
            strcat(buf,tmp);
    	}
        printf("%s\n",buf);
        return 0;
    }
    // 输出:
    // 202cb962ac59075b964b07152d234b70
    
    // 总结:两种实现方式,一样的结果。相比较,第二种方法更直观简单些。
    
  • 方式二:除了直接使用openssl,还可以将openssl库中的MD5代码拿下来简单封装,这样之后可以便捷的移植到其他项目中,而不用每次下载编译openssl库。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值