简介
MD5(Message-Digest Algorithm,对应的中文名为消息摘要算法)是计算机安全领域广泛使用的散列函数(又称哈希算法、摘要算法),可以产生出一个128位(16字节)的散列值(hash value),主要用来确保信息(message)传输完整和一致。常见的应用场景有密码保护、下载文件校验等。
算法原理
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值
MD5的特点
长度固定
不管多长的字符串,加密后长度都是一样长
作用
方便平时信息的统计和管理。
易计算
字符串和文件加密的过程是容易的。
作用
开发者很容易理解和做出加密工具。
细微性
一个文件,不管多大,小到几k,大到几G,你只要改变里面某个字符,那么都会导致MD5值改变。
作用
很多软件和应用在网站提供下载资源,其中包含了对文件的MD5码,用户下载后只需要用工具测一下下载好的文件,通过对比就知道该文件是否有过更改变动。
不可预测
输入内容做轻微改变,输出都大相径庭。
不可逆性
你明明知道密文和加密方式,你却无法反向计算出原密码。
作用
基于这个特点,很多安全的加密方式都会用到,大大提高了数据的安全性。
恒定性
同样的输入,通过md5算法,经过同样的迭代次数,产生的输出一定是相同的。
应用场景
文件传输(一致性验证)
对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在Unix下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本。
大致结构如下:
# 通过将整个文件作为一个大文本信息进行MD5 MD5(demo.tar.gz) = 38b8c2c1093dd0fec383a9d9ac940515 复制代码
MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。
举例说明:
我们常常在某些软件下载站点的某软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。
具体来说,文件的MD5值就像是这个文件的“数字指纹”。任何一个文件,无论是可执行程序、图像文件、临时文件或者其他任何类型的文件,也不管它体积多大,都有且只有一个独一无二的MD5信息值,如果任何人对文件做了任何改动,其MD5值(也就是对应的“数字指纹”)就会发生变化。比如,下载服务器针对一个文件预先提供一个MD5值,用户下载完该文件后,用我这个算法重新计算下载文件的MD5值,通过比较这两个值是否相同,就能判断下载的文件是否出错,或者说下载的文件是否被篡改了。
利用 MD5 算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。
数字签名
对一段信息产生数字指纹,以防止被“篡改”。
举个例子,你将一段话写在一个叫readme.txt
文件中,并对这个readme.txt
产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
安全访问认证(密码加密)
MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方面。比如,在Unix系统中,用户的密码是以 MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行 MD5 哈希运算,然后再去和保存在文件系统中的 MD5 值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。
操作示例
# 创建文件 $ echo "hello world" > demo.txt # 对文件进行 MD5 $ md5sum demo.txt 6f5902ac237024bdd0c176cb93063dc4 demo.txt # 对文件进行 MD5 $ md5sum demo.txt > demo.txt.md5 $ cat demo.txt.md5 6f5902ac237024bdd0c176cb93063dc4 demo.txt # 检测 MD5 值,发现 MD5 值完全匹配 $ md5sum -c demo.txt.md5 demo.txt: OK # 修改文件 $ echo '宇宙大爆炸' >> demo.txt $ cat demo.txt hello world 宇宙大爆炸 # 重新检测 MD5 值,发现 MD5 已经和原有值不匹配了 $ md5sum -c demo.txt.md5 demo.txt: FAILED md5sum: WARNING: 1 computed checksum did NOT match 复制代码
其他相关问题
MD5码不是128位吗,为何得出来是32位的?
128位是指二进制位。二进制太长,所以一般都改写成16进制,每一位16进制数可以代替4位二进制数,所以128位二进制数写成16进制就变成了128/4=32
位。
什么是MD5加盐?
比如我的银行密码是123456
- 得到的MD5是:
827ccb0eea8a706c4c34a16891f84e7b
- 一个人截取到这个密文,那么通过撞库肯定容易撞出
123456
- 我们要做的就是加盐,银行密码还是
123456
,然后我把银行密码加上我特定的字符串才计算MD5(所以密码还是那个密码,但是变成求123456987
的MD5值),之后得到MD5,那么这个存入本库的MD5起码可以确保那个数据库不会有。