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进行数据的加密与解密的更多相关文章

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

    <?php /* 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密 */ // 加密 $algorithm = MCRY ...

  2. Sql Server数据的加密与解密

    Sql Server数据的加密与解密 在sql server中,我们如何为数据进行加密与解密,避免使用者窃取机密数据? 对于一些敏感数据,如密码.卡号,一般不能使用正常数值来存储.否则会有安全隐患.以 ...

  3. AES对数据进行加密与解密

    AES对数据进行加密与解密随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即A ...

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

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

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

    2016-04-08 09:03 编辑: liubinqww 分类:iOS开发 来源:liubinqww 投稿 4 889     "APP的数据安全已经牵动着我们开发者的心,简单的MD5/ ...

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

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

  7. MySQL 使用MD5对数据进行加密

    数据库MD5加密 -- ================ 测试 MD5 加密 ============== CREATE TABLE `testmd5`( id INT(11) NOT NULL AU ...

  8. Java使用基本JDK操作ZIP文件以及zip文件的加密、解密等功能

    Java使用基本JDK操作ZIP文件 http://blog.csdn.net/zhyh1986/article/details/7723649 Java解压和压缩带密码的zip文件 http://b ...

  9. 总结C语言在嵌入式开发中应用的知识点(文件数据的加密与解密)

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

随机推荐

  1. cmder默认的命令提示符λ改成$

    新版的cmder(2016.11.3测试)单纯修改init.bat或以前的方法都试过了不行,下面是我自己找到的方法.亲测可行. cmder\vendor\clink.lua文件中第41行中{lamb} ...

  2. AXI总线简介

    AXI全称Advanced eXtensible Interface,是Xilinx从6系列的FPGA开始引入的一个接口协议,主要描述了主设备和从设备之间的数据传输方式.在ZYNQ中继续使用,版本是A ...

  3. Dshell----开源攻击分析框架

    前言 随着互联网的高速发展,网络安全问题变得至关重要,随着网络的不断规模化和复杂化,网络中拒绝服务(Denial of Service,DoS)攻击和分布式拒绝服务(Distributed Denia ...

  4. Windows gsl runtime error的解决方案

    经过两天多的奋战,终于把GLAD源码集成进来了. 在编译.链接都正确,程序开始跑之后,又出了一个让人很无奈的runtime error, 就在 /* Initialize minimizer */ T ...

  5. Hibernate【查询、连接池、逆向工程】

    前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式....到目前为止,我们都是使用一些简单的主键查询阿...使用HQL查询所有的数据....本博文主要讲解Hiberna ...

  6. 【转】Java中hashCode的作用

    以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode  ...

  7. linux命令类型及执行顺序

    一 为什么要使用命令行   当初级Linux用户面对缺乏图形界面的Linux时很多人都会抱怨:为何要死守命令行?为什么不采用人机互交好.更简单的图形界面呢?事实上,图形界面在某些任务方面确实高效而且简 ...

  8. Luogu P1860 新魔法药水

    题目大意 具体题面及输入格式戳我! 商店里有\(N\)种药水,每种药水都有一个售价和回收价. 小\(S\) 攒了\(V\)元钱,还会\(M\)种魔法,可以把一些药水合成另一种药水. 他在第一天可以购买 ...

  9. 【Luogu1471】方差(线段树)

    [Luogu1471]方差(线段树) 题面 这种傻逼题...自己去看把.. 题解 这题太傻比了 把方差公式拆开 维护平方和和区间和 修改就把平方和的公式拆开 简直傻逼的题目 #include<i ...

  10. Bzoj3992:[SDOI2015]序列统计

    题面 Bzoj Sol pts 1 大暴力很简单,\(f[i][j]\)表示到第\(i\)个位置,前面积的模为\(j\)的方案 然后可以获得\(10\)分的好成绩 # include <bits ...