[信息-摘要算法]MD5算法研究
综述
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被 "压缩 "成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和C语言源代码在Internet RFCs 1321中有详细的描述(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IEFT提交。
Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验和将产生MD2冲突。MD2算法的加密后结果是唯一的--既没有重复。
为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位Damg?rd/Merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den Boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。
尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了MD5以外,其中比较有名的还有SHA-1、RIPE-MD以及HAVAL等。
一年以后,即1991年,Rivest开发出技术上更为趋近成熟的MD5算法。它在MD4的基础上增加了 "安全-带子 "(Safety-Belts)的概念。虽然MD5比MD4稍微慢一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den Boer和Bosselaers曾发现MD5算法中的假冲突(Pseudo-Collisions),但除此之外就没有其他被发现的加密后结果了。
Van Oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(Brute-Force Hash Function),而且他们猜测一个被设计专门用来搜索MD5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5算法的MD6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中的问题。并且,由于MD5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。
算法的应用
MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:
MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461
这就是tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算MD5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的 "抵赖 ",这就是所谓的数字签名应用。
[解决办法]
厉害!
[解决办法]
学习。。。
[解决办法]
建议你不要学这篇文章,错误的概念有不少。
举两个例子:
======部分原文======
MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461
这就是 tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算MD5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的 "抵赖 ",这就是所谓的数字签名应用。
====部分原文结束======
错误:MD5是文件的数字签名吗?这个作者缺乏数字签名的基本概念。
MD5的典型应用是:实现数据完整性。可以用如下方式之一来完成。
产生消息的摘要,即计算MD5(M)。
1)将消息发出,并将MD5(M)保存在一个安全信道中。一个例子是很多网站提供下载文件和文件的MD5(m),以确保文件没有被改动。这里有个假设就是网站的内容不会被人轻易的篡改。如果一个hacker 攻破了某个服务器,将某个文件替换,并把相应的MD5值也更改了,这个方案就失效了;
2)将MD5(m)值加密,
======部分原文======
正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为 "跑字典 "的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P(62,2)….+P (62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的应用于UNIX系统中,这也是为什么UNIX系统比一般操作系统更为坚固一个重要原因。
====部分原文结束======
错误: 这个作者根本就不明白什么是字典攻击.他说的是穷举攻击.字典攻击是利用人们普遍使用易记的单词或数字作密码, 使用概率递减的方式来做个试验密码(字典中的词按照可能性递减),这样能大大提高搜索效率. 破解者将字典中的词都预先计算好对应的hash值.UNIX系统为了抵抗这种攻击,一个是使用系统策略,如强制最小密码长度, 不允许使用单词作为口令等等... 二 是在hash的时候加入盐值, 增加字典的成本,UNIX系统一般采用12位的盐值.
文中给出的MD5算法描述,在任何一本密码学书都能找到.
[解决办法]
同意Jamesonang
MD5是数字签名的一部分
私钥加密( MD5( 文本 ))---〉 数字签名
hash校验应用最广的地方就是身份认证了
不过现在MD5被攻破了
现在应用较广的是SHA
[解决办法]
一般认为 MD5 是抗碰撞的单向 Hash 函数 , 即经过MD5变换得到消息摘要可以唯一确定这个消息 M。所以在数字签名的时候,往往不直接对消息 M 本身签名,而是对 消息的摘要进行签名。为的是节约计算时间和减少签名的大小。 公钥算法往往是费时的。
To :jiangbin00cn(地方可怕)
Hash 校验用的广泛的地方是 数据完整性,而非身份认证。如何用,在上面的帖子已经简单的说了。
身份认证采用如下方式之一进行:(根据安全需求决定)
1) 口令
1. 1 固定口令方案 (例子:操作系统的用户登陆 。hash 函数在这里有应用)
1.2 PIN 和通行密钥 (PIN 例子: 你的银行卡。没卡不能取钱,有卡不知道密码也不能取钱。PIN 提供两层保护 一层是物理(实物)的,一层是密码学的);
2)挑战-响应身份认证。 这是比较高级的方式(相对口令来说)。不介绍了,要介绍太长了。
更详细的内容可以参考 《应用密码学手册》。
MD5 被攻破了,SHA-1 也不远了 。但实践中,利用理论结果还是很困难的,特别是对个人用户。当然,美国国家安全局有这个计算能力。
=========
总之看了这篇文章,一肚子的火。这个作者有很多基本的概念没弄清楚,还要写 MD5 算法研究。如果这个作者能看这看看,我还还想告诉他:
UNIX 系统的 passwd 保护密码的方式,不是使用 MD5, 而是使用的一个 DES 变形 (实际上是消息认证码)。简单的讲:
1) 增加了轮转数(25轮)。标准DES 轮转数是16,目的是增加破解破解者的计算量。
2) 加入盐值,挫败离线预计算的字典攻击,并且 DES 的扩展置换取决于盐值,使硬件 DES 破解机 不能派上用场(标准 DES 扩展置换是固定的)。
如果这个作者生活在一个法制健全的社会,可能会惹上官司。因为他给出的一些实现细节片断,明显来自RSA 安全公司的 MD5 实现。而在原实现文件的开头,有下面的申明。
***********************************************************************
** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **
** **
** License to copy and use this software is granted provided that **
** it is identified as the "RSA Data Security, Inc. MD5 Message- **
** Digest Algorithm " in all material mentioning or referencing this **
** software or this function. **
** **
** License is also granted to make and use derivative works **
** provided that such works are identified as "derived from the RSA **
** Data Security, Inc. MD5 Message-Digest Algorithm " in all **
** material mentioning or referencing the derived work. **
** **
** RSA Data Security, Inc. makes no representations concerning **
** either the merchantability of this software or the suitability **
** of this software for any particular purpose. It is provided "as **
** is " without express or implied warranty of any kind. **
** **
** These notices must be retained in any copies of any part of this **
** documentation and/or software. **
***********************************************************************
没有经过仔细的研读和脚踏实地的实践,还是不要轻易写文章放在公众区域。还是写一些学习笔记相互交流一下吧,这种貌似教程的东西少写为妙,真正的专家除外。
看贴的人要小心,互连网是一个具有极高性噪比的地方,特别是国内的一些XXX网,只能作为参考或者是一道辨析题。
[解决办法]
to Jamesonang(Jameson Ang)
在身份认证系统里,最重要的是服务器怎么存用户口令信息
如果直接保存用户的口令,服务器被攻破的话将导致用户口令外泄。用加密算法加密口令也一样存在这种可能性。
因此在服务器上一般都保存用户口令的hash值
这样既能进行用户的身份认证,又不存在泄漏用户口令的可能性,因为hash在理论上是不可逆转的。
[解决办法]
> > 在身份认证系统里,最重要的是服务器怎么存用户口令信息
hash 确实可以保证口令的,但这本省并不是身份认证,口令是身份认证的一种。这只是个概念问题。
口令用作身份认证的时候,往往需要hash进行额外的保护,而这个保护并不是认证。
[解决办法]
而且(固定)口令(即很多操作系统使用的登陆系统)只是身份认证中最弱的一种方式。其他方式在上面也讲了点。
------解决方案--------------------
to Jamesonang(Jameson Ang)
关于身份认证的问题我认为你理解上有些不对
1) 口令
固定口令方案 (例子:操作系统的用户登陆 。hash 函数在这里有应用)
PIN 和通行密钥 (PIN 例子: 你的银行卡。没卡不能取钱,有卡不知道密码也不能取钱。PIN 提供两层保护 一层是物理(实物)的,一层是密码学的);
2)挑战-响应身份认证。 这是比较高级的方式(相对口令来说)。不介绍了,要介绍太长了。
////////////////////////////////////////
上面三种方法的本质都是一个预共享密钥
这也是身份认证的本质,服务器和客户端共享某个特有的不容易被猜到的信息
PIN 和通行密钥 这和固定口令方式没有本质的区别,它不过是写入硬件而已
挑战-响应身份认证 这是现在用的最广的身份认证方式,不过它也还是共享密钥。不过它有个好处不用在网络上传递口令信息,所以不用hash保护
[解决办法]
这些问题牵涉一些概念,实际上怎么回事,我想我们都知道。
我的概念来自于《应用密码学手册》这本书。
书中提及认证的基础。包括:
1) 已知事物 (比如密码)
2) 已有事物 (比如银行卡及密码,即PIN)
3) 固有事物 ( 比如指纹,视网膜,这是非密码学的)
所以密码学用来认证的手段包括: 利用已知事物来识别身份,比如口令,暗号。 也可以利用已有事物 ,比如 手持密钥通行证(非固定密码,类似一个计算器,每次使用密码都会改变,搞财务报过税的人应该知道),银行卡借寄卡(额外加密码,可以得到双重保护,每个人都有),银行信用卡(不用密码,而使用手写签名进行第二重保护)。
显然基于已有事物的认证方法,是不需要 hash 保护密码的。尽管有时候,基于已有事物的认证会和基于已知事物的认证一起使用。
我们不能把应用都限制在计算机及其网络上。所以,我说 hash 只是用来保护口令,而不是身份认证,身份认证包含的更广, hash 在很多地方都用到了,更多的是数据完整性。(这是我的意思)