數(shù)字摘要的概念
數(shù)字摘要(Digital Digest),又稱哈希值或散列值,是通過(guò)哈希函數(shù)(Hash Function)將任意長(zhǎng)度的輸入數(shù)據(jù)轉(zhuǎn)換為固定長(zhǎng)度的輸出字符串的過(guò)程。這個(gè)輸出字符串就是數(shù)字摘要。
核心特性:
- 固定長(zhǎng)度:無(wú)論輸入數(shù)據(jù)多大,輸出長(zhǎng)度固定(如SHA-256總是256位)
- 確定性:相同輸入總是產(chǎn)生相同輸出
- 不可逆性:無(wú)法從摘要反推原始數(shù)據(jù)
- 抗碰撞性:很難找到兩個(gè)不同輸入產(chǎn)生相同摘要
- 雪崩效應(yīng):輸入微小變化會(huì)導(dǎo)致輸出巨大差異
形象示例
示例1:圖書(shū)館的圖書(shū)索引卡
想象圖書(shū)館每本書(shū)都有一個(gè)唯一的索引卡:
- 卡片上記錄:書(shū)名、作者、ISBN號(hào)的摘要
- 通過(guò)卡片可以快速定位書(shū)的位置
- 但無(wú)法通過(guò)卡片還原書(shū)的全部?jī)?nèi)容
- 如果有人修改了書(shū)的內(nèi)容,卡片摘要就會(huì)不匹配
這就是數(shù)字摘要的快速比對(duì)和完整性驗(yàn)證功能。
示例2:食品罐頭密封條
- 罐頭出廠時(shí)帶有完好的密封條(相當(dāng)于原始數(shù)據(jù)的摘要)
- 消費(fèi)者檢查密封條是否完好(比對(duì)摘要)
- 如果密封條破損(摘要不匹配),說(shuō)明內(nèi)容可能被篡改
- 但通過(guò)密封條無(wú)法知道罐頭里具體是什么(不可逆性)
密碼學(xué)中的位置
密碼學(xué)體系
├── 對(duì)稱加密(AES, DES)—— 保密性
├── 非對(duì)稱加密(RSA, ECC)—— 密鑰交換/數(shù)字簽名
└── 哈希函數(shù)(SHA, MD5)—— 完整性驗(yàn)證
├── 數(shù)字摘要
├── 密碼存儲(chǔ)
└── 數(shù)據(jù)指紋
數(shù)字摘要是密碼學(xué)的基礎(chǔ)構(gòu)件,常用于:
- 數(shù)據(jù)完整性驗(yàn)證(文件下載校驗(yàn))
- 密碼存儲(chǔ)(不存明文密碼,只存哈希值)
- 數(shù)字簽名(對(duì)摘要簽名而非原始數(shù)據(jù))
- 區(qū)塊鏈(交易數(shù)據(jù)的指紋)
- 唯一標(biāo)識(shí)(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 = "這是一段需要保護(hù)的重要數(shù)據(jù)";
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = digest.digest(originalText.getBytes());
String hexHash = HexFormat.of().formatHex(hashBytes);
System.out.println("原始文本: " + originalText);
System.out.println("SHA-256摘要: " + hexHash);
String similarText = "這是一段需要保護(hù)的重要數(shù)據(jù).";
byte[] similarHash = digest.digest(similarText.getBytes());
System.out.println("\n修改后文本: " + similarText);
System.out.println("新SHA-256摘要: " + HexFormat.of().formatHex(similarHash));
}
}
示例輸出結(jié)果:
原始文本: 這是一段需要保護(hù)的重要數(shù)據(jù)
SHA-256摘要: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
修改后文本: 這是一段需要保護(hù)的重要數(shù)據(jù).
新SHA-256摘要: 75f1f8b0b5f96b8a93d3a43c845c7a8c7b4a6f25e1a2e3d7f9b6c1a8e4c0d9f
代碼解釋:
- 即使原始數(shù)據(jù)很小(短字符串),輸出也是固定長(zhǎng)度(256位/32字節(jié))
- 添加一個(gè)標(biāo)點(diǎn)就導(dǎo)致完全不同的摘要(雪崩效應(yīng))
- 十六進(jìn)制表示便于人類閱讀和比對(duì)
實(shí)際應(yīng)用場(chǎng)景
軟件下載驗(yàn)證:
- 官網(wǎng)提供軟件的SHA-256摘要
- 下載后本地計(jì)算摘要進(jìn)行比對(duì)
- 若不一致則文件可能被篡改或下載損壞
密碼存儲(chǔ)(正確做法):
String storedHash = sha256(rawPassword + salt);
boolean isMatch = storedHash.equals(sha256(inputPassword + salt));
區(qū)塊鏈交易:
- 每個(gè)區(qū)塊包含前一個(gè)區(qū)塊的摘要
- 形成不可篡改的鏈?zhǔn)浇Y(jié)構(gòu)
- 修改任一區(qū)塊會(huì)導(dǎo)致后續(xù)所有摘要不匹配
安全性注意事項(xiàng)
- 不要使用已破解的算法:如MD5、SHA-1
- 密碼存儲(chǔ)要加鹽(防止彩虹表攻擊)
- 考慮計(jì)算成本:如PBKDF2、bcrypt等專為密碼設(shè)計(jì)的哈希函數(shù)
- 長(zhǎng)度要足夠:至少使用SHA-256及以上
數(shù)字摘要就像數(shù)據(jù)的"指紋"——通過(guò)少量信息就能唯一標(biāo)識(shí)大量數(shù)據(jù),同時(shí)保護(hù)原始內(nèi)容不被暴露,是密碼學(xué)中不可或缺的基礎(chǔ)技術(shù)。
轉(zhuǎn)自https://www.cnblogs.com/sun-10387834/p/18910650
該文章在 2025/6/6 10:34:35 編輯過(guò)