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

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

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

MD5加密簡(jiǎn)介

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

MD5加密原理

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

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

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

MD5加密常用方法

 /**  
     * 用MD5算法進(jìn)行加密  
     * @param str 需要加密的字符串  
     * @return MD5加密后的結(jié)果  
	 * @throws UnsupportedEncodingException 
     */    
public static String encodeMD5String(String str) {    
       	return getMD5(str);
    }
 /**
     * MD5編碼方法, 該方法存在漏洞,特殊情況下編碼后的字符串只有31位長(zhǎng)度
     * @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)容進(jìn)行解碼  
	     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)容進(jìn)行解碼
		return new String(decryptResult, UTF8);
    }

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

    對(duì)于初學(xué)java的同學(xué)來說,第一件事不是寫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的一個(gè)二元操作符,和==,>,<是同一類東東。由于它是由字母組成的,所以也是Java的保留關(guān)鍵字。它的作用是測(cè)試它左邊的對(duì)象是否是它右邊的類的實(shí)例,返回boolean類型的數(shù)據(jù)
    2013-10-10
  • SpringBoot整合mybatis的方法詳解

    SpringBoot整合mybatis的方法詳解

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

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

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

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

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

最新評(píng)論

平顺县| 三门峡市| 瓮安县| 南开区| 孙吴县| 禹城市| 策勒县| 延吉市| 日喀则市| 峨眉山市| 西和县| 南溪县| 四平市| 庄浪县| 安阳县| 南川市| 洛川县| 武功县| 大厂| 大名县| 邵阳县| 宁城县| 枣庄市| 金阳县| 隆昌县| 宿州市| 溧水县| 克山县| 治多县| 宣威市| 天等县| 台南县| 巴青县| 龙门县| 木兰县| 班戈县| 新建县| 蒲城县| 民权县| 康保县| 晋江市|