共计 1851 个字符,预计需要花费 5 分钟才能阅读完成。
加密步骤:
- 编写 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;
}
正文完
发表至: java
2019-11-03