【问题标题】:How does MD5Sum algorithm work?MD5Sum 算法是如何工作的?
【发布时间】:2022-05-05 09:40:59
【问题描述】:

Md5sum 用于检查说 ubuntu 的 iso 映像的完整性。它是如何工作的?

【问题讨论】:

  • 这里的大多数答案都解释了 MD5 的工作原理,而不是 MD5Sum 的工作原理。例如,它是否将文件大小与文件中每一位的每一位相结合?它是否直接处理整个文件?我对这些东西很感兴趣,我想提问者也是。散列可以在许多不同的事情上完成,但它如何应用于文件以产生校验和是不同的
  • 所有 md5sum 所做的就是执行 MD5。它可能适用于多个文件,但仍会为每个文件生成一个 MD5。完全没有区别。

标签: md5


【解决方案1】:

Message Digest 5 或 MD5 算法,它是一种单向加密散列函数。 MD5 对“消息”(二进制数据,例如 iso 图像)执行许多二进制操作,以计算 128 位“哈希”。

检查下载的包(例如 ubuntu)的完整性很有用,因为如果包与经过身份验证的源完全相同,则生成的 MD5 哈希将是相同的。如果下载中出现错误(来自网络干扰等),或者如果您下载了一个看起来像 ubuntu 但包含其他代码/其他代码的恶意包,那么 MD5 将不匹配,您会知道有些不同,并且您应该从其他来源重新下载。

更新

如果以上内容对您来说“它是如何工作的”不够字面上解释,这里是我自己的 MD5 算法的 javascript 实现:

/**
 * JavaScript Class Implementation of RSA Data Security, Inc.
 * Message Digest 5 (MD5) Algorithm, as defined in RFC 1321.
 * 
 * @author    Dustin C. Fineout <dustin.fineout@gmail.com>
 * @created   10/10/2009 11:23:29 AM
 * @modified  10/10/2009 12:34:56 PM
 * @version   0.1 WORKING
**/

/**
 * Usage example:
 * var md5 = new MD5();
 * alert(md5.hash('Dustin Fineout')); // 8844be37f4e8b3973b48b95b0c69f0b1
**/
function MD5()
{
  this.F = function(x,y,z) { return (x & y) | ((~x) & z); };
  this.G = function(x,y,z) { return (x & z) | (y & (~z)); };
  this.H = function(x,y,z) { return (x ^ y ^ z); };
  this.I = function(x,y,z) { return (y ^ (x | (~z))); };
  this.C = function(q,a,b,x,s,ac) { return this.addu(this.rol(this.addu(this.addu(a,q),this.addu(x,ac)),s),b); };
  this.FF = function(a,b,c,d,x,s,ac) { return this.C((b & c) | ((~b) & d),a,b,x,s,ac); };
  this.GG = function(a,b,c,d,x,s,ac) { return this.C((b & d) | (c & (~d)),a,b,x,s,ac); };
  this.HH = function(a,b,c,d,x,s,ac) { return this.C(b ^ c ^ d,a,b,x,s,ac); };
  this.II = function(a,b,c,d,x,s,ac) { return this.C(c ^ (b | (~d)),a,b,x,s,ac); };

  this.hash = function(message)
  {
    var xl,x=[],k,aa,bb,cc,dd,a=0x67452301,b=0xEFCDAB89,c=0x98BADCFE,d=0x10325476;
    x = this.convertToWordArray(this.utf8Encode(message));
    xl = x.length;
    for (var j = 0; j < xl; j += 16) {
      aa=a; bb=b; cc=c; dd=d;
      a=this.FF(a,b,c,d,x[j+0],7,0xD76AA478);
      d=this.FF(d,a,b,c,x[j+1],12,0xE8C7B756);
      c=this.FF(c,d,a,b,x[j+2],17,0x242070DB);
      b=this.FF(b,c,d,a,x[j+3],22,0xC1BDCEEE);
      a=this.FF(a,b,c,d,x[j+4],7,0xF57C0FAF);
      d=this.FF(d,a,b,c,x[j+5],12,0x4787C62A);
      c=this.FF(c,d,a,b,x[j+6],17,0xA8304613);
      b=this.FF(b,c,d,a,x[j+7],22,0xFD469501);
      a=this.FF(a,b,c,d,x[j+8],7,0x698098D8);
      d=this.FF(d,a,b,c,x[j+9],12,0x8B44F7AF);
      c=this.FF(c,d,a,b,x[j+10],17,0xFFFF5BB1);
      b=this.FF(b,c,d,a,x[j+11],22,0x895CD7BE);
      a=this.FF(a,b,c,d,x[j+12],7,0x6B901122);
      d=this.FF(d,a,b,c,x[j+13],12,0xFD987193);
      c=this.FF(c,d,a,b,x[j+14],17,0xA679438E);
      b=this.FF(b,c,d,a,x[j+15],22,0x49B40821);
      a=this.GG(a,b,c,d,x[j+1],5,0xF61E2562);
      d=this.GG(d,a,b,c,x[j+6],9,0xC040B340);
      c=this.GG(c,d,a,b,x[j+11],14,0x265E5A51);
      b=this.GG(b,c,d,a,x[j+0],20,0xE9B6C7AA);
      a=this.GG(a,b,c,d,x[j+5],5,0xD62F105D);
      d=this.GG(d,a,b,c,x[j+10],9,0x2441453);
      c=this.GG(c,d,a,b,x[j+15],14,0xD8A1E681);
      b=this.GG(b,c,d,a,x[j+4],20,0xE7D3FBC8);
      a=this.GG(a,b,c,d,x[j+9],5,0x21E1CDE6);
      d=this.GG(d,a,b,c,x[j+14],9,0xC33707D6);
      c=this.GG(c,d,a,b,x[j+3],14,0xF4D50D87);
      b=this.GG(b,c,d,a,x[j+8],20,0x455A14ED);
      a=this.GG(a,b,c,d,x[j+13],5,0xA9E3E905);
      d=this.GG(d,a,b,c,x[j+2],9,0xFCEFA3F8);
      c=this.GG(c,d,a,b,x[j+7],14,0x676F02D9);
      b=this.GG(b,c,d,a,x[j+12],20,0x8D2A4C8A);
      a=this.HH(a,b,c,d,x[j+5],4,0xFFFA3942);
      d=this.HH(d,a,b,c,x[j+8],11,0x8771F681);
      c=this.HH(c,d,a,b,x[j+11],16,0x6D9D6122);
      b=this.HH(b,c,d,a,x[j+14],23,0xFDE5380C);
      a=this.HH(a,b,c,d,x[j+1],4,0xA4BEEA44);
      d=this.HH(d,a,b,c,x[j+4],11,0x4BDECFA9);
      c=this.HH(c,d,a,b,x[j+7],16,0xF6BB4B60);
      b=this.HH(b,c,d,a,x[j+10],23,0xBEBFBC70);
      a=this.HH(a,b,c,d,x[j+13],4,0x289B7EC6);
      d=this.HH(d,a,b,c,x[j+0],11,0xEAA127FA);
      c=this.HH(c,d,a,b,x[j+3],16,0xD4EF3085);
      b=this.HH(b,c,d,a,x[j+6],23,0x4881D05);
      a=this.HH(a,b,c,d,x[j+9],4,0xD9D4D039);
      d=this.HH(d,a,b,c,x[j+12],11,0xE6DB99E5);
      c=this.HH(c,d,a,b,x[j+15],16,0x1FA27CF8);
      b=this.HH(b,c,d,a,x[j+2],23,0xC4AC5665);
      a=this.II(a,b,c,d,x[j+0],6,0xF4292244);
      d=this.II(d,a,b,c,x[j+7],10,0x432AFF97);
      c=this.II(c,d,a,b,x[j+14],15,0xAB9423A7);
      b=this.II(b,c,d,a,x[j+5],21,0xFC93A039);
      a=this.II(a,b,c,d,x[j+12],6,0x655B59C3);
      d=this.II(d,a,b,c,x[j+3],10,0x8F0CCC92);
      c=this.II(c,d,a,b,x[j+10],15,0xFFEFF47D);
      b=this.II(b,c,d,a,x[j+1],21,0x85845DD1);
      a=this.II(a,b,c,d,x[j+8],6,0x6FA87E4F);
      d=this.II(d,a,b,c,x[j+15],10,0xFE2CE6E0);
      c=this.II(c,d,a,b,x[j+6],15,0xA3014314);
      b=this.II(b,c,d,a,x[j+13],21,0x4E0811A1);
      a=this.II(a,b,c,d,x[j+4],6,0xF7537E82);
      d=this.II(d,a,b,c,x[j+11],10,0xBD3AF235);
      c=this.II(c,d,a,b,x[j+2],15,0x2AD7D2BB);
      b=this.II(b,c,d,a,x[j+9],21,0xEB86D391);
      a=this.addu(a,aa); b=this.addu(b,bb); c=this.addu(c,cc); d=this.addu(d,dd);
    }
    return (this.wordToHex(a)+this.wordToHex(b)+this.wordToHex(c)+this.wordToHex(d)).toLowerCase();
  };

  this.test = function()
  {
    if (this.hash('Dustin Fineout') == '8844be37f4e8b3973b48b95b0c69f0b1') {
      return true;
    }
    return false;
  };

  this.addu = function(x, y)
  {
    var ls = (x & 0xFFFF) + (y & 0xFFFF);
    return (((x >> 16) + (y >> 16) + (ls >> 16)) << 16) | (ls & 0xFFFF);
  };

  this.rol = function(v, s)
  {
    return (v << s) | (v >>> (32 - s));
  };

  this.utf8Encode = function(str)
  {
    return unescape(encodeURIComponent(str));
  };

  this.convertToWordArray = function(str)
  {
    var lWordCount;
    var lMessageLength = str.length;
    var lNumberOfWords_temp1=lMessageLength + 8;
    var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
    var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
    var lWordArray=new Array(lNumberOfWords-1);
    var lBytePosition = 0;
    var lByteCount = 0;
    while ( lByteCount < lMessageLength ) {
      lWordCount = (lByteCount-(lByteCount % 4))/4;
      lBytePosition = (lByteCount % 4)*8;
      lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount)<<lBytePosition));
      lByteCount++;
    }
    lWordCount = (lByteCount-(lByteCount % 4))/4;
    lBytePosition = (lByteCount % 4)*8;
    lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
    lWordArray[lNumberOfWords-2] = lMessageLength<<3;
    lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
    return lWordArray;
  };

  this.wordToHex = function(lValue)
  {
    var wordToHexValue="",wordToHexValue_temp="",lByte,lCount;
    for (lCount = 0;lCount<=3;lCount++) {
      lByte = (lValue>>>(lCount*8)) & 255;
      wordToHexValue_temp = "0" + lByte.toString(16);
      wordToHexValue = wordToHexValue + wordToHexValue_temp.substr(wordToHexValue_temp.length-2,2);
    }
    return wordToHexValue;
  };
}

我很乐意根据需要进行注释或扩展 :) 另外,请注意这不是我仍然用于 JavaScript 命名空间的单例模式 - 实际上这是我第一次尝试这种模式 :p 有很多好吃的Douglas Crockford 提供的单例模式。

【讨论】:

  • 添加一点点花絮:MD5 算法(实际上是大多数加密哈希函数算法)的构造使得即使两个输入之间的一点差异都会导致哈希函数输出发生巨大变化。这个属性使得创建两个散列到相同输出的输入消息变得非常困难。
  • 这真的回答了这个问题吗?它似乎无法解释 MD5 的工作原理
  • 实际上是的,它在第一段中做了 - MD5 对“消息”(二进制数据,例如 iso 图像)执行许多二进制操作,以计算 128 位“哈希”。但是,如果您需要更字面的答案,让我挖掘一下我的 javascript 实现并发布它。您可以自己解释代码。没有太多有趣的事情发生:)
  • 假设它是客户端代码,这是否有任何漏洞?
  • 当然有,与任何代码一样,并且取决于您的用例和上下文:) 我不提供任何保证;这是 RFC 标准的简单实现,仅用于演示和教育目的。
【解决方案2】:

MD5Sum 是一个文件checksum 生成工具,使用MD5 作为哈希算法。它为用户提供了文件未被篡改的合理保证。

为此,用户需要(通过 shell 集成或手动)处理自己的 MD5 哈希并将其与上传者提供的哈希进行比较。

MD5Sum 哈希不能保证提供校验和的上传者没有修改文件,要做到这一点,您应该信任 MD5 校验和的来源(即从 Ubuntu 获取校验和而不是下载提供图片的网站)。

【讨论】:

    【解决方案3】:

    md5sum 是一种用于验证文件完整性的工具,因为实际上对文件的任何更改都会导致其 MD5 哈希值发生更改。

    最常见的是,md5sum 用于验证文件是否因文件传输错误、磁盘错误或非恶意干预而发生更改。 md5sum 程序包含在大多数Unix-like 操作系统或兼容层中,例如Cygwin

    您需要在 ISO 映像上运行 md5sum,它会输出如下内容:

    打开终端并执行以下命令:

    md5sum myisofile.iso > out.txt
    
    cat out.txt (this will output as below)
    
    myisofile.iso   f6de8b885f7a1917e5368fcb947d1738
    

    这个 MD5 哈希需要与源 myisofile.iso 进行比较。如果两个 MD5 哈希值相同,表示 ISO 未被篡改

    【讨论】:

      猜你喜欢
      • 2013-12-04
      • 2012-09-01
      • 1970-01-01
      • 2022-07-02
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      相关资源
      最近更新 更多