- 密码学教程
- 密码学 - 首页
- 密码学 - 起源
- 密码学 - 历史
- 密码学 - 原理
- 密码学 - 应用
- 密码学 - 优点与缺点
- 密码学 - 现代
- 密码学 - 传统密码
- 密码学 - 加密需求
- 密码学 - 双重加密
- 密码系统
- 密码系统
- 密码系统 - 组件
- 密码系统攻击
- 密码系统 - 彩虹表攻击
- 密码系统 - 字典攻击
- 密码系统 - 暴力破解攻击
- 密码系统 - 密码分析技术
- 密码学类型
- 密码系统 - 类型
- 公钥加密
- 现代对称密钥加密
- 密码学散列函数
- 密钥管理
- 密码系统 - 密钥生成
- 密码系统 - 密钥存储
- 密码系统 - 密钥分发
- 密码系统 - 密钥吊销
- 分组密码
- 密码系统 - 流密码
- 密码学 - 分组密码
- 密码学 - Feistel 分组密码
- 分组密码操作模式
- 分组密码操作模式
- 电子密码本 (ECB) 模式
- 密码分组链接 (CBC) 模式
- 密码反馈 (CFB) 模式
- 输出反馈 (OFB) 模式
- 计数器 (CTR) 模式
- 经典密码
- 密码学 - 反向密码
- 密码学 - 凯撒密码
- 密码学 - ROT13 算法
- 密码学 - 换位密码
- 密码学 - 加密换位密码
- 密码学 - 解密换位密码
- 密码学 - 乘法密码
- 密码学 - 仿射密码
- 密码学 - 简单替换密码
- 密码学 - 简单替换密码加密
- 密码学 - 简单替换密码解密
- 密码学 - 维吉尼亚密码
- 密码学 - 实现维吉尼亚密码
- 现代密码
- Base64 编码与解码
- 密码学 - XOR 加密
- 替换技术
- 密码学 - 单字母替换密码
- 密码学 - 破解单字母替换密码
- 密码学 - 多字母替换密码
- 密码学 - Playfair 密码
- 密码学 - 希尔密码
- 多字母替换密码
- 密码学 - 一次性密码本密码
- 一次性密码本密码的实现
- 密码学 - 换位技术
- 密码学 - 栅栏密码
- 密码学 - 列置换
- 密码学 - 隐写术
- 对称算法
- 密码学 - 数据加密
- 密码学 - 加密算法
- 密码学 - 数据加密标准
- 密码学 - 三重 DES
- 密码学 - 双重 DES
- 高级加密标准
- 密码学 - AES 结构
- 密码学 - AES 变换函数
- 密码学 - 字节替换变换
- 密码学 - 行移位变换
- 密码学 - 列混合变换
- 密码学 - 轮密钥加变换
- 密码学 - AES 密钥扩展算法
- 密码学 - Blowfish 算法
- 密码学 - SHA 算法
- 密码学 - RC4 算法
- 密码学 - Camellia 加密算法
- 密码学 - ChaCha20 加密算法
- 密码学 - CAST5 加密算法
- 密码学 - SEED 加密算法
- 密码学 - SM4 加密算法
- IDEA - 国际数据加密算法
- 公钥(非对称)密码学算法
- 密码学 - RSA 算法
- 密码学 - RSA 加密
- 密码学 - RSA 解密
- 密码学 - 创建 RSA 密钥
- 密码学 - 破解 RSA 密码
- 密码学 - ECDSA 算法
- 密码学 - DSA 算法
- 密码学 - Diffie-Hellman 算法
- 密码学中的数据完整性
- 密码学中的数据完整性
- 消息认证
- 密码学数字签名
- 公钥基础设施
- 散列
- MD5(信息摘要算法 5)
- SHA-1(安全散列算法 1)
- SHA-256(安全散列算法 256 位)
- SHA-512(安全散列算法 512 位)
- SHA-3(安全散列算法 3)
- 散列密码
- Bcrypt 散列模块
- 现代密码学
- 量子密码学
- 后量子密码学
- 密码协议
- 密码学 - SSL/TLS 协议
- 密码学 - SSH 协议
- 密码学 - IPsec 协议
- 密码学 - PGP 协议
- 图像与文件加密
- 密码学 - 图像
- 密码学 - 文件
- 隐写术 - 图像
- 文件加密和解密
- 密码学 - 文件加密
- 密码学 - 文件解密
- 物联网中的密码学
- 物联网安全挑战、威胁和攻击
- 物联网安全加密技术
- 物联网设备通信协议
- 常用加密技术
- 自定义构建加密算法(混合加密)
- 云加密
- 量子密码学
- 密码学中的图像隐写术
- DNA 密码学
- 密码学中的一次性密码 (OTP) 算法
- 区别
- 密码学 - MD5 与 SHA1
- 密码学 - RSA 与 DSA
- 密码学 - RSA 与 Diffie-Hellman
- 密码学与密码学
- 密码学 - 密码学与密码分析
- 密码学 - 经典与量子
- 密码学与隐写术
- 密码学与加密
- 密码学与网络安全
- 密码学 - 流密码与分组密码
- 密码学 - AES 与 DES 密码
- 密码学 - 对称与非对称
- 密码学有用资源
- 密码学 - 快速指南
- 密码学 - 讨论
MD5(信息摘要算法 5)
MD5 方法是最早获得全球认可的散列算法之一,它取代了 MD4 算法。尽管存在潜在的安全风险,但 MD5 在各种情况下都是数据基础设施的重要组成部分。
在深入研究 MD5 之前,我们需要了解散列到底是什么!
什么是散列?
散列是将标准信息字符串转换为复杂数据片段的过程。这样做是为了对信息进行加密,使其完全改变原始值,从而产生一个与原始值完全不同的散列值。
散列使用散列函数将常规数据转换为不可读的形式。这些散列函数是一系列数学运算,通常称为散列摘要或摘要,将原始数据转换为其散列值。无论输入大小如何,特定散列函数(例如 MD5 或 SHA1)的摘要大小始终相同。
散列主要有两个用例:
密码验证
为了保护密码免受攻击者的侵害,网站的用户凭据通常以散列格式存储。比较密码散列更私密,因为散列函数对于相同的输入始终返回相同的结果。
以下是完整流程的工作原理:
- 用户在登录网站时创建新密码。
- 它对密码进行散列,并将结果作为摘要保存在服务器上。
- 用户每次尝试登录时都必须重新输入密码。
- 为了创建摘要,它会再次使用散列算法运行通过输入的密码。
- 如果新创建的摘要与服务器上的摘要匹配,则验证登录。
完整性验证
散列函数可用于检查某些文件是否存在数据损坏。与上述示例一样,散列函数即使在迭代参数发生变化的情况下,对于相同的输入也会始终产生相同的结果。
该过程的步骤如下:
- 个人将文件发布到互联网。
- 散列摘要也与文件一起上传。
- 当用户获取文件时,散列摘要会更新。
- 如果摘要与初始散列值匹配,则文件完整性得到保留。
- 在建立了散列的基本基础后,您就可以检查 MD5 算法,这是本章的主要重点。
什么是 MD5 算法?
MD5(消息摘要方法 5)是一种加密散列算法,可用于从任意长度的字符串创建 128 位摘要。摘要使用 32 位十六进制数表示。
该方法由罗纳德·里维斯特于 1991 年创建,用于启用数字签名的验证。为了增强安全措施,它已集成到各种框架中。
由于散列函数的建议,摘要大小始终为 128 位,即使对输入字符串进行微小的更改也会导致摘要发生很大差异。这是为了减少散列冲突(或生成类似散列)的可能性。
现在,您将学习构成 MD5 算法工作原理的步骤。
MD5 算法步骤
该算法包含四个主要部分:
填充位
当您收到输入字符串时,请验证其大小是否比 512 的倍数小 64 位。为了舍入多余的字符,您必须在添加一个 (1) 到填充位之后添加零。
填充长度
最终字符串需要包含更多字符才能成为 512 的倍数。为此,请获取原始输入的长度并将其表示为 64 位。将两者组合后,最后一个字符串将准备好进行散列。
初始化 MD 缓冲区
整个字符串被分成多个块,每个块包含 512 位。此外,需要初始化四个缓冲区 (A、B、C 和 D)。这四个 32 位缓冲区分别初始化如下:
处理每个块
512 位块可以进一步细分为 16 个子块,每个子块包含 32 位。四轮运算中的每一轮都使用所有缓冲区、常量数组值和子块。
您可以将此常量数组称为 T[1] ⇒ T[64]。
子块由符号 M[0] ⇒ M[15] 标识。
MD5 的实现
现在,我们将借助不同的编程语言来实现 MD5 算法,以便您能够使用任何一种语言进行编码。
使用 Python
为了实现 MD5 算法,我们将使用 Python 的 hashlib 模块,该模块提供了对计算给定消息的哈希值的支持。因此,Python 中的代码如下所示:
import hashlib def generate_md5(input_string): md5_hash = hashlib.md5(input_string.encode()).hexdigest() return md5_hash # function execution input_string = "tutorialspoint" md5_hash = generate_md5(input_string) print("MD5 hash for", input_string, ":", md5_hash)
输出
MD5 hash for tutorialspoint : 6c60b3cfe5124f982eb629e00a98f01f
使用 Java
现在,我们将借助 Java 及其内置库来实现 MD5。因此,我们将使用两个类 MessageDigest 和 NoSuchAlgorithmException。MessageDigest 类允许我们创建各种消息摘要算法(如 MD5)的实例,而 NoSuchAlgorithmException 在所需加密算法在环境中不可访问时引发。使用 Java 实现 MD5 的代码如下所示:
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Md5Algo { public static String generateMD5(String input) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] inputBytes = input.getBytes(); byte[] hashBytes = md.digest(inputBytes); // Convert the byte array to a hexadecimal string StringBuilder sb = new StringBuilder(); for (byte b : hashBytes) { sb.append(String.format("%02x", b)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } public static void main(String[] args) { String input = "tutorialspoint"; String md5Hash = generateMD5(input); System.out.println("MD5 hash for " + input + " : " + md5Hash); } }
输出
MD5 hash for tutorialspoint : 6c60b3cfe5124f982eb629e00a98f01f
MD5 的应用
以下是我们可以使用 MD5 算法的一些常见应用:
- 消息摘要用于验证和检查文件的完整性。
- 数据加密和安全由 MD5 处理。
- 它用于密码验证和消息摘要,无论消息大小。
- 它也用于图形和游戏板。
MD5 的优点
以下是 MD5 的一些优点:
- 易于比较 - 在摘要验证方面,与最新的哈希算法系列相比,32 位摘要的比较相对简单。
- 保持密码安全 - 如果密码未以未加密格式保存,黑客和其他攻击者可以访问密码。数据库也受益于摘要,因为所有哈希值的大小相同。
- 低资源消耗 - 为了将多个服务合并到一个框架中而不会引入 CPU 成本,需要相对较小的内存占用。
- 完整性检查 - 通过分析传输前后哈希值,您可以留意任何文件损坏。一旦哈希值匹配,文件完整性检查就是有效的并防止数据损坏。
MD5 的缺点
- 有时,对于不同的输入,MD5 会创建类似的哈希函数。
- SHA1 比 MD5 提供更好的安全性。
- 据说 MD5 算法不安全。目前正在使用 SHA256 代替 MD5。
- MD5 不适用于对称或非对称算法。
MD5 算法安全吗?
任何消息摘要函数的目标都是生成看起来随机的摘要。为了使哈希函数被认为是加密安全的,需要满足两个条件:
- 攻击者无法生成与给定哈希值匹配的消息。
- 攻击者不可能生成具有相同哈希值的两个消息。
IETF 指出,MD5 哈希不应用于加密身份验证,因为它们不再被视为加密安全的技术。