MD5加密方式(三) -- 加鹽值


所謂鹽值:就是在加密前先給要加密的對象加一點額外的東西,那么即使數據庫的數據泄露,數據庫支持反查詢,那么查詢到的也只是加鹽后的字符串,而沒有拿到要加密的對象

package com.lzj.www.md5.test;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5_2 {

	private static final String[] GOAL = { "0", "1", "2", "3", "4", "5",
		"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
	
	private String algorithm;	//加密方式
	private String salt;	//鹽值
	
	public MD5_2(){
		
	}
	
	public MD5_2(String algorithm, String salt) {
		this.algorithm = algorithm;
		this.salt = salt;
	}
	
	public String getMD5(String object){
		String result = null;
		try {
			MessageDigest digest = MessageDigest.getInstance(algorithm);
			//digest在底層也調用了update方法
			result = byteArrayToString(digest.digest(addSalt(object).getBytes()));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return result.toUpperCase();
	}
	
	/**
	 * 在加密對象后加鹽
	 * @param object
	 * @return
	 */
	private String addSalt(String object){
		if(object == null){
			object = "";
		}
		if(salt == null || "".equals(salt)){
			return object;
		} else {
			return object + "{"+ salt.toString() +"}";
		}
	}
	
	private String byteArrayToString(byte[] ss){
		StringBuffer result = new StringBuffer();
		for(int i = 0; i < ss.length; i++){
			result.append(byteToString(ss[i]));
		}
		return result.toString();
	}
	
	private String byteToString(byte ss){
		int temp;
		temp = ss < 0 ? ss + 256 : ss;
		return GOAL[temp / 16] + GOAL[temp % 16];		//自己實現轉化
		/*
 			用現有的方法實現轉化
			StringBuffer s = new StringBuffer();
			if(temp < 16)s.append("0");
			s.append(Integer.toHexString(temp));
			return s.toString();	
		 */
		
	}
	
	public static void main(String[] args) {
		MD5_2 md = new MD5_2("MD5", "hello");
		System.out.println(md.getMD5("hello"));
	}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM