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

java 中 MD5加密的實例

 更新時間:2017年09月21日 11:07:31   作者:海那邊的小萌男  
這篇文章主要介紹了java 中 MD5加密的實例的相關(guān)資料,通過本文希望能幫助到大家,需要的朋友可以參考下

java 中 MD5加密的實例

前言:

今天我來學習利用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 (要導依賴包)
    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);
      // 當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{
    // 當用戶注冊成功時,把用戶的密碼生成密文和用戶名一起保存
    // 登錄時,通過把用戶輸入密碼再次生成密文,判斷兩次密文是否一致來驗證用戶

    // 假設(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ù),不是我們通常習慣(看得懂)的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)換成我們習慣的方式---與前面相比,怪字符少一些,但還不是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. 密文不是我們最習慣的16進制方式
   * 2. 所使用的類BASE64Encoder在API中沒有,意味著該類是沒有公開
   *  給我們程序員用的,因此它如果變動了,我們是無話可說的即不穩(wěn)定的!
   *  ---不在接口中,官方是可以隨便更改
   */

  @Test //自己手動寫代碼,把md5生成的密文轉(zhuǎn)換成 我們最習慣的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)文章

  • mybatis多表查詢的實現(xiàn)(xml方式)

    mybatis多表查詢的實現(xiàn)(xml方式)

    本文主要介紹了mybatis多表查詢的實現(xiàn)(xml方式),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SpringBoot項目啟動時如何讀取配置以及初始化資源

    SpringBoot項目啟動時如何讀取配置以及初始化資源

    這篇文章主要給大家介紹了關(guān)于SpringBoot項目啟動時如何讀取配置以及初始化資源的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用SpringBoot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-06-06
  • Spring?Boot中的max-http-header-size配置方式

    Spring?Boot中的max-http-header-size配置方式

    這篇文章主要介紹了Spring?Boot中的max-http-header-size配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java構(gòu)建JDBC應用程序的實例操作

    Java構(gòu)建JDBC應用程序的實例操作

    在本篇文章里小編給大家整理了一篇關(guān)于Java構(gòu)建JDBC應用程序的實例操作,有興趣的朋友們可以學習參考下。
    2021-03-03
  • MyBatis-Plus數(shù)據(jù)庫配置與數(shù)據(jù)源整合方案

    MyBatis-Plus數(shù)據(jù)庫配置與數(shù)據(jù)源整合方案

    本文詳細介紹了在MyBatis-Plus中進行數(shù)據(jù)庫配置與數(shù)據(jù)源整合的常見方法,包括單數(shù)據(jù)源和多數(shù)據(jù)源的配置步驟,以及如何使用SpringBoot的自動配置和手動配置來管理數(shù)據(jù)源,通過合理的配置,開發(fā)者可以簡化數(shù)據(jù)庫操作,實現(xiàn)高效的數(shù)據(jù)庫管理和復雜的應用架構(gòu)
    2025-02-02
  • swagger2隱藏在API文檔顯示某些參數(shù)的操作

    swagger2隱藏在API文檔顯示某些參數(shù)的操作

    這篇文章主要介紹了swagger2隱藏在API文檔顯示某些參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java字符串日期類Date和Calendar相互轉(zhuǎn)化及相關(guān)常用方法

    java字符串日期類Date和Calendar相互轉(zhuǎn)化及相關(guān)常用方法

    Java語言的Calendar(日歷),Date(日期),和DateFormat(日期格式)組成了Java標準的一個基本但是非常重要的部分,下面這篇文章主要給大家介紹了關(guān)于java字符串日期類Date和Calendar相互轉(zhuǎn)化及相關(guān)常用方法的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • Spring Junit單元測試加載配置文件失敗問題

    Spring Junit單元測試加載配置文件失敗問題

    這篇文章主要介紹了Spring Junit加載配置文件失敗問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Mybatis3 if判斷字符串變態(tài)寫法

    Mybatis3 if判斷字符串變態(tài)寫法

    這篇文章主要介紹了Mybatis3 if判斷字符串變態(tài)的寫法,非常不錯,具有參考借鑒價值,需要的朋友參考下
    2017-01-01
  • java 如何把byte轉(zhuǎn)化為KB、MB、GB的方法

    java 如何把byte轉(zhuǎn)化為KB、MB、GB的方法

    這篇文章主要介紹了java 如何把byte轉(zhuǎn)化為KB、MB、GB的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論

柳江县| 诸暨市| 永吉县| 定安县| 碌曲县| 武川县| 阿克苏市| 连云港市| 泗阳县| 台中县| 麦盖提县| 门源| 临猗县| 鱼台县| 桃江县| 舟山市| 辽宁省| 湟中县| 灵璧县| 上高县| 安庆市| 青铜峡市| 正安县| 淮南市| 响水县| 泽库县| 清涧县| 武冈市| 咸宁市| 连州市| 民县| 深水埗区| 孟州市| 工布江达县| 保康县| 沙田区| 平度市| 邯郸县| 铜陵市| 屏山县| 静宁县|