欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)DES加密與解密,md5加密以及Java實(shí)現(xiàn)MD5加密解密類

 更新時(shí)間:2015年11月12日 10:23:28   投稿:mrr  
這篇文章主要介紹了Java實(shí)現(xiàn)DES加密與解密,md5加密以及Java實(shí)現(xiàn)MD5加密解密類 ,需要的朋友可以參考下

很多時(shí)候要對(duì)秘要進(jìn)行持久化加密,此時(shí)的加密采用md5。采用對(duì)稱加密的時(shí)候就采用DES方法了

import java.io.IOException;
  import java.security.MessageDigest;
  import java.security.SecureRandom;
  import javax.crypto.Cipher;
  import javax.crypto.SecretKey;
  import javax.crypto.SecretKeyFactory;
  import javax.crypto.spec.DESKeySpec;
 import sun.misc.BASEDecoder;
 import sun.misc.BASEEncoder;
 /**
  * 密匙工具類(包含des加密與md加密)
  * @author mingge
  *
  */
 public class KeysUtil {
     private final static String DES = "DES";
     private final static String MD = "MD";
     private final static String KEY="opeddsaeaddadbcabf";
     /**
      * MD加密算法
      * @param data
      * @return
      */
     public static String mdEncrypt(String data) {
       String resultString = null;
       try {
         resultString = new String(data);
         MessageDigest md = MessageDigest.getInstance(MD);
         resultString =bytehexString(md.digest(resultString.getBytes()));
       } catch (Exception ex) {
       }
       return resultString;
     }
     private static String bytehexString(byte[] bytes) {
       StringBuffer bf = new StringBuffer(bytes.length * );
       for (int i = ; i < bytes.length; i++) {
         if ((bytes[i] & xff) < x) {
           bf.append("T");
         }
         bf.append(Long.toString(bytes[i] & xff, ));
       }
       return bf.toString();
     }
     /**
      * Description 根據(jù)鍵值進(jìn)行加密
      * @param data 
      * @param key 加密鍵byte數(shù)組
      * @return
      * @throws Exception
      */
     public static String desEncrypt(String data, String key) throws Exception {
       if (key==null) {
         key=KEY;
       }
       byte[] bt = encrypt(data.getBytes(), key.getBytes());
       String strs = new BASEEncoder().encode(bt);
       return strs;
     }
     /**
      * Description 根據(jù)鍵值進(jìn)行解密
      * @param data
      * @param key 加密鍵byte數(shù)組
      * @return
      * @throws IOException
      * @throws Exception
      */
     public static String desDecrypt(String data, String key) throws IOException,
         Exception {
       if (data == null){
         return null;
       }
       if (key==null) {
         key=KEY;
       }
       BASEDecoder decoder = new BASEDecoder();
       byte[] buf = decoder.decodeBuffer(data);
       byte[] bt = decrypt(buf,key.getBytes());
       return new String(bt);
     }
     /**
      * Description 根據(jù)鍵值進(jìn)行加密
      * @param data
      * @param key 加密鍵byte數(shù)組
      * @return
      * @throws Exception
      */
     private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
       // 生成一個(gè)可信任的隨機(jī)數(shù)源
       SecureRandom sr = new SecureRandom();
       // 從原始密鑰數(shù)據(jù)創(chuàng)建DESKeySpec對(duì)象
       DESKeySpec dks = new DESKeySpec(key);
       // 創(chuàng)建一個(gè)密鑰工廠,然后用它把DESKeySpec轉(zhuǎn)換成SecretKey對(duì)象
       SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
       SecretKey securekey = keyFactory.generateSecret(dks);
       // Cipher對(duì)象實(shí)際完成加密操作
       Cipher cipher = Cipher.getInstance(DES);
       // 用密鑰初始化Cipher對(duì)象
       cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
       return cipher.doFinal(data);
     }
     /**
     * Description 根據(jù)鍵值進(jìn)行解密
     * @param data
     * @param key 加密鍵byte數(shù)組
     * @return
     * @throws Exception
     */
     private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
       // 生成一個(gè)可信任的隨機(jī)數(shù)源
       SecureRandom sr = new SecureRandom();
       // 從原始密鑰數(shù)據(jù)創(chuàng)建DESKeySpec對(duì)象
       DESKeySpec dks = new DESKeySpec(key);
       // 創(chuàng)建一個(gè)密鑰工廠,然后用它把DESKeySpec轉(zhuǎn)換成SecretKey對(duì)象
       SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
       SecretKey securekey = keyFactory.generateSecret(dks);
       // Cipher對(duì)象實(shí)際完成解密操作
       Cipher cipher = Cipher.getInstance(DES);
       // 用密鑰初始化Cipher對(duì)象
       cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
       return cipher.doFinal(data);
     }
 }

下面在給大家介紹一段代碼關(guān)于Java實(shí)現(xiàn)MD5加密解密類

Java實(shí)現(xiàn)MD5加密以及解密類,附帶測(cè)試類,具體見(jiàn)代碼。

MD5加密解密類——MyMD5Util,代碼如下:

package com.zyg.security.md5; 
import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.security.SecureRandom; 
import java.util.Arrays; 
public class MyMD5Util { 
  private static final String HEX_NUMS_STR="0123456789ABCDEF"; 
  private static final Integer SALT_LENGTH = 12; 
  /** 
   * 將16進(jìn)制字符串轉(zhuǎn)換成字節(jié)數(shù)組 
   * @param hex 
   * @return 
   */ 
  public static byte[] hexStringToByte(String hex) { 
    int len = (hex.length() / 2); 
    byte[] result = new byte[len]; 
    char[] hexChars = hex.toCharArray(); 
    for (int i = 0; i < len; i++) { 
      int pos = i * 2; 
      result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4  
              | HEX_NUMS_STR.indexOf(hexChars[pos + 1])); 
    } 
    return result; 
  } 
  /** 
   * 將指定byte數(shù)組轉(zhuǎn)換成16進(jìn)制字符串 
   * @param b 
   * @return 
   */ 
  public static String byteToHexString(byte[] b) { 
    StringBuffer hexString = new StringBuffer(); 
    for (int i = 0; i < b.length; i++) { 
      String hex = Integer.toHexString(b[i] & 0xFF); 
      if (hex.length() == 1) { 
        hex = '0' + hex; 
      } 
      hexString.append(hex.toUpperCase()); 
    } 
    return hexString.toString(); 
  } 
  /** 
   * 驗(yàn)證口令是否合法 
   * @param password 
   * @param passwordInDb 
   * @return 
   * @throws NoSuchAlgorithmException 
   * @throws UnsupportedEncodingException 
   */ 
  public static boolean validPassword(String password, String passwordInDb) 
      throws NoSuchAlgorithmException, UnsupportedEncodingException { 
    //將16進(jìn)制字符串格式口令轉(zhuǎn)換成字節(jié)數(shù)組 
    byte[] pwdInDb = hexStringToByte(passwordInDb); 
    //聲明鹽變量 
    byte[] salt = new byte[SALT_LENGTH]; 
    //將鹽從數(shù)據(jù)庫(kù)中保存的口令字節(jié)數(shù)組中提取出來(lái) 
    System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH); 
    //創(chuàng)建消息摘要對(duì)象 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    //將鹽數(shù)據(jù)傳入消息摘要對(duì)象 
    md.update(salt); 
    //將口令的數(shù)據(jù)傳給消息摘要對(duì)象 
    md.update(password.getBytes("UTF-8")); 
    //生成輸入口令的消息摘要 
    byte[] digest = md.digest(); 
    //聲明一個(gè)保存數(shù)據(jù)庫(kù)中口令消息摘要的變量 
    byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH]; 
    //取得數(shù)據(jù)庫(kù)中口令的消息摘要 
    System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length); 
    //比較根據(jù)輸入口令生成的消息摘要和數(shù)據(jù)庫(kù)中消息摘要是否相同 
    if (Arrays.equals(digest, digestInDb)) { 
      //口令正確返回口令匹配消息 
      return true; 
    } else { 
      //口令不正確返回口令不匹配消息 
      return false; 
    } 
  } 
  /** 
   * 獲得加密后的16進(jìn)制形式口令 
   * @param password 
   * @return 
   * @throws NoSuchAlgorithmException 
   * @throws UnsupportedEncodingException 
   */ 
  public static String getEncryptedPwd(String password) 
      throws NoSuchAlgorithmException, UnsupportedEncodingException { 
    //聲明加密后的口令數(shù)組變量 
    byte[] pwd = null; 
    //隨機(jī)數(shù)生成器 
    SecureRandom random = new SecureRandom(); 
    //聲明鹽數(shù)組變量 
    byte[] salt = new byte[SALT_LENGTH]; 
    //將隨機(jī)數(shù)放入鹽變量中 
    random.nextBytes(salt); 
    //聲明消息摘要對(duì)象 
    MessageDigest md = null; 
    //創(chuàng)建消息摘要 
    md = MessageDigest.getInstance("MD5"); 
    //將鹽數(shù)據(jù)傳入消息摘要對(duì)象 
    md.update(salt); 
    //將口令的數(shù)據(jù)傳給消息摘要對(duì)象 
    md.update(password.getBytes("UTF-8")); 
    //獲得消息摘要的字節(jié)數(shù)組 
    byte[] digest = md.digest(); 
    //因?yàn)橐诳诹畹淖止?jié)數(shù)組中存放鹽,所以加上鹽的字節(jié)長(zhǎng)度 
    pwd = new byte[digest.length + SALT_LENGTH]; 
    //將鹽的字節(jié)拷貝到生成的加密口令字節(jié)數(shù)組的前12個(gè)字節(jié),以便在驗(yàn)證口令時(shí)取出鹽 
    System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH); 
    //將消息摘要拷貝到加密口令字節(jié)數(shù)組從第13個(gè)字節(jié)開(kāi)始的字節(jié) 
    System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length); 
    //將字節(jié)數(shù)組格式加密后的口令轉(zhuǎn)化為16進(jìn)制字符串格式的口令 
    return byteToHexString(pwd); 
  } 
} 

測(cè)試類——Client,代碼如下:

package com.zyg.security.md5; 
import java.io.UnsupportedEncodingException; 
import java.security.NoSuchAlgorithmException; 
import java.util.HashMap; 
import java.util.Map; 
public class Client { 
  private static Map users = new HashMap(); 
  public static void main(String[] args){ 
    String userName = "zyg"; 
    String password = "123"; 
    registerUser(userName,password); 
    userName = "changong"; 
    password = "456"; 
    registerUser(userName,password); 
    String loginUserId = "zyg"; 
    String pwd = "1232"; 
    try { 
      if(loginValid(loginUserId,pwd)){ 
        System.out.println("歡迎登陸?。。?); 
      }else{ 
        System.out.println("口令錯(cuò)誤,請(qǐng)重新輸入!?。?); 
      } 
    } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    }  
  } 
  /** 
   * 注冊(cè)用戶 
   * 
   * @param userName 
   * @param password 
   */ 
  public static void registerUser(String userName,String password){ 
    String encryptedPwd = null; 
    try { 
      encryptedPwd = MyMD5Util.getEncryptedPwd(password); 
      users.put(userName, encryptedPwd); 
    } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
  } 
  /** 
   * 驗(yàn)證登陸 
   * 
   * @param userName 
   * @param password 
   * @return 
   * @throws UnsupportedEncodingException 
   * @throws NoSuchAlgorithmException 
   */ 
  public static boolean loginValid(String userName,String password)  
        throws NoSuchAlgorithmException, UnsupportedEncodingException{ 
    String pwdInDb = (String)users.get(userName); 
    if(null!=pwdInDb){ // 該用戶存在 
        return MyMD5Util.validPassword(password, pwdInDb); 
    }else{ 
      System.out.println("不存在該用戶?。?!"); 
      return false; 
    } 
  } 
} 

相關(guān)文章

  • JDK15正式發(fā)布(新增功能預(yù)覽)

    JDK15正式發(fā)布(新增功能預(yù)覽)

    這篇文章主要介紹了JDK15正式發(fā)布,新增功能預(yù)覽,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • spring 整合mybatis后用不上session緩存的原因分析

    spring 整合mybatis后用不上session緩存的原因分析

    因?yàn)橐恢庇胹pring整合了mybatis,所以很少用到mybatis的session緩存。什么原因呢?下面小編給大家介紹spring 整合mybatis后用不上session緩存的原因分析,需要的朋友可以參考下
    2017-02-02
  • Java圖片批量壓縮像素的實(shí)現(xiàn)方法

    Java圖片批量壓縮像素的實(shí)現(xiàn)方法

    我們開(kāi)發(fā)中經(jīng)常會(huì)遇到原圖清晰度高,考慮到效率問(wèn)題,我們不可能拿原圖進(jìn)行顯示,服務(wù)端一般都要對(duì)圖片進(jìn)行壓縮處理,然后發(fā)送給客戶端顯示,這篇文章主要給大家介紹了關(guān)于Java圖片批量壓縮像素的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2021-12-12
  • Spring的事務(wù)控制實(shí)現(xiàn)方法

    Spring的事務(wù)控制實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了Spring的事務(wù)控制實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • SpringBoot瘦身打包部署的實(shí)現(xiàn)

    SpringBoot瘦身打包部署的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot瘦身打包部署的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • java單鏈表逆序用法代碼示例

    java單鏈表逆序用法代碼示例

    這篇文章主要介紹了java單鏈表逆序用法代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Spring為singleton?bean注入prototype?bean

    Spring為singleton?bean注入prototype?bean

    這篇文章主要介紹了Spring為singleton?bean注入prototype?bean,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Java MD5加密(實(shí)例講解)

    Java MD5加密(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇Java MD5加密(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • javaweb Servlet開(kāi)發(fā)總結(jié)(二)

    javaweb Servlet開(kāi)發(fā)總結(jié)(二)

    這篇文章主要為大家詳細(xì)介紹了javaweb Servlet開(kāi)發(fā)總結(jié)的第二篇,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Spring循環(huán)依賴的解決辦法,你真的懂了嗎

    Spring循環(huán)依賴的解決辦法,你真的懂了嗎

    循壞依賴即循環(huán)引用,兩個(gè)或多個(gè)bean相互引用,最終形成一個(gè)環(huán)。這篇文章主要介紹了Spring循環(huán)依賴的解決辦法,需要的朋友可以參考下
    2020-06-06

最新評(píng)論