jBCrypt加密和解密

时间:2018-08-27 09:18:44

标签: java spring-mvc spring-boot java-8 jbcrypt

我认识到jBCrypt用于哈希密码并存储在数据库中。但是我没有找到任何选择从哈希值取回实际值。仅BCrypt.checkpw(password, hashedPassword)可用,返回布尔值。http://www.mindrot.org/projects/jBCrypt/ 如何从散列值中获取实际值。 如果在jBCrypt中不可能,是否还有其他方法可以在Java中加密和解密值?预先感谢...

3 个答案:

答案 0 :(得分:1)

您可以使用对称加密算法,例如Spring Security的{​​{3}}类,而不是使用Crypto Module提供的对称加密算法。

这是一个基本的加密/解密示例:

public static void main(String[] args) {
        final String salt = UUID.randomUUID().toString().replace("-", "");
        TextEncryptor textEncryptor = Encryptors.delux("my-super-secure-password-for-the-encryptor", salt);
        final String passwordToBeEncrypted = "my-secure-password-to-be-encrypted";
        final String encrypted = textEncryptor.encrypt(passwordToBeEncrypted);
        textEncryptor.decrypt(encrypted);
        System.out.println(passwordToBeEncrypted.equalsIgnoreCase(textEncryptor.decrypt(encrypted)));
}

在这里,我正在使用delux。根据他们的文档:

  

创建一个使用基于密码的“更强”的文本加密器   加密。

请记住,这是一种非常幼稚的加密和解密方法。

我不建议您将此解决方案复制粘贴到生产代码中。

为了使此功能可以投入生产,您希望将提供给Encryptors.delux()的密码存储在安全的地方。 另外,您还想使用一种不同的方式来为您的密码生成一个salt(可能为每个新密码加密生成一个salt),并将其存储在以后要解密密码的位置。

此外,您可能不想将密码保留为纯文本(字符串),而应将其保留为char[]byte[],但这应该是一个可以开始的地方。

还有一个与Apache Encryptors不同的库,它执行与Spring Crypto相同的算法。

请紧记,使用库而不是实现自己会更安全,因为使用软件包javax.crypto将要求您知道自己在做什么,并且不会造成不必要的伤害。

侧面说明:您可能会遇到jdk限制为128位的情况。要使用256位,请确保添加Apache Commons Crypto

答案 1 :(得分:0)

哈希函数的定义对原像具有抵抗力:给定h(x),应该不可能恢复x。散列函数“可逆”与该属性完全相反。因此,您无法反转哈希函数,因此无法从哈希值中获取实际值。您无法从h(x)中获取x,只能为即将到来的新密码y计算h(y),看看是否等于h(x)。

不仅jBcrypt,任何安全的哈希函数都不会提供此恢复功能

答案 2 :(得分:0)

  

但是我没有找到任何方法来从散列值中获取实际值

好吧-这是加密哈希函数的主要目的。

  

还有其他方法可以在Java中加密和解密值吗?预先感谢...

有很多示例可以用Java加密/解密值,即使在SO上也可以搜索/解密。您也可以看看my blog about encryption in Java-它是关于基本的低级加密API的。

我希望您不是要对用户密码使用加密-即使是远程可能使密码可逆,也会使您的系统有潜在的泄漏危险。