Java實(shí)現(xiàn)SHA-256加密算法的完全解析
SHA-256是一種散列(哈希)算法,用于將任意長(zhǎng)度的數(shù)據(jù)映射為固定長(zhǎng)度的散列值,以保證數(shù)據(jù)完整性。SHA-256是SHA(Secure Hash Algorithm)系列中的一種,其輸出結(jié)果為256位(32字節(jié))散列值。
SHA-256算法常用于密碼存儲(chǔ)、數(shù)字簽名等場(chǎng)景,因?yàn)樗峁┝烁邚?qiáng)度的安全性和不可逆性。
實(shí)現(xiàn)原理
SHA-256是一種散列算法,它的實(shí)現(xiàn)原理是對(duì)任意長(zhǎng)度的數(shù)據(jù)進(jìn)行多次變換和壓縮,從而生成固定長(zhǎng)度的散列值。具體來說,SHA-256算法執(zhí)行如下步驟:
- 對(duì)輸入數(shù)據(jù)進(jìn)行分組:將任意長(zhǎng)度的輸入數(shù)據(jù)分為512位(64字節(jié))的多個(gè)塊,如果不足512位,則使用填充字符填充到512位。
- 初始化哈希值:使用一組固定的哈希值,作為算法的初始狀態(tài)。
- 處理數(shù)據(jù)塊:對(duì)每個(gè)數(shù)據(jù)塊執(zhí)行哈希運(yùn)算,并用結(jié)果更新當(dāng)前的哈希值。
- 生成散列值:最終的哈希值就是散列值,它代表了原始輸入數(shù)據(jù)的散列值。
SHA-256算法的實(shí)現(xiàn)包括多次的哈希運(yùn)算、循環(huán)、邏輯操作等,其中包含了復(fù)雜的數(shù)學(xué)算法和數(shù)據(jù)結(jié)構(gòu),但是整體原理是將任意長(zhǎng)度的數(shù)據(jù)映射為固定長(zhǎng)度的散列值,以保證數(shù)據(jù)完整性。
應(yīng)用
比特幣中使用了SHA-256作為散列交易數(shù)據(jù)的哈希算法。它通過對(duì)交易數(shù)據(jù)進(jìn)行散列,生成一個(gè)固定長(zhǎng)度的數(shù)字簽名,以確保交易的完整性和真實(shí)性。SHA-256算法的安全性得到廣泛認(rèn)可,在密碼學(xué)中廣泛使用,但其處理效率相對(duì)較低。
Java實(shí)現(xiàn)代碼
代碼流程:
- 創(chuàng)建MessageDigest實(shí)例,并使用"MD5"算法。
- 將需要加密的字符串轉(zhuǎn)換為字節(jié)數(shù)組,并將其傳遞給update方法。
- 調(diào)用digest方法,該方法返回加密結(jié)果字節(jié)數(shù)組。
- 遍歷結(jié)果字節(jié)數(shù)組,將每個(gè)字節(jié)轉(zhuǎn)換為16進(jìn)制字符串,并拼接在一起。
import java.security.MessageDigest; public class Sha256Example { public static void main(String[] args) throws Exception { String originalString = "Hello, World!"; MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); messageDigest.update(originalString.getBytes()); byte[] result = messageDigest.digest(); StringBuilder hexString = new StringBuilder(); for (byte b : result) { hexString.append(String.format("%02X", b)); } System.out.println("Original String: " + originalString); System.out.println("SHA-256 Hash: " + hexString.toString().toLowerCase()); } }
知識(shí)點(diǎn)補(bǔ)充
除了SHA-256加密算法,小編還為大家整理了MD5加密算法的原理與實(shí)現(xiàn),感興趣的可以了解一下
MD5加密是一種散列函數(shù)(不是加密函數(shù)),可以將任意長(zhǎng)度的數(shù)據(jù)映射為固定長(zhǎng)度的128位散列值。
MD5加密的主要用途包括:
- 數(shù)字簽名:可以用來驗(yàn)證文件的完整性和真實(shí)性。
- 密碼存儲(chǔ):用于將用戶的密碼存儲(chǔ)在數(shù)據(jù)庫中,為了保證密碼的安全性,通常將密碼進(jìn)行加密。
- 數(shù)據(jù)校驗(yàn):用于檢查數(shù)據(jù)是否發(fā)生改變,例如下載的文件或網(wǎng)絡(luò)數(shù)據(jù)傳輸。
數(shù)字簽名和數(shù)據(jù)校驗(yàn)本質(zhì)上是一樣的。
MD5加密的缺點(diǎn):
- 不可逆性:MD5加密是不可逆的,即無法將散列值還原為原始數(shù)據(jù)。
- 碰撞攻擊:存在碰撞攻擊,即兩個(gè)不同的數(shù)據(jù)可能生成相同的散列值。
- 散列算法不安全:隨著計(jì)算機(jī)硬件的提高,MD5算法已經(jīng)不再安全,存在破解的風(fēng)險(xiǎn)。
結(jié)論就是:盡管MD5加密仍然被廣泛使用,但安全性有限,不建議用于安全關(guān)鍵的場(chǎng)合。但是絕大多數(shù)情況下是適用的。
MD5加密的實(shí)現(xiàn)原理
只描述流程,具體實(shí)現(xiàn)過于復(fù)雜。
使用散列函數(shù),對(duì)原始數(shù)據(jù)進(jìn)行運(yùn)算,生成一個(gè)固定長(zhǎng)度的散列值。
- 初始化四個(gè)長(zhǎng)度為32位的寄存器。
- 對(duì)原始數(shù)據(jù)進(jìn)行分組,每組數(shù)據(jù)為512位。
- 對(duì)每組數(shù)據(jù)進(jìn)行一系列運(yùn)算,得到一個(gè)中間散列值。
- 將中間散列值更新到寄存器中。
- 對(duì)數(shù)據(jù)繼續(xù)進(jìn)行分組,直到處理完所有數(shù)據(jù)。
- 對(duì)最終寄存器中的數(shù)值進(jìn)行合并,得到一個(gè)128位的散列值。
Java 實(shí)現(xiàn)代碼
在Java中實(shí)現(xiàn)MD5加密可以使用java.security.MessageDigest類。
大概流程:
- 創(chuàng)建MessageDigest實(shí)例,并使用"MD5"算法。
- 將需要加密的字符串轉(zhuǎn)換為字節(jié)數(shù)組,并將其傳遞給update方法。
- 調(diào)用digest方法,該方法返回加密結(jié)果字節(jié)數(shù)組。
- 遍歷結(jié)果字節(jié)數(shù)組,將每個(gè)字節(jié)轉(zhuǎn)換為16進(jìn)制字符串,并拼接在一起。
import java.security.MessageDigest; public class Md5Example { public static void main(String[] args) throws Exception { String originalString = "Hello, World!"; // 創(chuàng)建MessageDigest實(shí)例,并使用"MD5"算法。 MessageDigest messageDigest = MessageDigest.getInstance("MD5"); // 將需要加密的字符串轉(zhuǎn)換為字節(jié)數(shù)組,并將其傳遞給update方法。 messageDigest.update(originalString.getBytes()); // 調(diào)用digest方法,該方法返回加密結(jié)果字節(jié)數(shù)組。 byte[] result = messageDigest.digest(); // 遍歷結(jié)果字節(jié)數(shù)組,將每個(gè)字節(jié)轉(zhuǎn)換為16進(jìn)制字符串,并拼接在一起。 StringBuilder hexString = new StringBuilder(); for (byte b : result) { hexString.append(String.format("%02X", b)); } System.out.println("Original String: " + originalString); System.out.println("MD5 Hash: " + hexString.toString().toLowerCase()); // Original String: Hello, World! // MD5 Hash: 65a8e27d8879283831b664bd8b7f0ad4 } }
到此這篇關(guān)于Java實(shí)現(xiàn)SHA-256加密算法的完全解析的文章就介紹到這了,更多相關(guān)Java SHA-256加密算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用@Order控制配置類/AOP/方法/字段的加載順序詳解
這篇文章主要介紹了使用@Order控制配置類/AOP/方法/字段的加載順序詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02spring+srpingmvc+hibernate實(shí)現(xiàn)動(dòng)態(tài)ztree生成樹狀圖效果
這篇文章主要介紹了spring+srpingmvc+hibernate動(dòng)態(tài)ztree生成樹狀圖效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析
這篇文章主要介紹了java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Spring注解驅(qū)動(dòng)之ApplicationListener異步處理事件說明
這篇文章主要介紹了Spring注解驅(qū)動(dòng)之ApplicationListener異步處理事件說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09確保SpringBoot定時(shí)任務(wù)只執(zhí)行一次的常見方法小結(jié)
在Spring Boot項(xiàng)目中,確保定時(shí)任務(wù)只執(zhí)行一次是一個(gè)常見的需求,這種需求可以通過多種方式來實(shí)現(xiàn),以下是一些常見的方法,它們各具特點(diǎn),可以根據(jù)項(xiàng)目的實(shí)際需求來選擇最合適的方法,需要的朋友可以參考下2024-10-10