2015-01-31 332 views
0

這是一個桌面應用程序,所以只有我想要基本的登錄安全性,我儘管使用一個函數來加密密碼,另一個我通過密碼從UI和哈希保存到數據庫並返回true o錯誤取決於是否匹配。使用Jasypt加密和解密密碼

我嘗試使用來自官方jasypt網站的合併版本,我可以加密但我不知道如何解密它。

//Function to encrypt password 
public static String cifrarClave(String clave) { 
    PooledStringDigester digester = new PooledStringDigester(); 
    digester.setPoolSize(4); 
    digester.setAlgorithm("SHA-1"); 
    digester.setIterations(50000); 
    digester.setSaltSizeBytes(32); 

    //String return is hash that I save into db 
    return digester.digest(clave); 
} 

//Function to decrypt password 
//clave is old plain that user enter from UI and I want to compare from hash save it into db 
public static boolean validarClave(String clave, String hash) { 
    PooledStringDigester digester = new PooledStringDigester(); 
    digester.setPoolSize(4); 
    digester.setAlgorithm("SHA-1"); 
    digester.setIterations(50000); 

    String digest = digester.digest(clave); 

    //Always fails at that point, I get different hash from compare clave 
    return digester.matches(digest, hash); 
} 

我在安全新手,所以我不知道很多關於安全,我接受其他建議或替代方案,我只想要一個工作的例子。

+0

祝你好運! – 2015-01-31 19:15:33

+0

謝謝jaja,我認爲失敗是因爲salt改變了每一個tiem,我想用鹽作爲例子來自用戶名的前兩個字母,所以我總是可以知道鹽,我不需要分開保存。這裏的問題是,我不知道如何編碼,我閱讀這篇文章(http://www.jasypt.org/howtoencryptuserpasswords.html),但他們沒有給出任何代碼示例。 – Marcos 2015-01-31 19:29:35

+2

您**不需要**來解密密碼,只需散列用戶輸入的內容,並使用數據庫中的密碼來檢查散列。 – 2015-01-31 19:33:43

回答

0

當您使用兩個散列摘要而不是明文消息和先前計算的摘要調用它時,您正在使用jasypt的matches(message, digest)函數。

在你validarClave(),你第一次不必要地從用戶的明文密碼(clave)計算摘要您然後傳遞到匹配:

String digest = digester.digest(clave); 
//Always fails at that point, I get different hash from compare clave 
return digester.matches(digest, hash); 

你的方法將正常工作,如果你簡單地傳遞明文密碼的匹配,如下所示:

digester.matches(clave, hash); 

更多信息,請訪問jasypt的javadocscode examples