zoukankan      html  css  js  c++  java
  • MD5 算法

    因为要保证数据的完整一致性,采用了MD5算法。然后做一个简单的了解

    一、MD5概念
    MD5,全名Message Digest Algorithm 5 ,中文名为消息摘要算法第五版,
    为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
    上面这段话话引用自百度百科,MD5是一种信息摘要算法,主要是通过特定的hash散列方法将文本信息转换成简短的信息摘要
    压缩+加密+hash算法的结合体,是绝对不可逆的。


    二、MD5计算步骤  
    MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
    第一步、填充
         如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。
         填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit);


    第二步、记录信息长度
         用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N*512+448+64=(N+1)*512位。


    第三步、装入标准的幻数(四个整数)
         标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。有点晕哈,其实想一想就明白了。


    第四步、四轮循环运算
         循环的次数是分组的个数(N+1)
       1)将每一512字节细分成16个小组,每个小组64位(8个字节)    
       2)先认识四个线性函数(&是与,|是或,~是非,^是异或)
       
       
    三、MD5应用
    1.密码
      可以当做密码验证,为了保证密码不在cmd5网站上破译,最好加盐及乱序,也可以只取一半md5的长度。md5是不可逆算法,只要保证算法不变,就能和数据库中的md5相匹配。

    2.搜索
      以搜索为例,你输入“csdn 博客” 和 输入“博客 csdn”的结果是不一样的,因为你搜索的时候他们对应的md5是不一样的,他们可以根据这个md5去查询内容。

    3.版权
      当一个视频或者音频创作出来的时候它的md5是唯一的,若以后有翻录等版本出来,即使画质,声音,文件名都一样,但是他们的md5验证是不一样的,所以可以验证版权。还比如用某一账户下载的视频它的账户信息也回和视频一起md5操作,如果以后这个人私自传播通过md5就可以去数据库中查找泄露版权的情况。

    4.文件完整性的校验
      当下载一个文件时,服务器返回的信息中包括这个文件的md5,在本地下载完毕时进行md5,将两个md5值进行比较,如果一致则说明文件完整没有丢包现象。

    5.文件上传
      文件上传时会上传文件的信息此时将文件的md5上传,服务器中存储这个md5值,并存储这个md5值所对应的已上传字节长度,比如未上传对应为0,已上传对应为-1,已上传200字节就对应200,这个上传的时候可以匹配到这个文件在服务器中的状态,方便做断点续传,只要源文件没有更改,即使换个名字,换个账户都可以在服务器找到对应的文件,所以当服务器中有已经上传完毕的此文件时,别人再上传这个文件就可以实现秒传。



    四、说明
         对于MD5算法,不同的读取格式产生的字节流是不一样的,而且涉及计算可能需要数据格式转换,如把bit转换成一定的整型数据方便计算,因此,不同MD5算法实现版本算出的结果可能有很大不一样。
    因此,我觉得最好多次计算的MD5算法版本一致。关于MD5算法,有一个比较好的在线计算工具,点击MD5在线计算器。
    MD5算法是不可逆的,但是,基于键值对的字典关系原理,有一些收集海量MD5信息与摘要的数据库,采用枚举法能够从MD5值找到原文本信息,提供一个类似的工具,点击MD5在线破解。

  • 相关阅读:
    COOKIE和SESSION有什么区别?
    JSP中三大指令
    JSP中out.print()、out.println()以及out.write()的区别
    Linux实战教学笔记06:Linux系统基础优化
    Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)
    Linux实战教学笔记04:Linux命令基础
    Linux实战教学笔记03:操作系统发展历程及系统版本选择
    Linux实战教学笔记02:计算机系统硬件核心知识
    Linux实战教学笔记01:计算机硬件组成与基本原理
    从零开始学Python第八周:网络编程基础(socket)
  • 原文地址:https://www.cnblogs.com/hello-wei/p/11387396.html
Copyright © 2011-2022 走看看