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还广泛用于加密和解密技术上 。比如在unix系统中用户的密码就是以md5(或其它类似的算 法)经加密后存储在文件系统中 。当用户登录的时候 , 系统把用户输入的密码计算成md5值,然后再去和保存在文件系统中的md5值进行比较,进而确定输入的 密码是否正确 。通过这样的步骤 , 系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性 。这不但可以避免用户的密码被具有系统管理员权限的 用户知道,而且还在一定程度上增加了密码被破解的难度 。
正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为"跑字 典"的方法 。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用md5程序计算出这些字典项的md5值,然后 再用目标的md5值在这个字典中检索 。我们假设密码的最大长度为8位字节(8 bytes),同时密码只能是字母和数字 , 共26+26+10=62个字符,排列组合出的字典的项数则是p(62,1)+p(62,2)….+p (62,8),那也已经是一个很天文的数字了,存储这个字典就需要tb级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码md5值的情况 下才可以 。这种加密技术被广泛的应用于unix系统中 , 这也是为什么unix系统比一般操作系统更为坚固一个重要原因 。
三、算法描述
对md5算法简要的叙述可以为:md5以512位分组来处理输入的信息 , 且每一分组又被划分为16个32位子分组,经过了一系列的处理后 , 算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值 。
在md5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448 。因此,信息的字节长度(bits length)将被扩展至n*512+448,即n*64+56个字节(bytes),n为一个正整数 。填充的方法如下,在信息的后面填充一个1和无数个 0,直到满足上面的条件时才停止用0对信息的填充 。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度 。经过这两步的处理 , 现在的信息字 节长度=n*512+448+64=(n+1)*512 , 即长度恰好是512的整数倍 。这样做的原因是为满足后面处理中对信息长度的要求 。
推荐阅读
- java代码使用ognl,java代码例子讲解
- 如何引流公司网站,网站 引流
- 安卓艾智驾app,艾智驾安装手机互联服务失败
- python函数len python累加求和
- 怎么做电商视频号教程,电商小视频怎么制作
- 不怎么玩游戏什么显卡适合,不怎么玩游戏什么显卡适合打游戏
- 直播伴侣贴牌,直播伴侣作用
- 利用python任意函数 用python编写一个函数
- u盘怎么设置uefi启动不了,u盘怎么设置uefi启动不了