加密步骤:
- 编写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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。