最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文搞懂Java MD5算法的原理及實現(xiàn)

 更新時間:2022年06月13日 11:17:03   作者:java奧斯卡  
MD5信息摘要算法,一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生出一個128位(16字節(jié))的散列值(hash value),用于確保信息傳輸完整一致。本文將詳解MD5算法的原理及實現(xiàn),感興趣的可以了解一下

MD5加密簡介

哈希算法又稱散列算法,是將任何數(shù)據(jù)轉(zhuǎn)換成固定長度的算法的統(tǒng)稱。 從本質(zhì)上講,MD5也是一種哈希算法,其輸出是生成128位的輸出結(jié)果。 如果輸入兩個不同的明文,就會輸出兩個不同的輸出值,并且根據(jù)輸出值,不能得到原始的明文,這個過程是不可逆的。

MD5加密原理

MD5算法對512位報文的輸入信息進行處理,每個報文被分成16個32位報文。 經(jīng)過一系列處理后,算法的輸出由4個32位的數(shù)據(jù)包組成,這些數(shù)據(jù)包級聯(lián)生成一個128位的哈希值。  

   在MD5算法中,信息的填寫方式是這樣的:消息后面跟著一個1,然后是無數(shù)個0,直到512字節(jié)的剩余數(shù)等于448 (n*512) + 448。 為什么剩下的是448,因為剩下的512-448是64位,表示填充前的消息長度。 加上剩下的64位,(n+1)乘以512,也就是512的整數(shù)倍。  

然后循環(huán)通過link變量獲得結(jié)果。 MD5包含四個32位整數(shù)參數(shù),稱為鏈接變量:A=0x01234567, B= 0x89ABCdef, C= 0xFeDCba98, D=0x76543210。 一旦設置好四個鏈接變量,算法就開始了四輪循環(huán)。 具體的內(nèi)部計算是關(guān)于數(shù)學的。如果你感興趣,你可以自己理解。這里沒有更多的解釋。

MD5加密常用方法

 /**  
     * 用MD5算法進行加密  
     * @param str 需要加密的字符串  
     * @return MD5加密后的結(jié)果  
	 * @throws UnsupportedEncodingException 
     */    
public static String encodeMD5String(String str) {    
       	return getMD5(str);
    }
 /**
     * MD5編碼方法, 該方法存在漏洞,特殊情況下編碼后的字符串只有31位長度
     * @param str
     * @param method
     * @return
     * @throws UnsupportedEncodingException
     */
private static String encode(String str, String method) throws UnsupportedEncodingException {    
        MessageDigest md = null;    
        String dstr = null;    
        try {    
            md = MessageDigest.getInstance(method);    
            md.update(str.getBytes("UTF-8"));    
            dstr = new BigInteger(1, md.digest()).toString(16);    
        } catch (NoSuchAlgorithmException e) {    
            e.printStackTrace();    
        }    
        return dstr;    
    }
/**
     * MD5編碼方法
     * @param message
     * @return
     */
    public static String getMD5(String message) {  
        MessageDigest messageDigest = null;  
        StringBuffer md5StrBuff = new StringBuffer();  
        try {  
            messageDigest = MessageDigest.getInstance("MD5");  
            messageDigest.reset();  
            messageDigest.update(message.getBytes("UTF-8"));  
              
            byte[] byteArray = messageDigest.digest();  
            for (int i = 0; i < byteArray.length; i++)   
            {  
                if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)  
                    md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));  
                else  
                    md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));  
            }  
        } catch (Exception e) {  
            throw new RuntimeException();  
        }  
        return md5StrBuff.toString().toUpperCase();//字母大寫  
    } 
 /**
     * 加密
     * @param content
     * @return
     */
    public static String encrypt(String content) {
    	String password = "12345678dd";
    	byte[] encryptResult = encrypt(content, password);  
        String encryptResultStr = parseByte2HexStr(encryptResult);  
        return encryptResultStr;
    }
/**
     * 加密
     * @param content
     * @param password
     * @return
     */
    public static String encryptStr(String content, String password) {
    	byte[] encryptResult = encrypt(content, password);  
        return parseByte2HexStr(encryptResult);
    }
/**
     * 解密
     * @param encryptResultStr
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String decrypt(String encryptResultStr) throws UnsupportedEncodingException {
    	String password = "12345678dd";
    	 byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);  
	     byte[] decryptResult = decrypt(decryptFrom, password);  
	     // 解密內(nèi)容進行解碼  
	     String result = new String(decryptResult, UTF8);  
	     return result;
    }
/**
     * 解密
     * @param encryptStr
     * @param password
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String decryptStr(String encryptStr, String password) throws UnsupportedEncodingException {
		byte[] decryptFrom = parseHexStr2Byte(encryptStr);
		byte[] decryptResult = decrypt(decryptFrom, password);
		// 解密內(nèi)容進行解碼
		return new String(decryptResult, UTF8);
    }

到此這篇關(guān)于一文搞懂Java MD5算法的原理及實現(xiàn)的文章就介紹到這了,更多相關(guān)Java MD5算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解JAVA中接口的定義和接口的實現(xiàn)

    詳解JAVA中接口的定義和接口的實現(xiàn)

    這篇文章主要介紹了JAVA中接口的定義和接口的實現(xiàn),文中講解非常細致,配合代碼更好的幫大家學習參考,感興趣的朋友可以了解下
    2020-06-06
  • Springboot2.7+Minio8 實現(xiàn)大文件分片上傳

    Springboot2.7+Minio8 實現(xiàn)大文件分片上傳

    本文主要介紹了Springboot2.7+Minio8 實現(xiàn)大文件分片上傳,通過文件切片上傳,我們能夠提高文件上傳的速度,優(yōu)化用戶體驗,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • SpringBoot Redis用注釋實現(xiàn)接口限流詳解

    SpringBoot Redis用注釋實現(xiàn)接口限流詳解

    Redis 除了做緩存,還能干很多很多事情:分布式鎖、限流、處理請求接口冪等性。。。太多太多了~今天想和小伙伴們聊聊用 Redis 處理接口限流,這也是最近的 項目涉及到這個知識點了,我就拎出來和大家聊聊這個話題
    2022-07-07
  • Java如何使用命令查看內(nèi)存占用情況

    Java如何使用命令查看內(nèi)存占用情況

    jhat是一個用于分析Java堆轉(zhuǎn)儲文件的工具,通過啟動Web服務器并加載堆轉(zhuǎn)儲文件,可以在瀏覽器中查看占用最多內(nèi)存的類及其詳細信息
    2025-02-02
  • JAVA中尋找最大的K個數(shù)解法

    JAVA中尋找最大的K個數(shù)解法

    尋找最大的K個數(shù),這個是面試中比較常見的一道題,網(wǎng)上也有很多例子,在這里是比較傳統(tǒng)的解法
    2014-04-04
  • java(jdk)環(huán)境變量配置(XP、win7、win8)圖文教程詳解

    java(jdk)環(huán)境變量配置(XP、win7、win8)圖文教程詳解

    對于初學java的同學來說,第一件事不是寫hello world,而是搭建好java開發(fā)環(huán)境,下載jdk,安裝,配置環(huán)境變量。這些操作在xp、win7、win8不同的操作系統(tǒng)里面配置不太一樣,下面通過本文給大家介紹如何在上面不同操作系統(tǒng)下配置
    2017-03-03
  • Java中instanceof關(guān)鍵字的用法總結(jié)

    Java中instanceof關(guān)鍵字的用法總結(jié)

    instanceof是Java的一個二元操作符,和==,>,<是同一類東東。由于它是由字母組成的,所以也是Java的保留關(guān)鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,返回boolean類型的數(shù)據(jù)
    2013-10-10
  • SpringBoot整合mybatis的方法詳解

    SpringBoot整合mybatis的方法詳解

    這篇文章主要為大家詳細介紹了SpringBoot整合mybatis的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java 中的 getDeclaredMethods() 方法(使用與原理)

    Java 中的 getDeclaredMethods() 方法(使用與原理)

    文章介紹了Java反射機制中的`getDeclaredMethods()`方法,詳細講解了其使用方法、原理、注意事項以及實際應用場景,幫助讀者更好地理解和應用這一強大的工具,感興趣的朋友一起看看吧
    2024-12-12
  • Java中通過反射實現(xiàn)代理Proxy代碼實例

    Java中通過反射實現(xiàn)代理Proxy代碼實例

    這篇文章主要介紹了Java中通過反射實現(xiàn)代理Proxy代碼實例,java實現(xiàn)代理可以通過java.lang.reflect.Proxy接口結(jié)合java.lang.reflect.InvocationHandler來實現(xiàn),需要的朋友可以參考下
    2023-08-08

最新評論

祁门县| 保定市| 达尔| 阿鲁科尔沁旗| 重庆市| 富民县| 仪陇县| 永定县| 柳林县| 木里| 图们市| 根河市| 岗巴县| 社旗县| 棋牌| 霞浦县| 银川市| 河南省| 丁青县| 巴林右旗| 博罗县| 平泉县| 绥滨县| 焦作市| 台山市| 独山县| 习水县| 镶黄旗| 平定县| 邹城市| 神农架林区| 扎鲁特旗| 辉县市| 信阳市| 乳山市| 佛山市| 栾川县| 东乡县| 乳山市| 启东市| 东明县|