我已经将密码散列并存储在数据库中。 但是我无法在不解密密码的情况下登录。 我该怎么做?
我的代码试图这样做但不起作用:
@RequestMapping(method = RequestMethod.POST)
public String processLogin(Person user, BindingResult result,
@RequestParam("userName") String username,
@RequestParam("password") String password) {
try {
password = Hex.encodeHexString(MessageDigest.getInstance("SHA-256").digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
ValidateUser(username, password);
String destination = "";
if (success == true) {
destination = "redirect:/person.html";
}
else {
destination = "redirect:/index.html";
}
return destination;
}
public boolean ValidateUser(String username, String password) {
// Decrypt password here.
List<Person> users = service.getAllPersons();
for (Person allUsers : users) {
if (allUsers.getUserName().equals(username) &&
allUsers.getPassword().equals(password)) {
success = true;
}
}
return success;
}
这是我的md5哭泣:
public void setPassword(String password) {
String md5 = null;
try {
// Create MessageDigest object for MD5
MessageDigest digest = MessageDigest.getInstance("MD5");
// Update input string in message digest
digest.update(password.getBytes(), 0, password.length());
// Converts message digest value in base 16 (hex)
md5 = new BigInteger(1, digest.digest()).toString(16);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
this.password = md5;
}
答案 0 :(得分:2)
您还要加密用户在登录时输入的密码,然后比较两个哈希值。因此,您需要使用相同的加密方法来存储密码和检查密码。
答案 1 :(得分:2)
您没有解密md5哈希,您对用户提供的密码进行编码,并根据数据库中的哈希进行检查。
为了提高安全性,您还应该在散列之前为密码添加salt。 MD5不是一个很好的密码哈希算法,因为它专为速度而设计,与您想要的相反,您希望密码生成相对较慢,因此请使用更安全的算法,并多次哈希。
您可以使用SHA-256生成哈希:
MessageDigest md = MessageDigest.getInstance("SHA-256");
String password = "some password";
md.update(password.getBytes("UTF-8"));
byte[] digest = md.digest();
将哈希插入数据库时使用相同的算法,如在登录期间收到密码,并匹配数据库中的哈希值。