JAVA對(duì)字符串進(jìn)行32位MD5加密的實(shí)踐
MD5簡(jiǎn)單介紹
MD5 加密后的位數(shù)有兩種:16 位與 32 位。默認(rèn)使用32位。 (16 位實(shí)際上是從 32 位字符串中取中間的第 9 位到第 24 位的部分)為提高安全性。根據(jù)業(yè)務(wù)需求,可以對(duì)md5 添加偏移量。如對(duì)原有字符拼接指定位數(shù)的字符串。
MD5信息摘要算法(英語(yǔ):MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生出一個(gè)128位(16字節(jié))的散列值(hash value),用于確保信息傳輸完整一致。MD5由美國(guó)密碼學(xué)家羅納德·李維斯特(Ronald Linn Rivest)設(shè)計(jì),于1992年公開(kāi),用以取代MD4算法。這套算法的程序在 RFC 1321 標(biāo)準(zhǔn)中被加以規(guī)范。1996年后該算法被證實(shí)存在弱點(diǎn),可以被加以破解,對(duì)于需要高度安全性的數(shù)據(jù),專家一般建議改用其他算法,如SHA-2。2004年,證實(shí)MD5算法無(wú)法防止碰撞(collision),因此不適用于安全性認(rèn)證,如SSL公開(kāi)密鑰認(rèn)證或是數(shù)字簽名等用途。
大家都知道,地球上任何人都有自己獨(dú)一無(wú)二的指紋,這常常成為公安機(jī)關(guān)鑒別罪犯身份最值得信賴的方法;與之類(lèi)似,MD5就可以為任何文件(不管其大小、格式、數(shù)量)產(chǎn)生一個(gè)同樣獨(dú)一無(wú)二的“數(shù)字指紋”,如果任何人對(duì)文件做了任何改動(dòng),其MD5值也就是對(duì)應(yīng)的“數(shù)字指紋”就會(huì)發(fā)生變化。
MD5算法具有以下特點(diǎn)
1、壓縮性:任意長(zhǎng)度的數(shù)據(jù),算出的MD5值長(zhǎng)度都是固定的。
2、容易計(jì)算:從原數(shù)據(jù)計(jì)算出MD5值很容易。
3、抗修改性:對(duì)原數(shù)據(jù)進(jìn)行任何改動(dòng),哪怕只修改1個(gè)字節(jié),所得到的MD5值都有很大區(qū)別。
4、強(qiáng)抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個(gè)具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
代碼1
public static void main(String[] args) { String s ="202111012231046012000000111101705104827"; for (int i = 0; i <50 ; i++) { System.out.println( EncodeByMD5(s).toUpperCase()+" 長(zhǎng)度"+EncodeByMD5(s).toUpperCase().length()); } } /** * 對(duì)字符串進(jìn)行32位MD5加密 * @param str * @return */ public static String EncodeByMD5(String str) { try { // 生成一個(gè)MD5加密計(jì)算摘要 MessageDigest md = MessageDigest.getInstance("MD5"); // 計(jì)算md5函數(shù) md.update(str.getBytes("UTF-8")); // digest()最后確定返回md5 hash值,返回值為8為字符串。因?yàn)閙d5 hash值是16位的hex值,實(shí)際上就是8位的字符 // BigInteger函數(shù)則將8位的字符串轉(zhuǎn)換成16位hex值,用字符串來(lái)表示;得到字符串形式的hash值 String md5=new BigInteger(1, md.digest()).toString(16); //BigInteger會(huì)把0省略掉,需補(bǔ)全至32位 return fillMD5(md5); } catch (Exception e) { throw new RuntimeException("MD5加密錯(cuò)誤:"+e.getMessage(),e); } } private static String fillMD5(String md5){ //如果不夠32位則回調(diào)自身補(bǔ)零,最后返回32位長(zhǎng)度的簽名 return md5.length()==32?md5:fillMD5("0"+md5); }
MD5Util
package com.kuang.jiami; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Util { //待加密的密碼 public static String password = "202111012231046012000000111101705104829"; public static void main(String args[]) { //結(jié)果字符串 String result = ""; try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(password.getBytes()); byte b[] = md.digest(); int i; StringBuffer buf = new StringBuffer(""); for (int offset = 0; offset < b.length; offset++) { i = b[offset]; if (i < 0) i += 256; if (i < 16) buf.append("0"); buf.append(Integer.toHexString(i)); } result = buf.toString(); System.out.println("MD5(" + password + ",32小寫(xiě)) = " + result); System.out.println("MD5(" + password + ",32大寫(xiě)) = " + result.toUpperCase()); System.out.println("++++++++++++++++++++++++各位大哥借過(guò)+++++++++++++++++++++++"); System.out.println("MD5(" + password + ",16小寫(xiě)) = " + buf.toString().substring(8, 24)); System.out.println("MD5(" + password + ",16大寫(xiě)) = " + buf.toString().substring(8, 24).toUpperCase()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } }
MD5Helper
package com.kuang.jiami; import java.security.MessageDigest; public class MD5Helper { public static String encrypt32(String encryptStr) { MessageDigest md5; try { md5 = MessageDigest.getInstance("MD5"); byte[] md5Bytes = md5.digest(encryptStr.getBytes()); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) { int val = ((int) md5Bytes[i]) & 0xff; if (val < 16) hexValue.append("0"); hexValue.append(Integer.toHexString(val)); } encryptStr = hexValue.toString(); } catch (Exception e) { throw new RuntimeException(e); } return encryptStr; } public static String encrypt16(String encryptStr) { return encrypt32(encryptStr).substring(8, 24); } public static void main(String[] args) { String encryptStr = "202111012231046012000000111101705104829"; System.out.println(MD5Helper.encrypt32(encryptStr).toUpperCase()); System.out.println(MD5Helper.encrypt16(encryptStr).toUpperCase()); } }
到此這篇關(guān)于JAVA對(duì)字符串進(jìn)行32位MD5加密的實(shí)踐的文章就介紹到這了,更多相關(guān)JAVA 字符串32位MD5加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)插入排序,希爾排序和歸并排序
這篇文章主要為大家詳細(xì)介紹了插入排序,希爾排序和歸并排序的多種語(yǔ)言的實(shí)現(xiàn)(JavaScript、Python、Go語(yǔ)言、Java),感興趣的小伙伴可以了解一下2022-12-12Java?設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解原型模式
原型模式是用于創(chuàng)建重復(fù)的對(duì)象,同時(shí)又能保證性能。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式,今天通過(guò)本文給大家介紹下Java 原型設(shè)計(jì)模式,感興趣的朋友一起看看吧2022-04-04使用Mybatis-plus實(shí)現(xiàn)時(shí)間自動(dòng)填充(代碼直接可用)
這篇文章主要介紹了使用Mybatis-plus實(shí)現(xiàn)時(shí)間自動(dòng)填充(代碼直接可用),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06劍指Offer之Java算法習(xí)題精講排列與N叉樹(shù)
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03SpringBoot中調(diào)用通用URL的實(shí)現(xiàn)
在 Spring Boot 應(yīng)用程序中,有時(shí)候我們需要調(diào)用一些通用的 URL 接口,本文主要介紹了SpringBoot中調(diào)用通用URL的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07java設(shè)計(jì)模式理解依賴于抽象不依賴具體的分析
這篇文章主要為大家介紹了java設(shè)計(jì)模式的規(guī)則,理解依賴于抽象不依賴具體的示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10