2015-01-31 192 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