前言
嗨,大家好!
上次我們一起探討了 MD5 加密(《MD5加密,C# 程序員的老朋友與新認知》),今天我們繼續來探討如何在 C# 中使用 SHA-256 進行加密!
事實上,SHA-256 并不能算是真正意義上的加密算法,它跟 MD5 一樣,也是一種哈希算法,但因為它能夠將任意長度的數據轉換成一個固定長度的256位散列值,所以,我們也經常用它來對密碼進行加密。
除了對密碼進行加密之外,SHA-256 也常常用于數字簽名、驗證文件完整性等場景,它跟 MD5 相比,有哪些區別?
今天我們一起來揭開 SHA-256 的神秘面紗!
SHA-256 是什么?
SHA-256,中文叫做安全哈希算法256位,是一種密碼學哈希函數,屬于 SHA-2 家族。
想象一下,假設你有一臺魔法榨汁機,
- 你扔進去一個蘋果(數據),它吐出一杯永遠256位的混合果汁(哈希值)
這就是 SHA-256 的核心特點,看起來似乎跟 MD5 有些類似,但功能更加強大,應用更加廣泛!
在 C# 中如何使用它呢?下面先來看看一個例子。
一個例子
using System;
using System.Security.Cryptography;
using System.Text;
classProgram
{
static void Main()
{
string originalData = "Hello, SHA-256!";
// 計算 SHA-256 哈希
string hashedData = ComputeSha256Hash(originalData);
Console.WriteLine($"原始數據: {originalData}");
Console.WriteLine($"SHA-256 哈希: {hashedData}");
// 驗證哈希(假設我們之后重新計算對比)
string newHash = ComputeSha256Hash(originalData);
Console.WriteLine($"驗證哈希是否一致: {hashedData == newHash}");
}
static string ComputeSha256Hash(string rawData)
{
// 創建 SHA-256 實例
using (SHA256 sha256 = SHA256.Create())
{
// 將字符串轉換為字節數組
byte[] bytes = Encoding.UTF8.GetBytes(rawData);
// 計算哈希值
byte[] hashBytes = sha256.ComputeHash(bytes);
// 將字節數組轉換為十六進制字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
builder.Append(hashBytes[i].ToString("x2")); // "x2" 表示兩位小寫十六進制
}
return builder.ToString();
}
}
}
按 Ctrl + F5 運行后,你將會看到如下輸出:
優勢
總的來說,SHA-256 擁有下面這 3 個優勢:
跟 MD5 相比,SHA-256 安全性更高,目前尚未發現有效的攻擊方法,因為通過 SHA-256 算法,找到兩個不同輸入生成相同哈希值的概率極低
兼容性強極強,各大主流編程語言和協議都原生支持它。
作為 NIST 標準,被政府和企業廣泛采用(如國防通信、金融交易)
劣勢
跟 MD5 相比,SHA-256 在計算大量數據時比較慢,因為它的64輪迭代算法相比復雜得太多
跟 MD5 一樣,數據被 SHA-256 哈希后,是無法通過哈希值恢復原始數據的
使用場景
- 存儲用戶密碼的哈希值,而非明文,防止泄露后被逆向破解
- 在SSL/TLS中,用于驗證服務器證書的完整性和真實性
- 下載文件后計算其SHA-256哈希,與官方發布值比對,確保未被篡改。
總結
SHA-256是一種強大而可靠的哈希算法,廣泛應用于數據安全的各個領域。
盡管它存在一些性能上的缺點,但其安全性與一致性足以讓我們忽略這些小問題。
在 C# 中使用它非常簡單,System.Security.Cryptography
已經提供了完整的支持。
但注意它實際上并不是真正意義上的加密算法,因為它是不可逆的。
真正意義的加密(可逆操作),你可以使用 AES(對稱加密) 或 RSA(非對稱加密),以后我們會繼續介紹它們。
閱讀原文:原文鏈接
該文章在 2025/4/8 9:14:09 編輯過