MessageDigest來實現數據加密


MessageDigest

MessageDigest 類為應用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的單向哈希函數,它接收任意大小的數據,輸出固定長度的哈希值。

MessageDigest 對象開始被初始化。該對象通過使用 update 方法處理數據。任何時候都可以調用 reset 方法重置摘要。一旦所有需要更新的數據都已經被更新了,應該調用 digest 方法之一完成哈希計算。

對於給定數量的更新數據,digest 方法只能被調用一次。digest 被調用后,MessageDigest 對象被重新設置成其初始狀態。

舉個簡單的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);

    }

    /**
     * 通過md5進行加密
     * @param source 要加密的數據
     * @return
     * @throws NoSuchAlgorithmException
     */
    private static String getMd5(String source) throws NoSuchAlgorithmException {
        //1.獲取MessageDigest對象
        MessageDigest digest = MessageDigest.getInstance("md5");

        //2.執行加密操作
        byte[] bytes = source.getBytes();

        //在MD5算法這,得到的目標字節數組的特點:長度固定為16
        byte[] targetBytes = digest.digest(bytes);

        //3.聲明字符數組
        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的高四位的值
            //先把高四位通過右移操作拽到低四位
            int high = (b >> 4) & 15;

            //6.取出b的低四位的值
            int low = b & 15;

            //7.以high為下標從characters中取出對應的十六進制字符
            char highChar = characters[high];

            //8.以low為下標從characters中取出對應的十六進制字符
            char lowChar = characters[low];

            builder.append(highChar).append(lowChar);
        }

        return builder.toString();
    }

}

測試結果:

4297F44B13955235245B2497399D7A93

封裝成工具類:

package com.company;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Tool {
    private static ThreadLocal<MD5Tool> md5ToolThreadLocal = new ThreadLocal<>();

    private MD5Tool() {
    }

    /**
     * 獲取一個MD5工具實例
     */
    public static MD5Tool getInstance() {
        if (md5ToolThreadLocal.get() == null) {
            md5ToolThreadLocal.set(new MD5Tool());
        }
        return md5ToolThreadLocal.get();
    }

    /**
     * 通過md5進行加密
     *
     * @param source 要加密的數據
     * @return
     * @throws NoSuchAlgorithmException
     */
    public String getMd5(String source) throws NoSuchAlgorithmException {
        //1.獲取MessageDigest對象
        MessageDigest digest = MessageDigest.getInstance("md5");

        //2.執行加密操作
        byte[] bytes = source.getBytes();

        //在MD5算法這,得到的目標字節數組的特點:長度固定為16
        byte[] targetBytes = digest.digest(bytes);

        //3.聲明字符數組
        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的高四位的值
            //先把高四位通過右移操作拽到低四位
            int high = (b >> 4) & 15;

            //6.取出b的低四位的值
            int low = b & 15;

            //7.以high為下標從characters中取出對應的十六進制字符
            char highChar = characters[high];

            //8.以low為下標從characters中取出對應的十六進制字符
            char lowChar = characters[low];

            builder.append(highChar).append(lowChar);
        }

        return builder.toString();
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM