linux 中可以使用 md5sum :计算 md5 哈希值
- 可以从 stdin 读入内容
- 也可以在命令行参数中传入文件名列表;
# 什么是 MD5 算法
MD5 讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个 128 位元(16 位元组)的散列值(hash value),用于确保信息传输完整一致。
可以用来在不存储用户密码的情况下,进行用户输入的密码是否正确的判断过程
# MD5 功能
输入任意长度的信息,经过处理,输出为 128 位的信息(数字指纹);
不同的输入得到的不同的结果(唯一性);
# MD5 无法解密
一个 MD5 理论上的确是可能对应无数多个原文的,因为 MD5 是有限多个的而原文可以是无数多个。比如主流使用的 MD5 将任意长度的 “字节串映射为一个 128bit 的大整数。也就是一共有 种可能,大概是 ,这个数字是有限多个的,而但是世界上可以被用来加密的原文则会有无数的可能性。
MD5 加密无法解密,是很安全的。并且实际情况也是很多 http 请求用的都是 MD5 加密。从技术的角度讲,MD5 真的很安全,因为无法解密,破解 MD5 的方式只有一个:撞库
理论上 md5 加密是不可逆的,但是为什么有一些网站可以实现解密呢?
其实 md5 解密就是这些解密网站的服务器一直在进行随机的加密,
然后把加密的内容和加密后的内容存在数据库。

date: 2021-10-10 500TB 哈哈哈
解密的时候检查有没有重复的,有重复的调用加密的数据就可以。
只要稍微复杂的内容是没办法解密的。
# MD5 用途
防止被篡改:
1)比如发送一个电子文档,发送前,我先得到 MD5 的输出结果 a。然后在对方收到电子文档后,对方也得到一个 MD5 的输出结果 b。如果 a 与 b 一样就代表中途未被篡改。
2)比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的 MD5 输出结果。
3)SVN 在检测文件是否在 CheckOut 后被修改过,也是用到了 MD5.防止直接看到明文:
现在很多网站在数据库存储用户的密码的时候都是存储用户密码的 MD5 值。这样就算不法分子得到数据库的用户密码的 MD5 值,也无法知道用户的密码。(比如在 UNIX 系统中用户的密码就是以 MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成 MD5 值,然后再去和保存在文件系统中的 MD5 值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。)防止抵赖(数字签名):
这需要一个第三方认证机构。例如 A 写了一个文件,认证机构对此文件用 MD5 算法产生摘要信息并做好记录。若以后 A 说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是 A 写的了。这就是所谓的 “数字签名”。
# MD5 算法过程
对 MD5 算法简要的叙述可以为:MD5 以 512 位分组来处理输入的信息,且每一分组又被划分为 16 个 32 位子分组,经过了一系列的处理后,算法的输出由四个 32 位分组组成,将这四个 32 位分组级联后将生成一个 128 位散列值。
第一步、填充:如果输入信息的长度 (bit) 对 512 求余的结果不等于 448,就需要填充使得对 512 求余的结果等于 448。填充的方法是填充一个 1 和 n 个 0。填充完后,信息的长度就为 N*512+448 (bit);
第二步、记录信息长度:用 64 位来存储填充前信息长度。这 64 位加在第一步结果的后面,这样信息长度就变为 位。
第三步、装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A=(01234567) 16,B=(89ABCDEF) 16,C=(FEDCBA98) 16,D=(76543210) 16)。
第四步、四轮循环运算:循环的次数是分组的个数(N+1)