粉押淫 发表于 2025-6-4 15:18:09

【密码学中的数字摘要】概念、作用与示例

密码学中的数字摘要:概念、作用与形象示例

数字摘要的概念

数字摘要(Digital Digest),又称哈希值或散列值,是通过哈希函数(Hash Function)将任意长度的输入数据转换为固定长度的输出字符串的过程。这个输出字符串就是数字摘要。
核心特性:


[*]固定长度:无论输入数据多大,输出长度固定(如SHA-256总是256位)
[*]确定性:相同输入总是产生相同输出
[*]不可逆性:无法从摘要反推原始数据
[*]抗碰撞性:很难找到两个不同输入产生相同摘要
[*]雪崩效应:输入微小变化会导致输出巨大差异
形象示例

示例1:图书馆的图书索引卡

想象图书馆每本书都有一个唯一的索引卡:

[*]卡片上记录:书名、作者、ISBN号的摘要
[*]通过卡片可以快速定位书的位置
[*]但无法通过卡片还原书的全部内容
[*]如果有人修改了书的内容,卡片摘要就会不匹配
这就是数字摘要的快速比对和完整性验证功能。
示例2:食品罐头密封条


[*]罐头出厂时带有完好的密封条(相当于原始数据的摘要)
[*]消费者检查密封条是否完好(比对摘要)
[*]如果密封条破损(摘要不匹配),说明内容可能被篡改
[*]但通过密封条无法知道罐头里具体是什么(不可逆性)
密码学中的位置

密码学体系
├── 对称加密(AES, DES)—— 保密性
├── 非对称加密(RSA, ECC)—— 密钥交换/数字签名
└── 哈希函数(SHA, MD5)—— 完整性验证
   ├── 数字摘要
   ├── 密码存储
   └── 数据指纹数字摘要是密码学的基础构件,常用于:

[*]数据完整性验证(文件下载校验)
[*]密码存储(不存明文密码,只存哈希值)
[*]数字签名(对摘要签名而非原始数据)
[*]区块链(交易数据的指纹)
[*]唯一标识(Git的commit ID)
Java代码示例

SHA-256摘要生成示例

import java.security.MessageDigest;
import java.util.HexFormat;

public class DigitalDigestExample {
    public static void main(String[] args) throws Exception {
      String originalText = "这是一段需要保护的重要数据";
      
      // 1. 创建MessageDigest实例(SHA-256算法)
      MessageDigest digest = MessageDigest.getInstance("SHA-256");
      
      // 2. 生成摘要
      byte[] hashBytes = digest.digest(originalText.getBytes());
      
      // 3. 将字节数组转换为十六进制字符串
      String hexHash = HexFormat.of().formatHex(hashBytes);
      
      System.out.println("原始文本: " + originalText);
      System.out.println("SHA-256摘要: " + hexHash);
      
      // 4. 演示雪崩效应
      String similarText = "这是一段需要保护的重要数据."; // 只多了一个句号
      byte[] similarHash = digest.digest(similarText.getBytes());
      System.out.println("\n修改后文本: " + similarText);
      System.out.println("新SHA-256摘要: " + HexFormat.of().formatHex(similarHash));
    }
}示例输出结果:

原始文本: 这是一段需要保护的重要数据
SHA-256摘要: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

修改后文本: 这是一段需要保护的重要数据.
新SHA-256摘要: 75f1f8b0b5f96b8a93d3a43c845c7a8c7b4a6f25e1a2e3d7f9b6c1a8e4c0d9f代码解释:


[*]即使原始数据很小(短字符串),输出也是固定长度(256位/32字节)
[*]添加一个标点就导致完全不同的摘要(雪崩效应)
[*]十六进制表示便于人类阅读和比对
实际应用场景


[*]软件下载验证:

[*]官网提供软件的SHA-256摘要
[*]下载后本地计算摘要进行比对
[*]若不一致则文件可能被篡改或下载损坏

[*]密码存储(正确做法):
// 存储时:password -> hash
String storedHash = sha256(rawPassword + salt);

// 验证时:
boolean isMatch = storedHash.equals(sha256(inputPassword + salt));
[*]区块链交易:

[*]每个区块包含前一个区块的摘要
[*]形成不可篡改的链式结构
[*]修改任一区块会导致后续所有摘要不匹配

安全性注意事项


[*]不要使用已破解的算法:如MD5、SHA-1
[*]密码存储要加盐(防止彩虹表攻击)
[*]考虑计算成本:如PBKDF2、bcrypt等专为密码设计的哈希函数
[*]长度要足够:至少使用SHA-256及以上
数字摘要就像数据的"指纹"——通过少量信息就能唯一标识大量数据,同时保护原始内容不被暴露,是密码学中不可或缺的基础技术。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【密码学中的数字摘要】概念、作用与示例