java 中 MD5加密的實例
java 中 MD5加密的實例
前言:
今天我來學(xué)習(xí)利用JAVA編程,通過MD5來實現(xiàn)加密,同時實現(xiàn)驗證用戶登錄原理。
主要是 過程:
將原文的byte 文件通過 MD5加密完成 后。再將其轉(zhuǎn)化為我們能看懂的密文(MD5生成的byte數(shù)據(jù),我們無法識別)
主要代碼如下
package techDemo;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
import org.junit.Test;
import sun.misc.BASE64Encoder;
/**
* MD5加密算法
* @author<a href="mailto:953801304@qq.com" rel="external nofollow" >胡龍華</a>
* @version 2017-5-30 下午1:34:51
* @fileName MD5.java
*/
public class MD5 {
public static void main(String[] args) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
// 原文:
String pwd = "12345";
// digese---得到byte數(shù)組 加密后的
byte b []= md.digest(pwd.getBytes());
System.out.println(b.length); // 16
// 再將byte b [] 轉(zhuǎn)化為我們能看的懂 密文
//第一種方式:BASE64Encoder (要導(dǎo)依賴包)
BASE64Encoder bd = new BASE64Encoder();
//密文1:
String strpwd1 = bd.encode(b);
System.out.println(strpwd1);
//第二種方式:自己寫代碼將byte 數(shù)組轉(zhuǎn)化為16進制的并且最后的密文保證長度為32
String strpwd2 = "";
for(byte i:b){
// 將單個字節(jié)轉(zhuǎn)化為 16 進制
String s = Integer.toHexString(i & 0xff);
// 當(dāng)i<16時,長度為1加個符號 ,這樣可以保證最后為 密文為32
if(s.length()==1){
s = s + "0";
}
strpwd2 += s;
}
System.out.println(strpwd2);
/* 輸出結(jié)果
16
gnzLDuqKcGxMNKFokfhOew==
827ccbe0ea8a706c4c34a16891f84e7b */
}
// 演示模擬用戶登錄
@Test
public void demoLogin()throws Exception{
// 當(dāng)用戶注冊成功時,把用戶的密碼生成密文和用戶名一起保存
// 登錄時,通過把用戶輸入密碼再次生成密文,判斷兩次密文是否一致來驗證用戶
// 假設(shè)用戶密碼是 123456789,先生成密文
String pwd = "123456789";
String Mpwd = Md5(pwd);
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("請輸入密碼");
String p = sc.nextLine();
if(Mpwd.equals( Md5(p))){
System.out.println("密碼正確");
break;
}else{
System.out.println("密碼錯誤,請重新輸入");
}
}
}
private String Md5(String pwd) throws NoSuchAlgorithmException {
String Mpwd ="";
MessageDigest md = MessageDigest.getInstance("MD5");
byte b [] = md.digest(pwd.getBytes());
for(byte i:b){
String s = Integer.toHexString( i & 0xff);
if(s.length()==1){
s = s +"0";
}
Mpwd = s + pwd;
}
return Mpwd;
}
}
下面是 我們老師的代碼 更加細節(jié)
package techDemo;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.junit.Test;
import sun.misc.BASE64Encoder;
public class Md5Demo {
//加密算法類java.security.MessageDigest
@Test//md5加密的核心代碼
public void demo1() throws Exception{
MessageDigest md = MessageDigest.getInstance("MD5");
String pwd="ewi24343423";
byte b1[] = pwd.getBytes();
byte b2[] = md.digest( b1 ); //利用md對象把 明文b1[] 加密成 密文b2[]
//至此,其實md5加密已經(jīng)完成,可惜它生成的密文全是字節(jié)數(shù)據(jù),不是我們通常習(xí)慣(看得懂)的16進制的數(shù)
//因此還要進一步處理---見demo2()演示
System.out.println("len:"+b2.length); //永遠是:16 ---md5加密算法中,無論明文數(shù)據(jù)有多長,密文都是16個字節(jié)數(shù)據(jù)
for(byte b: b2){
//System.out.print(b+" ");
System.out.print((char)b+" ");
}
System.out.println();
}
@Test//把md5生成的密文轉(zhuǎn)換成我們習(xí)慣的方式---與前面相比,怪字符少一些,但還不是16進制
public void demo2() throws Exception{
MessageDigest md = MessageDigest.getInstance("MD5");
String pwd="ewi24343423";
byte b1[] = pwd.getBytes();
byte b2[] = md.digest( b1 ); //利用md對象把 明文b1[] 加密成 密文b2[]
System.out.println("len:"+b2.length); //永遠是:16
BASE64Encoder en = new BASE64Encoder();
String pwd2 = en.encode(b2);
System.out.println(pwd2);
}
/*
* demo2()方法的缺點:
* 1. 密文不是我們最習(xí)慣的16進制方式
* 2. 所使用的類BASE64Encoder在API中沒有,意味著該類是沒有公開
* 給我們程序員用的,因此它如果變動了,我們是無話可說的即不穩(wěn)定的!
* ---不在接口中,官方是可以隨便更改
*/
@Test //自己手動寫代碼,把md5生成的密文轉(zhuǎn)換成 我們最習(xí)慣的16進制方式
public void demo3()throws Exception{
MessageDigest md = MessageDigest.getInstance("MD5");
String pwd="e655656w23";
byte b1[] = pwd.getBytes();
byte b2[] = md.digest( b1 ); //利用md對象把 明文b1[] 加密成 密文b2[]
System.out.println("len:"+b2.length); //永遠是:16
//手動寫代碼,把16個byte數(shù)據(jù) 轉(zhuǎn)換成 32個 16進制數(shù)
String pwd2="";
for(byte i: b2){
String s = Integer.toHexString(i & 0xff); //如果i<16則s只有一位,只有>=16的i轉(zhuǎn)換成的s才是兩位
if(s.length()==1){
s ="0"+s; // s ="f"+s;
}
pwd2 +=s;
}
pwd2 = pwd2.toUpperCase();
System.out.println(pwd2.length());
System.out.println(pwd2);
}
}
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Java 并發(fā)編程學(xué)習(xí)筆記之核心理論基礎(chǔ)
編寫優(yōu)質(zhì)的并發(fā)代碼是一件難度極高的事情。Java語言從第一版本開始內(nèi)置了對多線程的支持,這一點在當(dāng)年是非常了不起的,但是當(dāng)我們對并發(fā)編程有了更深刻的認(rèn)識和更多的實踐后,實現(xiàn)并發(fā)編程就有了更多的方案和更好的選擇。本文是對并發(fā)編程的核心理論做了下小結(jié)2016-05-05
Java之SpringBoot集成ActiveMQ消息中間件案例講解
這篇文章主要介紹了Java之SpringBoot集成ActiveMQ消息中間件案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
Spring在多線程環(huán)境下如何確保事務(wù)一致性問題詳解
這篇文章主要介紹了Spring在多線程環(huán)境下如何確保事務(wù)一致性問題詳解,說到異步執(zhí)行,很多小伙伴首先想到Spring中提供的@Async注解,但是Spring提供的異步執(zhí)行任務(wù)能力并不足以解決我們當(dāng)前的需求,需要的朋友可以參考下2023-11-11
Java編程實現(xiàn)從給定范圍內(nèi)隨機N個不重復(fù)數(shù)生成隨機數(shù)的方法小結(jié)
這篇文章主要介紹了Java編程實現(xiàn)從給定范圍內(nèi)隨機N個不重復(fù)數(shù)生成隨機數(shù)的方法,結(jié)合實例形式較為詳細的分析了java根據(jù)指定范圍生成不重復(fù)隨機數(shù)的相關(guān)操作技巧,需要的朋友可以參考下2017-04-04
javacv-ffmpeg ProcessBuilder批量旋轉(zhuǎn)圖片方式
為了批量處理大量圖片的旋轉(zhuǎn),可以使用javacv-ffmpeg結(jié)合ProcessBuilder,首先在maven配置文件中添加ffmpeg及javacpp依賴,javacpp支持調(diào)用C/C++方法,而ffmpeg基于C語言,使用ProcessBuilder創(chuàng)建進程調(diào)用ffmpeg方法2024-09-09
郵件的組織結(jié)構(gòu)介紹 郵件實現(xiàn)詳解(三)
這篇文章主要為大家詳細介紹了郵件的組織結(jié)構(gòu),郵件內(nèi)容的基本格式和具體細節(jié),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10

