2014-02-08 56 views
3

我已經散列了我的密碼並將它們存儲在數據庫中。 但是我不能在不解密密碼的情況下登錄。 我該怎麼做?如何使用md5散列密碼登錄?

我試圖做到這一點,但不工作代碼:

@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 cryption:

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; 
} 

回答

2

您還加密登錄時用戶輸入和密碼那麼你比較兩個哈希。因此,您需要使用相同的加密方法來存儲密碼並進行檢查。

2

您不會解密md5散列,您會對用戶提供的密碼進行編碼,並根據數據庫中的散列進行檢查。

爲了提高安全性,您還應該在散列前向密碼添加一個鹽。 MD5並不是一個很好的密碼散列算法,因爲它是爲速度而設計的,這與您想要的相反,您希望密碼生成相對較慢,因此請使用更安全的算法並多次散列。

可以使用生成一個散列SHA-256:

MessageDigest md = MessageDigest.getInstance("SHA-256"); 
String password = "some password"; 

md.update(password.getBytes("UTF-8")); 
byte[] digest = md.digest(); 

使用相同的算法,當您將哈希到數據庫中,當您收到登錄時的密碼,並在數據庫匹配散列。

+0

是的我知道鹽,但如何編碼密碼? – Sembrano

+0

@Sembrano,爲了簡單起見,更新了一個例子,沒有鹽並多次散列密碼。 –

+0

啊,所以我編碼方式相同,然後我明白 – Sembrano