jdk自带的MD5进行数据的加密与解密

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdk自带的MD5进行数据的加密与解密相关的知识,希望对你有一定的参考价值。

package com.tools.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.Mac;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * ClassName:MD5Util <br/>
 * Function: 使用jdk自带的MD5进行数据的加密与解密 <br/>
 * Reason: 主要用来生成用户密码存入数据库中 <br/>
 * 
 * @version 1.0
 * @since JDK 1.7
 * @see
 */
public class EncryptUtil {
	private static final Log logger = LogFactory.getLog(EncryptUtil.class);
	
	private static final String SHA = "SHA";
	private static final String SHA1 = "SHA1";
	private static final String MD5 = "MD5";
	private static final String HMAC_SHA1 = "HmacSHA1";
	
	public static String Encrypt(String algorithm, String source) {
		MessageDigest md5 = null;
		try {
			md5 = MessageDigest.getInstance(algorithm);
		} catch (Exception e) {
			logger.debug(e.getMessage());
			return "";
		}
		char[] charArray = source.toCharArray();
		byte[] byteArray = new byte[charArray.length];

		for (int i = 0; i < charArray.length; i++)
			byteArray[i] = (byte) charArray[i];

		byte[] md5Bytes = md5.digest(byteArray);

		StringBuffer hexValue = new StringBuffer();

		for (int i = 0; i < md5Bytes.length; i++) {
			int val = ((int) md5Bytes[i]) & 0xff;
			if (val < 16)
				hexValue.append("0");
			hexValue.append(Integer.toHexString(val));
		}

		return hexValue.toString();
	}

	/**
	 * SHA加密 并转换为16进制大写字符串
	 * @param source
	 * @return
	 */
	public static String encryptSHA(String source)
	{
		try {
			MessageDigest sha = MessageDigest.getInstance(SHA);  
			sha.update(source.getBytes());
			byte[] bytes = sha.digest();
			
			StringBuilder stringBuilder = new StringBuilder("");  
	        if (bytes == null || bytes.length <= 0) {  
	            return null;  
	        }  
	        for (int i = 0; i < bytes.length; i++) {  
	            int v = bytes[i] & 0xFF;  
	            String hv = Integer.toHexString(v);  
	            if (hv.length() < 2) {  
	                stringBuilder.append(0);  
	            }  
	            stringBuilder.append(hv);  
	        }  
	        return stringBuilder.toString().toUpperCase();  
	        
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}  
        
        return "";
	}
	
	/**
	 * SHA加密 并转换为16进制大写字符串
	 * @param source
	 * @return
	 */
	public static String encryptSHA1(String source)
	{
		try {
			MessageDigest sha = MessageDigest.getInstance(SHA1);  
			sha.update(source.getBytes());
			byte[] bytes = sha.digest();
			
			StringBuilder stringBuilder = new StringBuilder("");  
	        if (bytes == null || bytes.length <= 0) {  
	            return null;  
	        }  
	        for (int i = 0; i < bytes.length; i++) {  
	            int v = bytes[i] & 0xFF;  
	            String hv = Integer.toHexString(v);  
	            if (hv.length() < 2) {  
	                stringBuilder.append(0);  
	            }  
	            stringBuilder.append(hv);  
	        }  
	        return stringBuilder.toString().toUpperCase();  
	        
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}  
        
        return "";
	}
	
	/**         
     * BASE64加密   
     * @param key          
     * @return          
     * @throws Exception          
     */              
    public static String encryptBASE64(byte[] key) {               
        return filter((new BASE64Encoder()).encodeBuffer(key));               
    }  
    
    /**    
     * BASE64解密   
     * @param key          
     * @return          
     * @throws IOException       
     */              
    public static byte[] decryptBASE64(String key) throws IOException {               
        return (new BASE64Decoder()).decodeBuffer(key);               
    }  
    
    /**
     * 删除BASE64加密时出现的换行符
     * <功能详细描述>
     * @param str
     * @return
     * @see [类、类#方法、类#成员]
     */
    private static String filter(String str) {
        String output = null;
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length(); i++) {
            int asc = str.charAt(i);
            if (asc != 10 && asc != 13) {
                sb.append(str.subSequence(i, i + 1));
            }
        }
        output = new String(sb);
        return output;
    }
	
    /**
	 * MD5 加密
	 */
	public static String getMD5Str(String str) {
		MessageDigest messageDigest = null;

		try {
			messageDigest = MessageDigest.getInstance(MD5);

			messageDigest.reset();

			messageDigest.update(str.getBytes("UTF-8"));

		} catch (NoSuchAlgorithmException e) {
			System.out.println("NoSuchAlgorithmException caught!");
			System.exit(-1);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		byte[] byteArray = messageDigest.digest();

		StringBuffer md5StrBuff = new StringBuffer();

		for (int i = 0; i < byteArray.length; i++) {
			if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
				md5StrBuff.append("0").append(
						Integer.toHexString(0xFF & byteArray[i]));
			else
				md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
		}

		return md5StrBuff.toString();
	}
    
	/**
	 * 加密
	 * @param encData 要加密的数据
	 * @param secretKey 密钥 ,16位的数字和字母
	 * @param vector 初始化向量,16位的数字和字母
	 * @return
	 * @throws Exception
	 */
	public static String Encrypt(String encData ,String secretKey,String vector) throws Exception {
		
		if(secretKey == null) {
			return null;
		}
		if(secretKey.length() != 16) {
			return null;
		}
		byte[] raw = secretKey.getBytes();
		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "算法/模式/补码方式"
		IvParameterSpec iv = new IvParameterSpec(vector.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
		cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
		byte[] encrypted = cipher.doFinal(encData.getBytes());
		return ObjectSerializer.encodeBytes( encrypted );
	}
	
	/**   
     * 生成签名数据    
     * @param data 待加密的数据   
     * @param key  加密使用的key   
     * @throws InvalidKeyException   
     * @throws NoSuchAlgorithmException   
     */    
    public static  byte[] getSignature(String data,String key) throws NoSuchAlgorithmException, InvalidKeyException {
        byte[] keyBytes=key.getBytes();  
        SecretKeySpec signingKey = new SecretKeySpec(keyBytes, HMAC_SHA1);     
        Mac mac = Mac.getInstance(HMAC_SHA1);     
        mac.init(signingKey);
        //byte[] rawHmac = mac.doFinal(("GET&"+data).getBytes());  
        byte[] rawHmac = mac.doFinal((data).getBytes());  
/*        StringBuilder sb=new StringBuilder();  
        for(byte b:rawHmac){  
         sb.append(byteToHexString(b));  
        }  */
        return rawHmac;     
    }  
    
    private static String byteToHexString(byte ib){  
        char[] Digit={‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘};  
        char[] ob=new char[2];  
        ob[0]=Digit[(ib>>>4)& 0X0f];  
        ob[1]=Digit[ib & 0X0F];  
        String s=new String(ob);  
        return s;           
    } 
	
    /**
     * 创富md5加密方法
     */
    public static String encode(String encodestr)
    {
      try
      {
        char[] hexDigits = { ‘9‘, ‘0‘, ‘1‘, ‘4‘, ‘g‘, ‘2‘, ‘a‘, ‘5‘, ‘p‘, ‘6‘, ‘l‘, ‘u‘, ‘7‘, ‘8‘, ‘3‘, ‘e‘ };
        byte[] strTemp = encodestr.getBytes();
        MessageDigest mdTemp = MessageDigest.getInstance("MD5");
        mdTemp.update(strTemp);
        byte[] md = mdTemp.digest();
        int j = md.length;
        char[] str = new char[j * 2];
        int k = 0;
        for (int i = 0; i < j; i++) {
          byte byte0 = md[i];
          str[(k++)] = hexDigits[(byte0 >>> 4 & 0xF)];
          str[(k++)] = hexDigits[(byte0 & 0xF)];
        }
        return new String(str);
      }
      catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
      }
      return null;
    }
    
	public static void main(String[] args) throws UnsupportedEncodingException
	{
		System.out.println(encode("yituke" + "abc"));
		System.out.println(getMD5Str("yituke" + "abc"));
		
	}
}

  

以上是关于jdk自带的MD5进行数据的加密与解密的主要内容,如果未能解决你的问题,请参考以下文章

jmeter如何使用使用MD5加密?

java的加密解密

php 自带加密解密函数

Java实现MD5加密及解密的代码实例分享

介绍几个PHP 自带的加密解密函数

md5解密问题