我开始了解jBCrypt用于散列密码并存储在数据库中。但是我没有找到任何选项可以从哈希值中取回实际值。只有BCrypt.checkpw(password, hashedPassword)
可用,它返回boolean.http://www.mindrot.org/projects/jBCrypt/如何从哈希值中获取实际值。 如果在jBCrypt中不可能,有没有其他方法可以在java中加密和解密值?提前感谢...
您可以使用对称加密算法,而不是使用哈希函数,例如Spring Security
提供的 ,来自他们的Crypto Module
,更具体地说是他们的 Encryptors 类。
下面是一个基本的加密/解密示例:
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()
的密码存储在安全的位置。 此外,您还希望使用不同的方法来为您的密码生成盐(可能是为每个新密码加密生成盐(,并将其存储起来以供以后解密密码时使用。
此外,您可能不希望将密码保留为纯文本(字符串(,而是将其保留为char[]
或byte[]
,但这应该从您可以开始的地方开始。
还有一个不同的库可以做同样的事情,来自Apache,Apache Commons Crypto,它确实使用了与Spring Crypto
相同的算法。
请记住,使用库而不是自己实现更安全,因为使用包javax.crypto
需要您知道自己在做什么,并且不会造成超出需要的伤害。
旁注:您可能会遇到 jdk 限制为 128 位的情况。要从 256 位中受益,请确保添加 Java 加密扩展
哈希函数的定义对原像有抵抗力:给定 h(x(,应该不可能恢复 x。"可逆"的哈希函数与该属性完全相反。因此,您无法反转哈希函数,因此无法从哈希值中获取实际值。您无法从 h(x( 获取 x,您唯一能做的就是为即将到来的新密码 y 计算 h(y( 并查看它是否等于 h(x(。
不仅仅是jBcrypt,任何安全的哈希函数都不会提供这种恢复功能
我没有找到任何选项可以从散列值中取回实际值
好吧 - 这是加密哈希函数的主要目的。
有没有其他方法可以在 Java 中加密和解密值?提前感谢...
在Java 中加密/解密值的例子很多,只需搜索它,即使在 SO 上也是如此。你也可以看看我关于Java加密的博客 - 它是关于基本的低级加密API。
我希望您不要对用户密码使用加密 - 即使使密码可逆的远程可能性也会使您的系统有潜在的泄漏危险。