.
.
.
.
.
花了一个多小时的时间整理了原来一直使用的 MD5 加密类,这次新添加了 Salt 二次 MD5 加密模块。
核心的方法 cell32() 是很久以前在网上找来的,因为不记得原作者和出处了,所以没有贴出来版权,如果您是该方法的作者,请联系我,我将会及时附上版权。
由于本人水平有限,如果各位有更好的算法还请多多指教。
以下是完整代码:
1 package cn.lastcc.publicTools; 2 3 import java.security.MessageDigest; 4 import java.security.NoSuchAlgorithmException; 5 6 /** 7 * Salt MD5 加强模块 8 * 提供 16 位与 32 位 MD5 加密与其 Salt 加密功能9 * 10 * Salt 加密方法调用:
11 * MD5 md5 = new MD5(); 12 * String [] _tmp = md5.salt32("明文"); 13 System.out.println(_tmp[0] + "\t" + _tmp[1]); 14 * 15 * @author Programer.Monkey 16 * Email: Programer.Monkey@gmail.com 17 * 18 * @version 11.12.30.1 19 * 20 */ 21 public class MD5 { 22 23 /** 24 * 随机密钥长度 25 */ 26 private static final int _KEYTLENGTH = 6; 27 28 public MD5() { 29 } 30 31 /** 32 * 生成随机密钥 33 * 34 * @param length 35 * 密钥长度 36 */ 37 private String getRandomKeyt(int length) throws Exception { 38 if (length < 1) 39 throw new Exception("密钥长度不能小于 1"); 40 String _keyt = ""; 41 for (int i = 0; i < length; i++) { 42 _keyt += (char) (33 + (int) (Math.random() * (126 - 33 + 1))); 43 } 44 return _keyt; 45 } 46 47 /** 48 * 32位标准 MD5 加密 49 * 50 * @param plainText 51 * 明文 52 * @return 密文 53 * 返回 Null 值则出现异常 54 */ 55 public String cell32(String plainText) { 56 try { 57 MessageDigest md = MessageDigest.getInstance("MD5"); 58 md.update(plainText.getBytes()); 59 byte b[] = md.digest(); 60 int i; 61 StringBuffer buf = new StringBuffer(""); 62 for (int offset = 0; offset < b.length; offset++) { 63 i = b[offset]; 64 if (i < 0) 65 i += 256; 66 if (i < 16) 67 buf.append("0"); 68 buf.append(Integer.toHexString(i)); 69 } 70 return buf.toString();// 32位的加密 71 72 } catch (NoSuchAlgorithmException e) { 73 e.printStackTrace(); 74 } 75 return null; 76 } 77 78 /** 79 * 32 位 salt 加密 80 * 81 * @param plainText 82 * 明文 83 * @return 索引 0 是密文,索引 1 是二次密钥 84 */ 85 public String[] salt32(String plainText) throws Exception { 86 return salt("cell32", plainText); 87 } 88 89 /** 90 * 16 位标准 MD5 加密 91 * 92 * @param plainText 93 * 明文 94 * @return 密文 95 * 返回 Null 值则出现异常 96 */ 97 public String cell16(String plainText) { 98 String result = cell32(plainText); 99 if (result == null) 100 return null; 101 return result.toString().substring(8, 24);// 16位的加密 102 } 103 104 /** 105 * 16 位 salt 加密 106 * 107 * @param plainText 108 * 明文 109 * @return 索引 0 是密文,索引 1 是二次密钥 110 */ 111 public String[] salt16(String plainText) throws Exception { 112 return salt("cell16", plainText); 113 } 114 115 /** 116 * 根据调用的方法名称执行不同的方法 117 * 118 * @param saltFunctionName 119 * 加密的方法名称 120 */ 121 private String[] salt(String saltFunctionName, String plainText) 122 throws Exception { 123 String _keyt = getRandomKeyt(_KEYTLENGTH); 124 return new String[] {(String) this.getClass().getMethod(saltFunctionName, Class.forName("java.lang.String")).invoke(this, (cell32(plainText) + _keyt)), _keyt }; 125 } 126 }
以下是调用 Salt 算法的方法:
1 String [] tmp = ((MD5)Class.forName("cn.lastcc.publicTools.MD5").newInstance()).salt32("abcdef");