package com.wechat.common.utils;

import java.security.MessageDigest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.wechat.common.Constants;
import com.wechat.global.CustomException;
import com.wechat.global.message.InfoMsg;

/**
 * 加密工具类
 * 
 * @author jil
 *
 */
public class Md5Utils {
	protected static Logger logger = LoggerFactory.getLogger(Md5Utils.class);
	
	/**
	 * 生成md5  密码m+固定字符串 加密
	 * @param message
	 * @return
	 */
	public static String EncoderByMd5(String str,String key) {
		StringBuffer buffer = new StringBuffer();
		buffer.append(str);
		// 混淆用的加密key
		if(!StringsUtils.isEmpty(key))
		{
			buffer.append(key);
		}
		
		String md5str = "";
		try {
			// 1 创建一个提供信息摘要算法的对象，初始化为md5算法对象
			MessageDigest md = MessageDigest.getInstance("MD5");

			// 2 将消息变成byte数组
			byte[] input = buffer.toString().getBytes();

			// 3 计算后获得字节数组,这就是那128位了
			byte[] buff = md.digest(input);

			// 4 把数组每一字节（一个字节占八位）换成16进制连成md5字符串
			md5str = bytesToHex(buff);

		} catch (Exception e) {
			logger.error("md5加密错误",e.getMessage());
			throw new CustomException(InfoMsg.ERROR_MD5ENCRYPT_ERROR);
		}
		return md5str;
	}
	
	/**
	 * 生成md5  密码m+固定字符串 加密
	 * @param message
	 * @return
	 */
	public static String EncoderPassword(String password) {
		return EncoderByMd5(password,Constants.MD5_PASSWORD);
	}

	/**
	 * 二进制转十六进制
	 * 
	 * @param bytes
	 * @return
	 */
	public static String bytesToHex(byte[] bytes) {
		StringBuffer md5str = new StringBuffer();
		// 把数组每一字节换成16进制连成md5字符串
		int digital;
		for (int i = 0; i < bytes.length; i++) {
			digital = bytes[i];

			if (digital < 0) {
				digital += 256;
			}
			if (digital < 16) {
				md5str.append("0");
			}
			md5str.append(Integer.toHexString(digital));
		}
		return md5str.toString().toUpperCase();
	}
}
