溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JAVA中MD5的轉(zhuǎn)換

發(fā)布時間:2020-06-02 07:29:10 來源:網(wǎng)絡(luò) 閱讀:389 作者:沙漏半杯 欄目:編程語言


import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.util.Arrays;

import java.util.Scanner;

?

public class MD5{? ?

? ? ? ?

? ? private static final String HEX_NUMS_STR="0123456789ABCDEF";? ?

? ? private static final Integer SALT_LENGTH = 12;? ?

? ? ? ?

? ? /**? ?

? ? ?* 將16進制字符串轉(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進制字符串?

? ? ?* @param b?

? ? ?* @return?

? ? ?*/?

? ? public static String byteToHexString(byte[] b) {? ?

? ? ? ? StringBuffer hexString = new StringBuffer();? ?

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

? ? ? ? //0XFF表示十進制的255,其中0X是java中用來申明16進制字符使用的,此時表示取當(dāng)前字節(jié)的反碼

? ? ? ? ? ? String hex = Integer.toHexString(b[i] & 0xFF);??

? ? ? ? ? ? if (hex.length() == 1) {? ?

? ? ? ? ? ? ? ? hex = '0' + hex;? ?

? ? ? ? ? ? }? ?

? ? ? ? ? ? hexString.append(hex.toUpperCase());? ?

? ? ? ? }? ?

? ? ? ? return hexString.toString();? ?

? ? }? ?

? ? /**?

? ? ?* 獲得加密后的16進制形式字符串

? ? ?* @param password?

? ? ?* @return?

? ? ?* @throws NoSuchAlgorithmException?

? ? ?* @throws UnsupportedEncodingException?

? ? ?*/?

? ? public static String getEncryptedPwd(String sourceString)? ?

? ? ? ? ? ? throws NoSuchAlgorithmException, UnsupportedEncodingException {? ?

? ? ? ? //聲明加密后的口令數(shù)組變量? ?

? ? ? ? byte[] pwd = null;? ?

? ? ? ? //隨機數(shù)生成器? ?

? ? ? ? SecureRandom random = new SecureRandom();? ?

? ? ? ? //聲明鹽數(shù)組變量? ?

? ? ? ? byte[] salt = new byte[SALT_LENGTH];? ?

? ? ? ? //將隨機數(shù)放入鹽變量中? ?

? ? ? ? random.nextBytes(salt);? ?

?

? ? ? ? //聲明消息摘要對象? ?

? ? ? ? MessageDigest md = null;? ?

? ? ? ? //創(chuàng)建消息摘要? ?

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

? ? ? ? //將鹽數(shù)據(jù)傳入消息摘要對象? ?

? ? ? ? md.update(salt);? ?

? ? ? ? //將口令的數(shù)據(jù)傳給消息摘要對象? ?

? ? ? ? md.update(sourceString.getBytes("UTF-8"));? ?

? ? ? ? //獲得消息摘要的字節(jié)數(shù)組? ?

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

?

? ? ? ? //因為要在口令的字節(jié)數(shù)組中存放鹽,所以加上鹽的字節(jié)長度? ?

? ? ? ? pwd = new byte[digest.length + SALT_LENGTH];? ?

? ? ? ? //將鹽的字節(jié)拷貝到生成的加密口令字節(jié)數(shù)組的前12個字節(jié),以便在驗證口令時取出鹽? ?

? ? ? ? System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);? ?

? ? ? ? //將消息摘要拷貝到加密口令字節(jié)數(shù)組從第13個字節(jié)開始的字節(jié)? ?

? ? ? ? System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);? ?

? ? ? ? //將字節(jié)數(shù)組格式加密后的口令轉(zhuǎn)化為16進制字符串格式的口令? ?

? ? ? ? return byteToHexString(pwd);? ?

? ? }?

? ??

? ? /**?

? ? ?* 驗證口令是否合法?

? ? ?* @param password?

? ? ?* @param passwordInDb?

? ? ?* @return?

? ? ?* @throws NoSuchAlgorithmException?

? ? ?* @throws UnsupportedEncodingException?

? ? ?*/?

? ? public static boolean validPassword(String sourceString, String md5String)? ?

? ? ? ? ? ? throws NoSuchAlgorithmException, UnsupportedEncodingException {? ?

? ? ? ? //將16進制字符串格式口令轉(zhuǎn)換成字節(jié)數(shù)組? ?

? ? ? ? byte[] pwdInDb = hexStringToByte(md5String);? ?

? ? ? ? //聲明鹽變量? ?

? ? ? ? byte[] salt = new byte[SALT_LENGTH];? ?

? ? ? ? //將鹽從數(shù)據(jù)庫中保存的口令字節(jié)數(shù)組中提取出來? ?

? ? ? ? System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);? ?

? ? ? ? //創(chuàng)建消息摘要對象? ?

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

? ? ? ? //將鹽數(shù)據(jù)傳入消息摘要對象? ?

? ? ? ? md.update(salt);? ?

? ? ? ? //將口令的數(shù)據(jù)傳給消息摘要對象? ?

? ? ? ? md.update(sourceString.getBytes("UTF-8"));? ?

? ? ? ? //生成輸入口令的消息摘要? ?

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

? ? ? ? //聲明一個保存數(shù)據(jù)庫中口令消息摘要的變量? ?

? ? ? ? byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];? ?

? ? ? ? //取得數(shù)據(jù)庫中口令的消息摘要? ?

? ? ? ? System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length);? ?

? ? ? ? //比較根據(jù)輸入口令生成的消息摘要和數(shù)據(jù)庫中消息摘要是否相同? ?

? ? ? ? if (Arrays.equals(digest, digestInDb)) {? ?

? ? ? ? ? ? //口令正確返回口令匹配消息? ?

? ? ? ? ? ? return true;? ?

? ? ? ? } else {? ?

? ? ? ? ? ? //口令不正確返回口令不匹配消息? ?

? ? ? ? ? ? return false;? ?

? ? ? ? }? ?

? ? }??

?

? ? public static void? main(String[] args){

? ? System.out.println("-----------------MD5加密 start--------------------");

? ? try {

? ? System.out.print("-----------------請輸入您要加密的內(nèi)容按enter鍵后執(zhí)行:");

? ? Scanner scanner = new Scanner(System.in);

? ? String sourceString = scanner.nextLine();

? ? String md5String = getEncryptedPwd(sourceString);

? ?

? ? System.out.println("----------加密前:"+sourceString);

? ? System.out.println("----------加密后:"+md5String);

? ? boolean falg = validPassword(sourceString,md5String);

? ? System.out.println("----------輸入字符串校驗結(jié)果:"+falg);

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("-----------------MD5加密 end--------------------");

? ? }

}



向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI