一般密码不能直接保存明文,目前比较常用的密码加密方式是 MD5加密
MD5加密目前是不可逆的,但现在有很多对比破解md5的方法,所以我们可以在转成md5之前先处理一次。
处理的思路多种多样
方式一 可以在用户密码上加上我们自己的公钥。
比如用户密码是123
我们的公钥是abc
我们就把abc123 md5加密入库
即使用户破解了md5 得到的也只是abc123
在密码框输入abc123 还是会错误
方式二 在用户的密码上进行异或加密 或者相应转化 再md5加密
比如用户密码是123
我对它进行异或加密得到EFG
我们就把EFG进行 md5加密入库
即使用户破解了md5 得到的也只是EFG
在密码框输入EFG 还是会错误
所以说处理的方式多种多样
这里就给出 方式二的完整代码:
package service;
import java.security.MessageDigest;
/**
* 采用MD5加密解密
* @author zzq
* @datetime 2014-11-26
*/
public class MD5Util {
/***
* MD5加码 生成32位md5码
*/
public static String string2MD5(String inStr){
MessageDigest md5 = null;
try{
md5 = MessageDigest.getInstance("MD5");
}catch (Exception e){
System.out.println(e.toString());
e.printStackTrace();
return "";
}
char[] charArray = inStr.toCharArray();
byte[] byteArray = new byte[charArray.length];
for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++){
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
/**
* 加密解密算法 执行一次加密,两次解密
*/
public static String convert(String inStr){
char[] a = inStr.toCharArray();
for (int i = 0; i < a.length; i++){
a[i] = (char) (a[i] ^ 't');
}
String s = new String(a);
return s;
}
// 测试主函数
public static void main(String args[]) {
String s = new String("123");
System.out.println("原始:" + s);
System.out.println("MD5后:" + string2MD5(s));
System.out.println("异或加密的:" + convert(s));
System.out.println("解密异或的:" + convert(convert(s)));
//现用加密---先加密一次再MD5
String nows = new String("123");
System.out.println("原始:" + nows);
System.out.println("最终加密后:" + string2MD5(convert(nows)));
}
} |