MD5加盐加密

Posted wxw_wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MD5加盐加密相关的知识,希望对你有一定的参考价值。

package com.chauvet.utils;

import java.security.NoSuchAlgorithmException;
import java.util.Random;

/***
* MD5
* @author WXW
*
*/
public class MD5Util {
private final String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
private final String ikey = "-x6g6ZWm2G9g_vr0Bo.pOq3kRIxwangxiaowei";
private static String key = "myNameIsChauvet20160824";// 盐

/**
* 加密部分 加盐
* @param txt
* @param key
* @return
*/
public String encrypt(String txt,String key){
Random random = new Random();
int nh1 = Math.abs(random.nextInt(64));
int nh2 = Math.abs(random.nextInt(64));
int nh3 = Math.abs(random.nextInt(64));
char ch1 = chars.toCharArray()[nh1];
char ch2 = chars.toCharArray()[nh2];
char ch3 = chars.toCharArray()[nh3];
int nhnum = nh1 + nh2 + nh3;
int knum = 0;
for(int i=0;i<key.length();i++)
knum +=(int)key.toCharArray()[i];
String mdKey = null;
try {
mdKey = MD5.MD5Encode(MD5.MD5Encode(MD5.MD5Encode(key+ch1)+ch2+ikey)+ch3).substring((int)(nhnum%8),(int)(nhnum%8)+(int)(knum%8 + 16));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
txt = BaseUtil.Base64Encode(txt);
txt = txt.replace(‘+‘,‘-‘);txt = txt.replace(‘/‘,‘_‘);txt = txt.replace(‘=‘,‘.‘);
String tmp = "";
int j=0;int k = 0;
int tlen = txt.length();
int klen = mdKey.length();
for (int i=0; i<tlen; i++) {
k = k == klen ? 0 : k;
j = (nhnum+chars.indexOf(txt.toCharArray()[i])+((int)(mdKey.toCharArray()[k++])))%64;
tmp += chars.toCharArray()[j];
}
int tmplen = tmp.length();
StringBuffer br = new StringBuffer();
br.append(tmp);
br.insert(nh2 % ++tmplen, ch3);
tmp = br.toString();
StringBuffer br2 = new StringBuffer();
br2.append(tmp);
br2.insert(nh1 % ++tmplen, ch2);
tmp = br2.toString();
StringBuffer br3 = new StringBuffer();
br3.append(tmp);
br3.insert(knum % ++tmplen, ch1);
tmp = br3.toString();

return tmp;
}
/**
* 解密部分
* @param txt
* @param key
* @return
*/
public String decrypt(String txt,String key){
int knum = 0;
int tlen = txt.length();

for(int i=0;i<key.length();i++)
knum +=(int)key.toCharArray()[i];

char ch1 = txt.toCharArray()[knum % tlen];
int nh1 = chars.indexOf(ch1);

StringBuffer br = new StringBuffer();
br.append(txt);
int ttt1 = knum % tlen--;
txt = br.replace(ttt1, ttt1+1, "").toString();

char ch2 = txt.toCharArray()[nh1 % tlen];
int nh2 = chars.indexOf(ch2);
StringBuffer br2 = new StringBuffer();
br2.append(txt);
int ttt2 = nh1 % tlen--;
txt = br2.replace(ttt2, ttt2+1, "").toString();

char ch3 = txt.toCharArray()[nh2 % tlen];
int nh3 = chars.indexOf(ch3);
StringBuffer br3 = new StringBuffer();
br3.append(txt);
int ttt3 = nh2 % tlen--;
txt = br3.replace(ttt3, ttt3+1, "").toString();

int nhnum = nh1 + nh2 + nh3;

String mdKey = null;
try {
mdKey = MD5.MD5Encode(MD5.MD5Encode(MD5.MD5Encode(key+ch1)+ch2+ikey)+ch3).substring((int)(nhnum % 8),(int)(nhnum % 8)+(int)(knum % 8 + 16));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}

String tmp = "";
int j=0; int k = 0;
tlen = txt.length();
int klen = mdKey.length();
for (int i=0; i<tlen; i++) {
k = k == klen ? 0 : k;
j = chars.indexOf(txt.toCharArray()[i])-nhnum - ((int)(mdKey.toCharArray()[k++]));
while (j<0)
j+=64;
tmp += chars.toCharArray()[j];
}
tmp = tmp.replace(‘-‘,‘+‘);tmp = tmp.replace(‘_‘,‘/‘);tmp = tmp.replace(‘.‘,‘=‘);
tmp = BaseUtil.Base64Decode(tmp);
tmp = tmp.replace((char)0, ‘ ‘).replace(" ", "");
return tmp;
}

public static void main(String[] args) {
String a = new MD5Util().encrypt("[email protected]", key);
System.out.println(a);
String b = new MD5Util().decrypt("HvLV0ICDQNP_fUON5pDdqcp3d48", key);
System.out.println(b);
}

}

以上是关于MD5加盐加密的主要内容,如果未能解决你的问题,请参考以下文章

MD5加盐加密

md5 为啥 加盐

Shiro___加密加盐迭代

MD5加密加盐

MD5加密加盐

用户登录模块进行必要的安全处理(MD5加密加盐和传输过程加密)