我正在尝试在用户注册中使用 MD5 加密密码,并在登录期间匹配相同的密码。我使用 Mysql 作为我的数据库。Mysql 也提供了将密码转换为 MD5(即 MD5(密码))的选项。我想知道加密它的更好方法..是使用java代码还是mysql查询..
提前致谢。
不要存储密码。如果它曾经放在磁盘上,它可能会被盗。相反,存储密码哈希。使用正确的散列算法,如SHA256、BCrypt或Salt散列。
以下是您必须查看的一些有用链接:
希望这可以帮助。
这是我使用 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。该异常是非常多余的。它永远不会抛出它。当您将密码添加到数据库时,您会添加此方法返回的内容。登录时您可以比较它们。
由于逻辑上您的应用程序和数据库可以存在于两个单独的物理盒子中,因此如果您在应用程序层加密密码然后将其移动到数据库中,这是一个更安全的选择。
从应用程序设计的角度来看,您应该考虑加密,在很早的时候对您的密码进行哈希处理,这样您的密码就不会像纯字符串一样从一层到另一层移动。
无关:
MD5容易发生碰撞攻击,你可以考虑使用salt之类的附加电子邮件或动态生成的值来防止Rainbow Table。