我想在Java中加密和解密密码,并以加密形式存储到数据库中。如果这是开源的,那就太好了。有任何建议/指针吗?
我想在Java中加密和解密密码,并以加密形式存储到数据库中。如果这是开源的,那就太好了。有任何建议/指针吗?
这是我使用的MD5加密算法,它会返回加密后的结果。
public class CryptWithMD5 {
private static MessageDigest md;
public static String cryptWithMD5(String pass){
try {
md = MessageDigest.getInstance("MD5");
byte[] passBytes = pass.getBytes();
md.reset();
byte[] digested = md.digest(passBytes);
StringBuffer sb = new StringBuffer();
for(int i=0;i<digested.length;i++){
sb.append(Integer.toHexString(0xff & digested[i]));
}
return sb.toString();
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(CryptWithMD5.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}
你无法解密MD5,但可以比较其输出,因为如果你将相同的字符串放入此方法中,它将具有相同的加密输出。如果你想解密,需要使用SHA。你永远不会对用户密码使用解密。始终使用MD5。该例外情况实际上是多余的,它永远不会被抛出。
0xff & digested[i]
的作用吗? :) - theapache64编辑:此答案较旧。现在不鼓励使用MD5,因为可以轻易地被破解。
我想对您来说,MD5应该足够好了吧?您可以使用MessageDigest来实现。
MessageDigest.getInstance("MD5");
这里还列出了其他算法,点击此处查看。
如果您真的想要,以下是其第三方版本:Fast MD5
Jasypt 可以轻松简单地完成这项任务。
String encoded = (new BASE64Encoder()).encode("text to be encoded".getBytes("UTF-8")); byte decodedRaw[] = (new BASE64Decoder()).decodeBuffer(encoded); String decoded = new String(decodedRaw, "UTF8");
如果您想采用另一种方法,可以参考这个并创建自定义加密器/解密器。 - raksja