package com.gnct.weboa.common.helper;
import java.security.MessageDigest;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* 密码加解密器,目前提供3DES算法加密和MD5加密算法,由于时间关系,暂时没有提供配置加密方式的功能.
*
* @author lwq
*
*/
public class CipherHelper {
/**
* 密钥的长度必须为24个字节
*/
private static final byte[] KEY_BYTES = "AB#$%^&J*KLdsaiek402;=/0"
.getBytes();
private static final String Algorithm = "DESede";
// keybyte为加密密钥,长度为24字节
// src为加密后的缓冲区
public static byte[] decryptBy3DES(byte[] src) {
try {
// 生成密钥
SecretKey deskey = new SecretKeySpec(KEY_BYTES, Algorithm);
// 解密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
/**
* 把加密的字符串解密成明文.
*
* @param str
* 必须是BASE64编码的字符串,否则不能正常解密
* @return 解密后的明文
*/
public static String decryptBy3DES(String str) {
try {
// 由于传入的密文是根据BASE64来编码的,所以这里要先解码
str = str.trim();
byte[] src = new BASE64Decoder().decodeBuffer(str);
// 解密密文,生成明码的String
return new String(decryptBy3DES(src));
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
// 定义 加密算法,可用 DES,DESede,Blowfish
// keybyte为加密密钥,长度为24字节
// src为被加密的数据缓冲区(源)
public static byte[] encryptBy3DES(byte[] src) {
try {
// 生成密钥
SecretKey deskey = new SecretKeySpec(KEY_BYTES, Algorithm);
// 加密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
/**
*
*
* @param str
* 源密码
* @return 加密并且使用Base64编码的数据
*/
public static String encryptBy3DES(String str) {
try {
byte[] src = str.getBytes();
// 把加密后的数据使用Base64编码,以解决转换成String后编码转换的问题.
return new BASE64Encoder().encode(encryptBy3DES(src));
} catch (Exception e3) {
e3.printStackTrace();
}
return null;
}
/**
* 采用MD5得法进行不可逆加密.用于密码保护.
*
* @param s
* 源字符串
* @return 加密后的密文
*/
public static String encryptByMD5(String s) {
//
byte hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F' };
try {
// 使用MD5加密
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
// 把传入的字符串转换成字节数组
byte[] strTemp = s.getBytes();
mdTemp.update(strTemp);//
byte[] md = mdTemp.digest();
int j = md.length;
byte str[] = new byte[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 (Exception e) {
return null;
}
}// ~~
public static void main(String[] args) {
String szSrc = "p";
System.out.println("加密前的字符串:" + szSrc);
System.out.println("加密后的字符串:" + encryptBy3DES(szSrc));
System.out.println("解密后的字符串:" + decrypt(encryptBy3DES(szSrc)));
}
/**
* 加密字符,以后可以在此扩展成使用可以配置的加密方式
*
* @param src
* 源字符
* @return 加密后的密文
*/
public static String encrypt(String src) {
return encryptBy3DES(src);
}
/**
* 把加密的字符串解密成明文.以后可以在此扩展成使用可以配置的加密方式.
*
* @param str
* 必须是BASE64编码的字符串,否则不能正常解密
* @return 解密后的明文
*/
public static String decrypt(String str) {
return decryptBy3DES(str);
}
}
密码工具类
最新推荐文章于 2024-09-30 14:17:59 发布