JAVA使用MD5加密解密

MD5消息摘要算法(英語:MD5?Message-Digest Algorithm),一種被廣泛使用的密碼散列函數(shù)棋恼,可以產(chǎn)生出一個(gè)128位(16字節(jié))的散列值(hash value)湘纵,用于確保信息傳輸完整一致脂崔。

? ? 這波解釋是不是很正經(jīng)嚴(yán)肅,好像看懂了梧喷,但是如果有人問MD5是什么砌左,MD5就是...就是小編也不知道,通俗一點(diǎn)MD5是一種算法铺敌,用于數(shù)據(jù)的安全方面對(duì)數(shù)據(jù)進(jìn)行加密和解密汇歹,雖然MD5被認(rèn)為不安全,而且漸漸被AES所取代偿凭,但是對(duì)于一般的情況下使用時(shí)可以的产弹,例如某個(gè)管理后臺(tái)的賬號(hào)密碼加密,普通的HTTP請(qǐng)求簽名弯囊,數(shù)據(jù)庫存儲(chǔ)的一些重要數(shù)據(jù)加密痰哨,在這小編就說一下MD5在Java上的使用。

? ? 在JDK內(nèi)部集成多種算法匾嘱,包括MD5和AES等斤斧,那MD5在Java上的使用就非常簡單了,默認(rèn)的加密是小寫的奄毡,如下


????知道你們這些懶人肯定要可以復(fù)制的源碼折欠,小編會(huì)在最后附上整個(gè)工具類的源碼的,默認(rèn)的加密就是生成小寫吼过,但是如果想要使用大寫也非常簡單锐秦,就是使用,自定義一個(gè)數(shù)組盗忱,代碼如下


? ? 下面附上整個(gè)工具類的源碼酱床,小編哪里有寫的不好或者有錯(cuò)誤,希望大家能留言指出

import org.apache.commons.codec.binary.Hex;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.Random;

/**

* @date 2019/9/16 10:30

*/

public class MD5Utils {

/**

? ? * 字符串MD5(小寫+字母)

*

? ? * @param str 要進(jìn)行MD5的字符串

? ? */

? ? public static StringgetStrMD5(String str) {

// 獲取MD5實(shí)例

? ? ? ? MessageDigest md5 =null;

? ? ? ? try {

md5 = MessageDigest.getInstance("MD5");

? ? ? ? }catch (NoSuchAlgorithmException e) {

e.printStackTrace();

? ? ? ? ? ? System.out.println(e.toString());

? ? ? ? ? ? return "獲取MD5實(shí)例異常";

? ? ? ? }

// 將加密字符串轉(zhuǎn)換為字符數(shù)組

? ? ? ? char[] charArray = str.toCharArray();

? ? ? ? byte[] byteArray =new byte[charArray.length];

? ? ? ? // 開始加密

? ? ? ? for (int i =0; i < charArray.length; i++)

byteArray[i] = (byte) charArray[i];

? ? ? ? byte[] digest = md5.digest(byteArray);

? ? ? ? StringBuilder sb =new StringBuilder();

? ? ? ? for (int i =0; i < digest.length; i++) {

int var = digest[i] &0xff;

? ? ? ? ? ? if (var <16)

sb.append("0");

? ? ? ? ? ? sb.append(Integer.toHexString(var));

? ? ? ? }

return sb.toString();

? ? }

/**

? ? * 字符串MD5(大寫+字母)

*

? ? * @param password 要進(jìn)行MD5的字符串

? ? */

? ? public static StringgetStrrMD5(String password) {

char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

? ? ? ? try {

byte strTemp[] = password.getBytes("UTF-8");

? ? ? ? ? ? MessageDigest mdTemp = MessageDigest.getInstance("MD5");

? ? ? ? ? ? mdTemp.update(strTemp);

? ? ? ? ? ? byte md[] = mdTemp.digest();

? ? ? ? ? ? int j = md.length;

? ? ? ? ? ? char str[] =new char[j *2];

? ? ? ? ? ? int k =0;

? ? ? ? ? ? for (int i =0; i < j; i++) {

byte byte0 = md[i];

? ? ? ? ? ? ? ? str[k++] = hexDigits[byte0 >>>4 &15];

? ? ? ? ? ? ? ? str[k++] = hexDigits[byte0 &15];

? ? ? ? ? ? }

return new String(str);

? ? ? ? }catch (Exception e) {

return null;

? ? ? ? }

}

/**

? ? * 加鹽MD5

*/

? ? public static StringgetSaltMD5(String password) {

// 生成一個(gè)16位的隨機(jī)數(shù)

? ? ? ? Random random =new Random();

? ? ? ? StringBuilder sBuilder =new StringBuilder(16);

? ? ? ? sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));

? ? ? ? int len = sBuilder.length();

? ? ? ? if (len <16) {

for (int i =0; i <16 - len; i++) {

sBuilder.append("0");

? ? ? ? ? ? }

}

// 生成最終的加密鹽

? ? ? ? String Salt = sBuilder.toString();

? ? ? ? password =md5Hex(password + Salt);

? ? ? ? char[] cs =new char[48];

? ? ? ? for (int i =0; i <48; i +=3) {

cs[i] = password.charAt(i /3 *2);

? ? ? ? ? ? char c = Salt.charAt(i /3);

? ? ? ? ? ? cs[i +1] = c;

? ? ? ? ? ? cs[i +2] = password.charAt(i /3 *2 +1);

? ? ? ? }

return String.valueOf(cs);

? ? }

/**

? ? * 驗(yàn)證加鹽后是否和原文一致

? ? * @param password? md5原文

? ? * @param md5str? ? 加鹽md5后的md5串

? ? */

? ? public static boolean getSaltverifyMD5(String password, String md5str) {

char[] cs1 =new char[32];

? ? ? ? char[] cs2 =new char[16];

? ? ? ? for (int i =0; i <48; i +=3) {

cs1[i /3 *2] = md5str.charAt(i);

? ? ? ? ? ? cs1[i /3 *2 +1] = md5str.charAt(i +2);

? ? ? ? ? ? cs2[i /3] = md5str.charAt(i +1);

? ? ? ? }

String Salt =new String(cs2);

? ? ? ? return md5Hex(password + Salt).equals(String.valueOf(cs1));

? ? }

/**

? ? * 單次加密趟佃,雙次解密

? ? */

? ? public static StringgetconvertMD5(String inStr) {

char[] charArray = inStr.toCharArray();

? ? ? ? for (int i =0; i < charArray.length; i++) {

charArray[i] = (char) (charArray[i] ^'t');

? ? ? ? }

String str = String.valueOf(charArray);

? ? ? ? return str;

? ? }

/**

? ? * 使用Apache的Hex類實(shí)現(xiàn)Hex(16進(jìn)制字符串和)和字節(jié)數(shù)組的互轉(zhuǎn)

? ? */

? ? @SuppressWarnings("unused")

private static Stringmd5Hex(String str) {

try {

MessageDigest md = MessageDigest.getInstance("MD5");

? ? ? ? ? ? byte[] digest = md.digest(str.getBytes());

? ? ? ? ? ? return new String(new Hex().encode(digest));

? ? ? ? }catch (Exception e) {

e.printStackTrace();

? ? ? ? ? ? System.out.println(e.toString());

? ? ? ? ? ? return "";

? ? ? ? }

}

public static void main(String[] args) {

System.out.println(getSaltMD5("admin"));

? ? ? ? System.out.println(getSaltverifyMD5("admin","092956b6b61a40a011f3076c650194991954f3584fa92220"));

? ? ? ? System.out.println(getconvertMD5("admin"));

? ? ? ? System.out.println(getconvertMD5(getconvertMD5("admin")));

? ? }

}


補(bǔ)充說明:

MD5加密算法為現(xiàn)在應(yīng)用最廣泛的哈希算法之一扇谣,該算法廣泛應(yīng)用于互聯(lián)網(wǎng)網(wǎng)站的用戶文件加密,能夠?qū)⒂脩裘艽a加密為128位的長整數(shù)闲昭。數(shù)據(jù)庫并不明文存儲(chǔ)用戶密碼罐寨,而是在用戶登錄時(shí)將輸入密碼字符串進(jìn)行MD5加密,與數(shù)據(jù)庫中所存儲(chǔ)的MD5值匹配序矩,從而降低密碼數(shù)據(jù)庫被盜取后用戶損失的風(fēng)險(xiǎn)鸯绿。

MD5加密算法以512位分組來處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組,經(jīng)過了一系列的處理后瓶蝴,算法的輸出由四個(gè)32位分組組成毒返,將這四個(gè)32位分組級(jí)聯(lián)后將生成一個(gè)128位散列值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舷手,一起剝皮案震驚了整個(gè)濱河市拧簸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌男窟,老刑警劉巖盆赤,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異歉眷,居然都是意外死亡弟劲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門姥芥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汇鞭,你說我怎么就攤上這事凉唐。” “怎么了霍骄?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵台囱,是天一觀的道長。 經(jīng)常有香客問我读整,道長簿训,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任米间,我火速辦了婚禮强品,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屈糊。我一直安慰自己的榛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布逻锐。 她就那樣靜靜地躺著夫晌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昧诱。 梳的紋絲不亂的頭發(fā)上晓淀,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音盏档,去河邊找鬼凶掰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锄俄。 我是一名探鬼主播局劲,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼奶赠!你這毒婦竟也來了鱼填?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤毅戈,失蹤者是張志新(化名)和其女友劉穎苹丸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苇经,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赘理,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扇单。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片商模。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蜘澜,靈堂內(nèi)的尸體忽然破棺而出施流,到底是詐尸還是另有隱情,我是刑警寧澤鄙信,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布瞪醋,位于F島的核電站,受9級(jí)特大地震影響装诡,放射性物質(zhì)發(fā)生泄漏银受。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一鸦采、第九天 我趴在偏房一處隱蔽的房頂上張望宾巍。 院中可真熱鬧,春花似錦渔伯、人聲如沸蜀漆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽确丢。三九已至,卻和暖如春吐限,著一層夾襖步出監(jiān)牢的瞬間鲜侥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工诸典, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留描函,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像舀寓,于是被迫代替她去往敵國和親胆数。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. ASCII 編碼 ASCII(American Standard Code for Information ...
    s酸菜閱讀 8,686評(píng)論 0 8
  • /**ios常見的幾種加密方法: 普通的加密方法是講密碼進(jìn)行加密后保存到用戶偏好設(shè)置( [NSUserDefaul...
    彬至睢陽閱讀 2,932評(píng)論 0 7
  • 概述 之前一直對(duì)加密相關(guān)的算法知之甚少互墓,只知道類似DES必尼、RSA等加密算法能對(duì)數(shù)據(jù)傳輸進(jìn)行加密,且各種加密算法各有...
    Henryzhu閱讀 3,019評(píng)論 0 14
  • #白馬聲慢篡撵,我自首書# 對(duì)不起后面的我愛你判莉,是回不起的心酸,挽不回的瞬美育谬,離人怎挽嗎券盅?不,那是我曾經(jīng)送...
    妖孽異地戀閱讀 244評(píng)論 0 0
  • 天氣漸漸轉(zhuǎn)涼了膛檀,今天晚上我找出了去年的衣服褲子锰镀,結(jié)果褲子往上一套,發(fā)現(xiàn)穿起來特別的緊?小;フ尽!我居然又胖了(╥﹏╥)~...
    兩個(gè)呆呆槑閱讀 57評(píng)論 0 0