加密步驟:
- 編寫extractSalt()方法,該方法可生成返回一個隨機鹽值.
- 編寫生成MD5摘要方法:getMd5Hex(String
str),參數爲String,返回32位hex字符串.該方法需導入jar包:commons-codec-1.10.jar.
- 編寫密碼生成方法:generateKeywordText(String pwd,String
salt),在generateKeywordText()方法中,得到getMd5Hex(salt+pwd)返回之字符串hexs,新建48位char數組cs,經過for循環,分別截取hexs和salt自定義規律位置之單字符,而後一一賦予cs,將cs轉爲字符串os,os即爲最終密碼原文.
解密步驟
- 編寫方法verify(String pass,String origin);
- verify()方法內,分別新建digestChar字符數組[32]和saltChar字符數組[16],使用for循環,按照以前自定義的位置規律,從origin逆向截取單個字符,賦予digestChar[]和saltChar[],將saltChar[]轉爲字符串salt.
- 最後利用getMd5Hex(salt+pass)返還的hexString,與new String(digestChar)相比較便可.
Java代碼
/**
* 提取鹽
*
* @return
*/
public String extractSalt() {
Random random = new Random();
StringBuilder builder = new StringBuilder(16);
builder.append(random.nextInt(99999999));
int length = builder.length();
if (length < 16) {
for (int i = 0; i < 16 - length; i++) {
int n = random.nextInt(9);
builder.append(n + "");
}
}
return builder.toString();
}
/**
* 獲取十六進制字符串形式的MD5摘要(digest)
*
* @param src
* @return
*/
private String getMd5Hex(String src) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] bs = md5.digest(src.getBytes());
byte[] encode = new Hex().encode(bs);
return new String(encode);
}
/**
* 代入頁面提交的原始密碼,生成並返回密文
*
* @param pwd 原始素材
* @param salt
* @return
*/
public String generateKeywordText(String pwd, String salt) {
// 撒鹽,並在MD5hex方法內均勻攪拌
String hex = getMd5Hex(salt + pwd);
char[] cs = new char[48];
// 再加密
for (int i = 0; i < 48; i += 3) {
cs[i] = hex.charAt(i / 3 * 2);
cs[i + 1] = salt.charAt(i / 3);
cs[i + 2] = hex.charAt(i / 3 * 2 + 1);
}
return new String(cs);
}
/**
* 校驗加鹽後是否和原文一致,逆向解密
*
* @param password
* 提交之密碼
* @param text
* 原文
* @return
*/
public boolean verify(String password, String text) {
char[] digestStr = new char[32];
char[] saltStr = new char[16];
for (int i = 0; i < 48; i += 3) {
digestStr[i / 3 * 2] = text.charAt(i);
digestStr[i / 3 * 2 + 1] = text.charAt(i + 2);
saltStr[i / 3] = text.charAt(i + 1);
}
String salt = new String(saltStr);
boolean b = getMd5Hex(salt + password).equals(new String(digestStr));
return b;
}