文章目录
一、消息摘要算法介绍
消息摘要算法(又称:哈希算法、哈希函数、散列函数),是一种将任意长度的数据映射为固定长度数据的算法。消息摘要算法通过对数据进行计算,生成一个固定长度的哈希值,就像数据的 “指纹”。无论原始数据有多长,相同的算法对相同的数据进行计算,都会得到相同的哈希值。其主要作用包括:
- 数据完整性验证:通过比较数据在传输前后的哈希值,可判断数据是否被篡改。
- 数字签名:在数字签名方案中,通常会对消息的哈希值进行签名,而不是对整个消息签名,以提高效率和安全性。
- 数据加密:某些加密算法中会使用哈希值来增强安全性。
常见的加密技术有: MD5
、SHA系列
、HMAC
、SM3
,博主将分文章挨个介绍。
二、MD5介绍
MD5(Message-Digest Algorithm 5)是由美国密码学家罗纳德・李维斯特(Ronald Linn Rivest)设计,于 1992 年公开的一种广泛使用的密码散列函数。它可以将任意长度的输入数据通过特定的算法转换为一个固定长度的哈希值。
三、MD5的特点
-
涉及明文(加密前的值)和密文(加密后的值)。
-
明文不变,
密文不变
(不管用什么md5加密工具得到的密文都一样,如果网站没有加盐的情况下,可以直接套库就可以了) -
不管明文多长,密文始终是 32 位字符串或者16位字符串 。32 位 MD5,就是 32 个十六进制数,即 16 个字节。16 位 MD5 的运算过程和 32 位 MD5 的运算过程一样,只是 16 位 MD5 最后取运算结果的中间 8 个字节。
-
不可逆
四、如何一眼识别MD5加密?
4.1 长度判断
- 32 位字符串或者16位字符串:可能是MD5。
- 排除其他算法:如SHA-1(40字符)、SHA-256(64字符)等。
4.2 验证字符集
- 仅包含十六进制字符:确保哈希值只包含
0-9
和a-f(a、b、c、d、e、f)
。注意事项:哈希密文虽然是小写,但是别人也许会在生成后用.toUpperCase()
全部转大写。 - 无其他字符:如
g-z
、空格、特殊符号等。
4.3 搜索初始化变量
MD5 的初始哈希值(IV)为 4 个 32 位变量,十六进制表示如下:
IV = [
0x67452301,
0xEFCDAB89,
0x98BADCFE,
0x10325476
]
小技巧:可以将MD5初始化变量作为 MD5的特征值,没有魔改的情况下搜索十六进制值,如果搜不到,复制去控制台输出转换后搜索。 如果搜到了,点击进入MD5内部,打上断点,重新触发断点,从堆栈(Call Stack
,堆栈运行逻辑从下往上) ,从上往下依次查看哪里调用了特征值,就可以找到加密位置。
4.4 搜索密钥填充值
MD5也是有密钥填充值的可以用作搜索的关键词,默认key:
- 小写:0123456789abcdef
- 大写:0123456789ABCDEF
那么我们是不是可以搜索:0123456789?abcdef?ABCDEF?
4.5 库函数或自定义函数
如果代码中使用了MD5相关的库(如CryptoJS)或函数名包含MD5
,可确认是MD5哈希。
4.6 自用小技巧
遇到需要登录网站,用 123456
当密码进行测试,如果返回的加密值开头为 e10
、49
就可以快速判断
- 32 位的md5密文:
e10adc3949ba59abbe56e057f20f883e
- 16 位的md5密文:
49ba59abbe56e05
五、实现MD5加密
5.1 JS实现MD5加密
-
crypto-js模块
// 使用CryptoJS库生成MD5哈希值 const CryptoJS = require('crypto-js'); // 示例数据 const data = "123456"; const hash = CryptoJS.MD5(data).toString(); console.log("Hash密文:", hash); // 输出 32 字符十六进制字符串 console.log("Hash密文长度:", hash.length);
运行结果:
Hash密文: e10adc3949ba59abbe56e057f20f883e Hash密文长度: 32
-
Node.js 内置 crypto 模块支持 MD5:
const crypto = require('crypto'); // 计算哈希 const msg = "123456"; const hash = crypto.createHash('md5').update(msg).digest('hex'); console.log("Hash密文:", hash); // 输出 32 字符十六进制字符串 console.log("Hash密文长度:", hash.length); // 带编码的示例(如需指定) const buffer = Buffer.from(msg, 'utf-8'); const hashHex = crypto.createHash('md5').update(buffer).digest('hex'); console.log("Hash密文:", hashHex); // 输出 32 字符十六进制字符串 console.log("Hash密文长度:", hashHex.length);
运行结果:
Hash密文: e10adc3949ba59abbe56e057f20f883e Hash密文长度: 32 Hash密文: e10adc3949ba59abbe56e057f20f883e Hash密文长度: 32
5.2 Python实现MD5加密
在 Python 中,可以使用 hashlib 库来实现 MD5 加密:
import hashlib
def md5_encrypt(text):
# 创建 MD5 对象
md5 = hashlib.md5()
# 对输入的文本进行编码
text_encoded = text.encode('utf-8')
# 更新 MD5 对象的内容
md5.update(text_encoded)
# 获取加密后的十六进制字符串
encrypt_text = md5.hexdigest()
return encrypt_text
# 示例使用
if __name__ == "__main__":
text = "123456"
encrypt_text = md5_encrypt(text)
print(f"原始文本:{text}")
print(f"Hash密文: {encrypt_text}")
print(f"Hash密文长度: {len(encrypt_text)}")
运行结果:
原始文本:123456
Hash密文: e10adc3949ba59abbe56e057f20f883e
Hash密文长度: 32