什么是哈希函數(SHA-256)

SHA-256 是區塊鏈系統中最核心的加密基礎之一,尤其是在比特幣、以太坊、文件存證等場景中扮演“指紋識別器”的角色。下面是對它的詳細講解,包括原理、特點、用途和代碼示例。


📌 一、什么是 SHA-256?

SHA-256 是一種密碼學哈希函數,全稱為:

Secure Hash Algorithm 256-bit

它屬于 SHA-2 算法家族,由美國國家安全局(NSA)設計,并由 NIST 發布,是當前最廣泛使用的加密哈希函數之一。


🔐 二、SHA-256 的核心特點

特性描述
輸入任意長度的數據(字符串、文件等)
輸出固定長度的 256 比特(即 32 字節)
一致性相同輸入 → 永遠輸出相同哈希值
雪崩效應微小輸入變化會導致輸出完全不同
不可逆性無法通過哈希值還原原始數據
抗碰撞性很難找到兩個不同輸入產生相同哈希

🧠 三、SHA-256 的作用場景

應用說明
區塊鏈區塊頭哈希、交易 ID、Merkle Root 等均使用 SHA-256
數字簽名簽名前通常對原始數據先做哈希處理
數據完整性校驗比對哈希值判斷文件是否被篡改
密碼存儲存儲密碼的哈希值而不是明文
生成數字指紋對合同、圖片等生成唯一標識哈希

? 四、SHA-256 示例(文字 + 文件)

示例1:對一段文本哈希

  • 原始數據:Hello, blockchain!
  • SHA-256 輸出:
3c4f5f6782d67bdbf43bcba6b79b0e689a25c857c1359a43a0ccf906c263c741

示例2:對兩個幾乎相同的文本

  • Hello, blockchain!
  • Hello, Blockchain!(僅 B 大寫)

對比輸出:

3c4f5f6782d67bdbf43bcba6b79b0e689a25c857c1359a43a0ccf906c263c741
vs
913a1cf9bb5761f4d029eb5df5e69a2545b5120ce8720d8f41a9a51a84a232b7

?? 展示雪崩效應:微小差異 → 完全不同哈希值


💻 五、Java 中如何使用 SHA-256?

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class SHA256Example {public static String sha256(String input) {try {MessageDigest digest = MessageDigest.getInstance("SHA-256");byte[] hash = digest.digest(input.getBytes("UTF-8"));StringBuilder hexString = new StringBuilder();for (byte b : hash) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) hexString.append('0');hexString.append(hex);}return hexString.toString();} catch (Exception ex) {throw new RuntimeException(ex);}}public static void main(String[] args) {String data = "Hello, blockchain!";System.out.println("SHA-256: " + sha256(data));}
}

📁 六、文件的 SHA-256 哈希(用于文件校驗/存證)

import java.io.FileInputStream;
import java.security.MessageDigest;public class FileHashUtil {public static String getFileSHA256(String filePath) throws Exception {MessageDigest digest = MessageDigest.getInstance("SHA-256");FileInputStream fis = new FileInputStream(filePath);byte[] buffer = new byte[8192];int n;while ((n = fis.read(buffer)) != -1) {digest.update(buffer, 0, n);}fis.close();byte[] hash = digest.digest();StringBuilder result = new StringBuilder();for (byte b : hash) {result.append(String.format("%02x", b));}return result.toString();}
}

🔍 七、SHA-256 與區塊鏈中的關系圖

+------------------------+          +------------------+
| 交易數據 (Transaction) |  --->    | SHA-256哈希值 (TxID) |
+------------------------+          +------------------+所有交易哈希
↓
+---------------------+            +-------------------+
| Merkle Tree 構建 →  |  ------>   | Merkle Root 哈希     |
+---------------------+            +-------------------++--------------------------+
| 區塊頭 Header(包含Root)|  
| + 前一區塊哈希            |
| + 時間戳                 |
| + 難度目標               |
+--------------------------+
↓
+-------------+
| SHA-256 計算 |
+-------------+
↓
區塊哈希(唯一 ID)

🧾 總結

特性描述
輸入任意長度(字符串、二進制、文件等)
輸出固定256位哈希值
安全性高,抗碰撞、抗逆推
區塊鏈用途區塊ID、交易ID、Merkle構建、簽名摘要等
Java調用MessageDigest.getInstance("SHA-256")

分別詳細說明這兩個基于 SHA-256(或其他哈希函數)的服務:


一、敏感數據哈希存證服務(鏈上/鏈下存證)

1. 服務定義

將敏感數據通過哈希函數轉化為不可逆摘要,并通過區塊鏈、數據庫或第三方可信平臺進行存證,確保數據在某時刻“存在且未被篡改”。

2. 典型場景

  • 醫療記錄、病歷、處方
  • 教育成績、學籍檔案
  • 合同/協議簽署文本
  • 監控圖像、音頻記錄、聊天記錄等非結構化內容

3. 技術原理

原始敏感數據(如病例PDF) → 歸一化 → SHA-256 哈希 → 存儲(鏈上或可信中心)

僅存儲哈希值,保護數據隱私。

4. 服務模塊

模塊功能
數據接入模塊提供 API 或表單上傳數據(文本、JSON、文件等)
哈希引擎使用 SHA-256 對數據做哈希處理
存證模塊選擇鏈上寫入(如上鏈合約)或鏈下可信存儲(如數據庫)
查詢驗證模塊用戶提供數據 → 計算哈希 → 比對哈希是否存在/一致

5. 示例接口設計(REST API)

  • POST /hash/proof
    上傳原始數據,生成哈希并存證
  • GET /hash/verify?hash=xxx
    驗證某哈希是否已被存證
  • POST /hash/verify
    上傳原始數據,服務端計算哈希并比對是否存在

二、文件哈希比對服務(文件指紋校驗)

1. 服務定義

用于對文件進行哈希指紋生成與比對,判斷兩個文件是否一致,是否被篡改,用于完整性驗證、審計留痕。

2. 典型場景

  • 合同歸檔校驗(甲乙雙方版本是否一致)
  • 文件傳輸完整性校驗(如金融系統)
  • 電子證據驗證(如法院)
  • 本地文件與數據庫存檔是否一致

3. 技術原理

上傳文件A → SHA-256 哈希 → 比對哈希值 ← 文件B

Hash(A) == Hash(B),則內容完全一致(100%確認)

4. 服務模塊

模塊功能
文件上傳接口用戶上傳單個或兩個文件進行指紋比對
哈希計算模塊使用 SHA-256 對上傳文件生成哈希
哈希緩存數據庫(可選)保存原始文件的指紋記錄
比對模塊支持 1:1 比對、批量比對、歷史比對

5. 示例接口設計(REST API)

  • POST /file/hash
    上傳單個文件,返回哈希值
  • POST /file/compare
    上傳兩個文件,返回比對結果(true/false)
  • GET /file/hash?fileId=123
    獲取之前上傳的文件哈希

6. 輸出示例

{"fileA": "document_v1.pdf","fileB": "document_v2.pdf","hashA": "a7c2...9fa8","hashB": "a7c2...9fa8","match": true
}

服務對比總結

對比項敏感數據哈希存證服務文件哈希比對服務
目的確認數據是否已存在某可信環境判斷兩個文件是否一致
存儲存哈希值(鏈上/鏈下)可選存儲哈希,也可臨時比對
使用者數據上傳方、第三方機構、司法場景文件傳輸方、存檔審核員、合規審計
輸出結果存證ID、哈希值、時間戳哈希值、是否一致

技術建議

組件推薦技術
哈希算法SHA-256(推薦)、SHA-3、Blake2
存證載體IPFS、Fabric鏈、MySQL + 簽名服務
Web框架Spring Boot / Express.js / FastAPI
文件哈希工具Java MessageDigest、Python hashlib、OpenSSL

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86916.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86916.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大模型的“Tomcat”:一文讀懂AI推理引擎(Inference Engine)

點擊下方“JavaEdge”,選擇“設為星標” 第一時間關注技術干貨! 免責聲明~ 任何文章不要過度深思! 萬事萬物都經不起審視,因為世上沒有同樣的成長環境,也沒有同樣的認知水平,更「沒有適用于所有人的解決方案…

《從0到1:C/C++音視頻開發自學完全指南》

從0到1:C/C音視頻開發自學完全指南 一、開篇:為什么選擇C/C切入音視頻開發? 當你刷著抖音短視頻、參加騰訊會議、觀看B站直播時,背后都是音視頻技術在支撐。根據艾瑞咨詢數據,2024年中國音視頻相關產業規模已突破5000…

微信小程序之單行溢出隱藏和雙行溢出隱藏

首先&#xff0c;我們做個text&#xff0c;加入了一個長文本&#xff0c;就像下面那樣&#xff1a; wxml : <view class"container"><text>劉德華&#xff08;Andy Lau&#xff09;&#xff0c;1961年9月27日出生于中國香港&#xff0c;華語影視男演員、…

PHP安裝使用教程

一、PHP 簡介 PHP&#xff08;Hypertext Preprocessor&#xff09;是一種廣泛應用的開源服務器端腳本語言&#xff0c;尤其適用于 Web 開發&#xff0c;可嵌入 HTML 中使用。其運行速度快、易學易用&#xff0c;支持多種數據庫和平臺。 二、PHP 安裝教程 2.1 支持平臺 PHP 支…

ThreadLocal、InheritableThreadLocal與TransmittableThreadLocal深度解析

文章目錄 一、概念說明1、ThreadLocal2、InheritableThreadLocal3、TransmittableThreadLocal 二、使用場景1、ThreadLocal2、InheritableThreadLocal3、TransmittableThreadLocal 三、存在的問題1、ThreadLocal2、InheritableThreadLocal3、TransmittableThreadLocal 四、示例…

ERP系統Bug記錄

2025.06.30 2025/06/30-10:51:02 [http-nio-9999-exec-3] com.yxx.jsh.erp.service.LogService - 異常碼[300],異常提示[數據查詢異常],異常[{}] java.lang.NullPointerException: nullat com.yxx.jsh.erp.base.TableSupport.getBuildPageRequest(TableSupport.java:46)at com…

C# Avalonia 的 Source Generators 用處

C# Avalonia 的 Source Generators 用處 文章目錄 **1. 自動生成 MVVM 綁定代碼****2. 強類型 XAML 數據綁定****3. 自動注冊視圖&#xff08;View&#xff09;與視圖模型&#xff08;ViewModel&#xff09;****4. 資源文件與本地化的強類型訪問****5. 路由事件與命令的自動化處…

stm32之測量占空比

#include "tim4.h"void TIM4_Init(void) {// 開啟時鐘RCC->APB1ENR | RCC_APB1ENR_TIM4EN;RCC->APB2ENR | RCC_APB2ENR_IOPBEN; // 使用 TIM4 的 GPIOB 時鐘// 配置 PB6 為浮空輸入 CNF 01 MODE 00GPIOB->CRL & ~GPIO_CRL_MODE6;GPIOB->CRL & ~G…

工廠模式 - Flutter中的UI組件工廠,按需生產各種“產品

想要動態創建不同風格的按鈕&#xff1f;想一鍵切換整個主題&#xff1f;工廠模式就是你的"生產流水線"&#xff01; 想象一下這個場景&#xff1a; 你決定擴大奶茶店業務&#xff0c;推出兩個品牌系列&#xff1a; 經典系列&#xff1a;傳統珍珠奶茶&#xff0c;紅…

基于 SpringBoot+Vue.js+ElementUI 的 Cosplay 論壇設計與實現7000字論文

基于 SpringBootVue.jsElementUI 的 Cosplay 論壇設計與實現 摘要 本論文設計并實現了一個基于 SpringBoot、Vue.js 和 ElementUI 的 Cosplay 論壇平臺。該平臺旨在為 Cosplay 愛好者提供一個集作品展示、交流互動、活動組織于一體的綜合性社區。論文首先分析了 Cosplay 論壇…

超標量處理器11-Alpha21264 處理器

1. 簡介 21264處理器是一款4-way&#xff0c;亂序執行的超標量處理器&#xff0c;采用0.35um的CMOS工藝&#xff0c;工作電壓是2.2V, 工作頻率是466-667MHz; 處理器能支持60條指令&#xff0c;也即ROB的深度是60; Load/Store指令也采取亂序執行, 總共7級流水。I-CACHE和D-CACH…

Spring 中 Bean 的生命周期

一、什么是 Bean 生命周期&#xff1f; Spring 中的 Bean 生命周期是指一個 Bean 從 被容器創建到 最終銷毀 所經歷的一系列過程。 它體現了 Spring IOC 容器在管理 Bean 實例時所執行的各個鉤子流程&#xff0c;包括初始化、依賴注入、增強處理、銷毀等多個環節。 二、Bean 生…

C++ 中 std::string 與 QString 的深度剖析

在 C 編程領域&#xff0c;std::string 和 QString 是兩種廣泛應用的字符串類型&#xff0c;它們在設計理念、功能特性以及適用場景上都呈現出鮮明的特點。本文將從多個維度對這兩種字符串類型進行深度剖析&#xff0c;并詳細闡述它們之間的相互轉化方法。 std::string 是 C 標…

不止于“修補”:我如何用Adobe AI重塑設計與視頻敘事流程

最近我深度體驗了一把來自英國Parvis School of Economics and Music的Adobe正版教育訂閱&#xff0c;在把玩PhotoShop、Premiere Pro這些“老伙計”的新功能時&#xff0c;的確挖到了一些寶藏&#xff0c;覺得非常有必要與大家說道說道。首先得聊聊這個訂閱給我的直觀感受&…

重頭開始學ROS(5)---阿克曼底盤的URDF建模與Gazebo控制(使用Xacro優化)

阿克曼底盤的URDF建模與Gazebo控制&#xff08;使用Xacro優化&#xff09; 阿克曼底盤建模 建模 我們使用后輪驅動&#xff0c;前輪轉向的阿克曼底盤模型。 那么對于后輪只需進行正常的continous joint連接即可 對于前輪&#xff0c;有兩個自由度&#xff0c;旋轉和轉向&…

RabbitMq中啟用NIO

? 所屬類 com.rabbitmq.client.ConnectionFactory&#x1f9e0; 使用背景 RabbitMQ Java 客戶端默認使用傳統的 阻塞 I/O (java.net.Socket) 實現。如果你希望&#xff1a; 更好地控制 線程數獲得更好的 并發性能降低 每個連接的線程占用在高并發連接或消費者數量較多的系統…

[Dify]-基礎篇2- 如何注冊并快速上手 Dify 平臺

在生成式 AI 應用開發新時代,如何快速搭建一個高效、可維護、易上線的 AI 工具,是每位開發者關注的核心。Dify,正是為此而生的一站式平臺。本篇將以新手視角,帶你從注冊賬號、配置環境,到構建應用、部署上線,手把手完成你的第一個 AI 項目。 注冊并設置工作環境 1. 賬號…

Java面試寶典:基礎七

153. 如何實現對象克隆? 答: 對象克隆有兩種主要方式: 淺克隆:實現Cloneable接口并重寫Object.clone() class Person implements Cloneable {String name;Car car; // 引用類型@Override

spring-security原理與應用系列:requestMatchers和authorizeRequests

目錄 簡單示例 WebSecurityConfig requestMatchers ???????requestMatchers ???????antMatchers ???????chainRequestMatchers ???????setMatchers ???????requestMatcher ???????WebSecurity ???????performBuild…

Bessel位勢方程求解步驟

問題 考慮偏微分方程&#xff08;PDE&#xff09;&#xff1a; ? Δ u u f , x ∈ R n , -\Delta u u f, \quad x \in \mathbb{R}^n, ?Δuuf,x∈Rn, 其中 f ∈ L 2 ( R n ) f \in L^2(\mathbb{R}^n) f∈L2(Rn)。這是一個線性橢圓型方程&#xff0c;稱為 Bessel 位勢方…