1. 介绍
MD5消息摘要算法(Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国设计,于1992年公开,用以取代MD4算法。
2. 应用
● 在网络传输时,对比源文件和目标文件md5 一致,则表示文件传输无异常。
● SVN在检测文件是否在CheckOut后被修改过
● 网站用户密码保存
系统把用户输入的密码计算成MD5值,和保存在文件系统中的MD5值比较。系统在不知道用户密码明码的情况下就可以确定用户登录系统的合法性,避免了用户的密码被具有系统管理员权限的用户知道。很多网站在数据库存储存储用户密码的MD5值。这样不法分子得到数据库数据也没什么用。 但是如果常用的密码先MD5处理,把数据存储起来,然后再跟大量用户MD5结果匹配,这时就有可能得到明文。所以网站密码的策略是强制要求用户使用数字大小写字母的组合的来提高安全度。
● Linux用 md5sum 命令可以得到文件的md5值
可以验证文件内容是否发生了改变,间接地还可以检验两个文件内容是否完全相同。因为md5sum是读取文件内容来计算校验码的,因此只能验证文件内容,而无法验证文件属性(比如文件名、权限和类型)。
md5sum相比diff的逐行比较,md5sum的速度快的多的多,特别是大文件的时候,而且md5可以实现多个文件比较。
3. 简单原理
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。(具体的算法实现比较复杂,网上有各种语言的实现,是公开的)
使用的是hash算法,在计算过程中原文的部分信息是丢失了的。 MD5是不可逆的。
4. 安全性
md5校验,有很小的概率不同的文件生成的md5可能相同。但是概率是2的128次方分之一,是一个天文数字。但是一个MD5理论上是可能对应无数多个原文的,因为MD5是有限多个的而原文可以是无数多个。但是没有认为攻击情况下,md5值是非常安全的。
但是有工具可以生成两个md5一样的文件。比如生成file1和file2。上传file1,然后上传file2。上传file2时提示“极速秒传”。百度认为是两个一样的文件,这说明百度云的判断标准是MD5校验。后面百度云说是有是做了更多安全的校验。
可以人为的做出具有相同MD5校验值的不同程序,那用MD5校验作为文件检查的方式自然不那么可靠了。比如下载的病毒程序与安全网站提供的MD5完全相同的话,那就危险了。
有的人认为md5不属于加密算法,因为觉得不能从密文反过来得到原文,即没有解密算法,所以这部分人认为MD5只能属于算法;认为属于的人是因为他们觉得经过MD5处理后看不到原文,即已经将原文加密,所以认为MD5属于加密算法。