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"));

	}
}

  

时间: 2024-08-11 16:24:42

jdk自带的MD5进行数据的加密与解密的相关文章

数据的加密和解密初识

数据的加密和解密 加密是让数据从明文变成密文,传输过程中是密文,传送过去之后对方接收到的也是密文. 可以理解为密文就是乱码,看不出内在的任何意义,通常也都是逐位对应的. 在接收方接收到密文之后只有把它还原为原来的样子才可以理解对方说的具体是什么,此过程就叫做解密. 1.不同主机之间的进程间通信:Socket-pair,套接字对 套接字Socket的三种类型: 流套接字(Socket_Stream):基于TCP协议通信的套接字 数据报套接字(Socket_Dgram):基于UDP协议通信的套接字

C#数据Encrypt加密Encrypt解密的算法使用--非对称算法RSACryptoServiceProvider

C#数据加密解密的非对称算法使用---RSACryptoServiceProvider   Asymmetric algorithms--Encrypt Encrypt C#数据Encrypt加密Encrypt解密的相关算法可以参考System.Security.Cryptography,这个类库中包含MD5,SHA1,SHA256,SHA384,SHA512 MD5 and SHA256 are two of the HashAlgorithm subtypes provided by the

数据之加密与解密

写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正.如有不明白的地方,愿可一起探讨. 下面将利用Bober与Alex的通信来解释说明数据的加密和解密过程 Bober与Alex进行通信的简单过程 说明: 图中的1,2过程为Bober和Alex获取对方的签署证书: Bober获得Alex的签署证书后,验证其证书的合法性和正确性: Bober利用单向加密.对称加密以及公钥加密对自己的数据进行加密: 图中的过程3表示Bober将加密后的数据发送给Alex: Alex接收到Bober的加密

PHP 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密

<?php /* 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密 */ // 加密 $algorithm = MCRYPT_BLOWFISH; // 加密算法 $key = 'mycryptkey'; // 加密密钥 $data = '12345'; // 要加密或解密的数据 $mode = MCRYPT_MODE_CBC; // 加密或解密的模式 // 初始向量 $iv = mcrypt_create_iv(mcryp

C#:使用MD5对用户密码加密与解密

C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1)16位的MD5加密 /// <summary> /// 16位MD5加密 /// </summary> /// <param name="password"></param> /// <returns></returns&

数据的加密和解密

当前网络环境中,数据的来往是十分密切,面对着海量的信息集合,很少有人去考虑如何去保证,或者说数据是怎么被保证安全的到达目的地的,在默认情况下,数据的发送是明文发送的,也就是说,数据的发送可以被除发送方和接收方的第三方所截获,读取信息,或者通过长年累月的数据量分析得出发送方的某些重要信息,这对于用户来说都是不可接受的,所以随着网络数据的不断发展,人们不断对数据加密进行更新换代,由一开始的传统加密,通过替换的方式加密信息,到后来的块加密算法: 现在的加密算法,如对称加密,公钥加密,作为一段时期的主要

iOS开发之 AES+Base64数据混合加密与解密

2016-04-08 09:03 编辑: liubinqww 分类:iOS开发 来源:liubinqww 投稿 4 889 "APP的数据安全已经牵动着我们开发者的心,简单的MD5/Base64等已经难以满足当下的数据安全标准,本文简单的介绍下AES与Base64的混合加密与解密" AES:高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES

转 C#:使用MD5对用户密码加密与解密

C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1)16位的MD5加密 /// <summary> /// 16位MD5加密 /// </summary> /// <param name="password"></param> /// <returns></returns&

系统安全之数据的加密和解密、CA的介绍、SSL或TLS协议简介及握手过程

网络通信需要安全                所谓的网络通信就是进程与进程之间的通信                        然而进程的通信一般可以分成两类:1.同一主机之间的进程通信                                                                              2.不同主机之间的进程通信