Java中MessageDigest來(lái)實(shí)現(xiàn)數(shù)據(jù)加密的方法
MessageDigest
MessageDigest 類為應(yīng)用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的單向哈希函數(shù),它接收任意大小的數(shù)據(jù),輸出固定長(zhǎng)度的哈希值。
MessageDigest 對(duì)象開始被初始化。該對(duì)象通過(guò)使用 update 方法處理數(shù)據(jù)。任何時(shí)候都可以調(diào)用 reset 方法重置摘要。一旦所有需要更新的數(shù)據(jù)都已經(jīng)被更新了,應(yīng)該調(diào)用 digest 方法之一完成哈希計(jì)算。
對(duì)于給定數(shù)量的更新數(shù)據(jù),digest 方法只能被調(diào)用一次。digest 被調(diào)用后,MessageDigest 對(duì)象被重新設(shè)置成其初始狀態(tài)。
舉個(gè)簡(jiǎn)單的md5加密的例子:
package com.company; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MessageDigestTest { public static void main(String[] args) throws NoSuchAlgorithmException { String source = "123123"; String md5Str = getMd5(source); System.out.println(md5Str); } /** * 通過(guò)md5進(jìn)行加密 * @param source 要加密的數(shù)據(jù) * @return * @throws NoSuchAlgorithmException */ private static String getMd5(String source) throws NoSuchAlgorithmException { //1.獲取MessageDigest對(duì)象 MessageDigest digest = MessageDigest.getInstance("md5"); //2.執(zhí)行加密操作 byte[] bytes = source.getBytes(); //在MD5算法這,得到的目標(biāo)字節(jié)數(shù)組的特點(diǎn):長(zhǎng)度固定為16 byte[] targetBytes = digest.digest(bytes); //3.聲明字符數(shù)組 char [] characters = new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; //4.遍歷targetBytes StringBuilder builder = new StringBuilder(); for (byte b : targetBytes) { //5.取出b的高四位的值 //先把高四位通過(guò)右移操作拽到低四位 int high = (b >> 4) & 15; //6.取出b的低四位的值 int low = b & 15; //7.以high為下標(biāo)從characters中取出對(duì)應(yīng)的十六進(jìn)制字符 char highChar = characters[high]; //8.以low為下標(biāo)從characters中取出對(duì)應(yīng)的十六進(jìn)制字符 char lowChar = characters[low]; builder.append(highChar).append(lowChar); } return builder.toString(); } }
測(cè)試結(jié)果:
4297F44B13955235245B2497399D7A93
封裝成工具類:
package com.company; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Tool { private static ThreadLocal<MD5Tool> md5ToolThreadLocal = new ThreadLocal<>(); private MD5Tool() { } /** * 獲取一個(gè)MD5工具實(shí)例 */ public static MD5Tool getInstance() { if (md5ToolThreadLocal.get() == null) { md5ToolThreadLocal.set(new MD5Tool()); } return md5ToolThreadLocal.get(); } /** * 通過(guò)md5進(jìn)行加密 * * @param source 要加密的數(shù)據(jù) * @return * @throws NoSuchAlgorithmException */ public String getMd5(String source) throws NoSuchAlgorithmException { //1.獲取MessageDigest對(duì)象 MessageDigest digest = MessageDigest.getInstance("md5"); //2.執(zhí)行加密操作 byte[] bytes = source.getBytes(); //在MD5算法這,得到的目標(biāo)字節(jié)數(shù)組的特點(diǎn):長(zhǎng)度固定為16 byte[] targetBytes = digest.digest(bytes); //3.聲明字符數(shù)組 char[] characters = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; //4.遍歷targetBytes StringBuilder builder = new StringBuilder(); for (byte b : targetBytes) { //5.取出b的高四位的值 //先把高四位通過(guò)右移操作拽到低四位 int high = (b >> 4) & 15; //6.取出b的低四位的值 int low = b & 15; //7.以high為下標(biāo)從characters中取出對(duì)應(yīng)的十六進(jìn)制字符 char highChar = characters[high]; //8.以low為下標(biāo)從characters中取出對(duì)應(yīng)的十六進(jìn)制字符 char lowChar = characters[low]; builder.append(highChar).append(lowChar); } return builder.toString(); } }
到此這篇關(guān)于Java中MessageDigest來(lái)實(shí)現(xiàn)數(shù)據(jù)加密的方法的文章就介紹到這了,更多相關(guān)MessageDigest 數(shù)據(jù)加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Security如何基于Authentication獲取用戶信息
這篇文章主要介紹了Spring Security如何基于Authentication獲取用戶信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Java鏈表(Linked List)基本原理與實(shí)現(xiàn)方法入門示例
這篇文章主要介紹了Java鏈表(Linked List)基本原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Java鏈表(Linked List)的功能、原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送功能
郵件發(fā)送是一個(gè)很普遍的功能,springboot整合了相關(guān)的starter,本文給大家介紹了可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的郵件發(fā)送功能的實(shí)例,文中通過(guò)代碼給大家介紹的非常詳細(xì),感興趣的朋友可以參考下2023-12-12Spring 數(shù)據(jù)庫(kù)連接池(JDBC)詳解
本篇文章主要介紹了基于Spring的JDBC基本框架搭建;基于Spring的JDBC增刪改查;讀取配置文件中的數(shù)據(jù)等,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05Java超詳細(xì)講解設(shè)計(jì)模式之一的工廠模式
工廠模式有 3 種不同的實(shí)現(xiàn)方式,分別是簡(jiǎn)單工廠模式、工廠方法模式和抽象工廠模式,工廠模式最大的特點(diǎn)就是解耦合,本篇帶你詳細(xì)了解它2022-03-03Java棧和基礎(chǔ)隊(duì)列的實(shí)現(xiàn)詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列,在Java的時(shí)候,對(duì)于棧與隊(duì)列的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。本文小編就來(lái)詳細(xì)說(shuō)說(shuō)Java中的棧與隊(duì)列,需要的朋友可以參考一下2022-02-02非常詳細(xì)的Java異常處理機(jī)制知識(shí)整理大全
Java異常指在程序運(yùn)行時(shí)可能出現(xiàn)的一些錯(cuò)誤,比如試圖打開一個(gè)根本不存在的文件等,異常處理將會(huì)改變程序的控制流程,讓程序有機(jī)會(huì)對(duì)錯(cuò)誤做出處理,下面這篇文章主要給大家介紹了關(guān)于Java異常處理機(jī)制知識(shí)整理的相關(guān)資料,需要的朋友可以參考下2022-11-11