Java實現(xiàn)DES加密與解密,md5加密以及Java實現(xiàn)MD5加密解密類
更新時間:2015年11月12日 10:23:28 投稿:mrr
這篇文章主要介紹了Java實現(xiàn)DES加密與解密,md5加密以及Java實現(xiàn)MD5加密解密類 ,需要的朋友可以參考下
很多時候要對秘要進行持久化加密,此時的加密采用md5。采用對稱加密的時候就采用DES方法了
import java.io.IOException;
import java.security.MessageDigest;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import sun.misc.BASEDecoder;
import sun.misc.BASEEncoder;
/**
* 密匙工具類(包含des加密與md加密)
* @author mingge
*
*/
public class KeysUtil {
private final static String DES = "DES";
private final static String MD = "MD";
private final static String KEY="opeddsaeaddadbcabf";
/**
* MD加密算法
* @param data
* @return
*/
public static String mdEncrypt(String data) {
String resultString = null;
try {
resultString = new String(data);
MessageDigest md = MessageDigest.getInstance(MD);
resultString =bytehexString(md.digest(resultString.getBytes()));
} catch (Exception ex) {
}
return resultString;
}
private static String bytehexString(byte[] bytes) {
StringBuffer bf = new StringBuffer(bytes.length * );
for (int i = ; i < bytes.length; i++) {
if ((bytes[i] & xff) < x) {
bf.append("T");
}
bf.append(Long.toString(bytes[i] & xff, ));
}
return bf.toString();
}
/**
* Description 根據(jù)鍵值進行加密
* @param data
* @param key 加密鍵byte數(shù)組
* @return
* @throws Exception
*/
public static String desEncrypt(String data, String key) throws Exception {
if (key==null) {
key=KEY;
}
byte[] bt = encrypt(data.getBytes(), key.getBytes());
String strs = new BASEEncoder().encode(bt);
return strs;
}
/**
* Description 根據(jù)鍵值進行解密
* @param data
* @param key 加密鍵byte數(shù)組
* @return
* @throws IOException
* @throws Exception
*/
public static String desDecrypt(String data, String key) throws IOException,
Exception {
if (data == null){
return null;
}
if (key==null) {
key=KEY;
}
BASEDecoder decoder = new BASEDecoder();
byte[] buf = decoder.decodeBuffer(data);
byte[] bt = decrypt(buf,key.getBytes());
return new String(bt);
}
/**
* Description 根據(jù)鍵值進行加密
* @param data
* @param key 加密鍵byte數(shù)組
* @return
* @throws Exception
*/
private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
// 生成一個可信任的隨機數(shù)源
SecureRandom sr = new SecureRandom();
// 從原始密鑰數(shù)據(jù)創(chuàng)建DESKeySpec對象
DESKeySpec dks = new DESKeySpec(key);
// 創(chuàng)建一個密鑰工廠,然后用它把DESKeySpec轉(zhuǎn)換成SecretKey對象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher對象實際完成加密操作
Cipher cipher = Cipher.getInstance(DES);
// 用密鑰初始化Cipher對象
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
return cipher.doFinal(data);
}
/**
* Description 根據(jù)鍵值進行解密
* @param data
* @param key 加密鍵byte數(shù)組
* @return
* @throws Exception
*/
private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
// 生成一個可信任的隨機數(shù)源
SecureRandom sr = new SecureRandom();
// 從原始密鑰數(shù)據(jù)創(chuàng)建DESKeySpec對象
DESKeySpec dks = new DESKeySpec(key);
// 創(chuàng)建一個密鑰工廠,然后用它把DESKeySpec轉(zhuǎn)換成SecretKey對象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher對象實際完成解密操作
Cipher cipher = Cipher.getInstance(DES);
// 用密鑰初始化Cipher對象
cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
return cipher.doFinal(data);
}
}
下面在給大家介紹一段代碼關(guān)于Java實現(xiàn)MD5加密解密類
Java實現(xiàn)MD5加密以及解密類,附帶測試類,具體見代碼。
MD5加密解密類——MyMD5Util,代碼如下:
package com.zyg.security.md5;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;
public class MyMD5Util {
private static final String HEX_NUMS_STR="0123456789ABCDEF";
private static final Integer SALT_LENGTH = 12;
/**
* 將16進制字符串轉(zhuǎn)換成字節(jié)數(shù)組
* @param hex
* @return
*/
public static byte[] hexStringToByte(String hex) {
int len = (hex.length() / 2);
byte[] result = new byte[len];
char[] hexChars = hex.toCharArray();
for (int i = 0; i < len; i++) {
int pos = i * 2;
result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4
| HEX_NUMS_STR.indexOf(hexChars[pos + 1]));
}
return result;
}
/**
* 將指定byte數(shù)組轉(zhuǎn)換成16進制字符串
* @param b
* @return
*/
public static String byteToHexString(byte[] b) {
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
hexString.append(hex.toUpperCase());
}
return hexString.toString();
}
/**
* 驗證口令是否合法
* @param password
* @param passwordInDb
* @return
* @throws NoSuchAlgorithmException
* @throws UnsupportedEncodingException
*/
public static boolean validPassword(String password, String passwordInDb)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
//將16進制字符串格式口令轉(zhuǎn)換成字節(jié)數(shù)組
byte[] pwdInDb = hexStringToByte(passwordInDb);
//聲明鹽變量
byte[] salt = new byte[SALT_LENGTH];
//將鹽從數(shù)據(jù)庫中保存的口令字節(jié)數(shù)組中提取出來
System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);
//創(chuàng)建消息摘要對象
MessageDigest md = MessageDigest.getInstance("MD5");
//將鹽數(shù)據(jù)傳入消息摘要對象
md.update(salt);
//將口令的數(shù)據(jù)傳給消息摘要對象
md.update(password.getBytes("UTF-8"));
//生成輸入口令的消息摘要
byte[] digest = md.digest();
//聲明一個保存數(shù)據(jù)庫中口令消息摘要的變量
byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];
//取得數(shù)據(jù)庫中口令的消息摘要
System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length);
//比較根據(jù)輸入口令生成的消息摘要和數(shù)據(jù)庫中消息摘要是否相同
if (Arrays.equals(digest, digestInDb)) {
//口令正確返回口令匹配消息
return true;
} else {
//口令不正確返回口令不匹配消息
return false;
}
}
/**
* 獲得加密后的16進制形式口令
* @param password
* @return
* @throws NoSuchAlgorithmException
* @throws UnsupportedEncodingException
*/
public static String getEncryptedPwd(String password)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
//聲明加密后的口令數(shù)組變量
byte[] pwd = null;
//隨機數(shù)生成器
SecureRandom random = new SecureRandom();
//聲明鹽數(shù)組變量
byte[] salt = new byte[SALT_LENGTH];
//將隨機數(shù)放入鹽變量中
random.nextBytes(salt);
//聲明消息摘要對象
MessageDigest md = null;
//創(chuàng)建消息摘要
md = MessageDigest.getInstance("MD5");
//將鹽數(shù)據(jù)傳入消息摘要對象
md.update(salt);
//將口令的數(shù)據(jù)傳給消息摘要對象
md.update(password.getBytes("UTF-8"));
//獲得消息摘要的字節(jié)數(shù)組
byte[] digest = md.digest();
//因為要在口令的字節(jié)數(shù)組中存放鹽,所以加上鹽的字節(jié)長度
pwd = new byte[digest.length + SALT_LENGTH];
//將鹽的字節(jié)拷貝到生成的加密口令字節(jié)數(shù)組的前12個字節(jié),以便在驗證口令時取出鹽
System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);
//將消息摘要拷貝到加密口令字節(jié)數(shù)組從第13個字節(jié)開始的字節(jié)
System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);
//將字節(jié)數(shù)組格式加密后的口令轉(zhuǎn)化為16進制字符串格式的口令
return byteToHexString(pwd);
}
}
測試類——Client,代碼如下:
package com.zyg.security.md5;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
public class Client {
private static Map users = new HashMap();
public static void main(String[] args){
String userName = "zyg";
String password = "123";
registerUser(userName,password);
userName = "changong";
password = "456";
registerUser(userName,password);
String loginUserId = "zyg";
String pwd = "1232";
try {
if(loginValid(loginUserId,pwd)){
System.out.println("歡迎登陸!?。?);
}else{
System.out.println("口令錯誤,請重新輸入?。?!");
}
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 注冊用戶
*
* @param userName
* @param password
*/
public static void registerUser(String userName,String password){
String encryptedPwd = null;
try {
encryptedPwd = MyMD5Util.getEncryptedPwd(password);
users.put(userName, encryptedPwd);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 驗證登陸
*
* @param userName
* @param password
* @return
* @throws UnsupportedEncodingException
* @throws NoSuchAlgorithmException
*/
public static boolean loginValid(String userName,String password)
throws NoSuchAlgorithmException, UnsupportedEncodingException{
String pwdInDb = (String)users.get(userName);
if(null!=pwdInDb){ // 該用戶存在
return MyMD5Util.validPassword(password, pwdInDb);
}else{
System.out.println("不存在該用戶!!!");
return false;
}
}
}
相關(guān)文章
spring 整合mybatis后用不上session緩存的原因分析
因為一直用spring整合了mybatis,所以很少用到mybatis的session緩存。什么原因呢?下面小編給大家介紹spring 整合mybatis后用不上session緩存的原因分析,需要的朋友可以參考下2017-02-02
Spring為singleton?bean注入prototype?bean
這篇文章主要介紹了Spring為singleton?bean注入prototype?bean,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07
javaweb Servlet開發(fā)總結(jié)(二)
這篇文章主要為大家詳細(xì)介紹了javaweb Servlet開發(fā)總結(jié)的第二篇,感興趣的小伙伴們可以參考一下2016-05-05

