【问题标题】:jBCrypt Encrypt and DecryptjBCrypt 加密和解密
【发布时间】:2023-03-16 10:20:01
【问题描述】:
我开始了解 jBCrypt 用于散列密码并存储在数据库中。但是我没有找到任何从散列值中取回实际值的选项。只有BCrypt.checkpw(password, hashedPassword) 可用,它返回布尔值。http://www.mindrot.org/projects/jBCrypt/
如何从散列值中获取实际值。
如果在 jBCrypt 中不可能,还有其他方法可以在 java 中加密和解密值吗?提前谢谢...
【问题讨论】:
标签:
java
spring-mvc
spring-boot
java-8
jbcrypt
【解决方案1】:
但是我没有找到任何从哈希值中取回实际值的选项
嗯 - 这是加密哈希函数的主要目的。
还有其他方法可以在 java 中加密和解密值吗?提前谢谢...
在 Java 中有很多加密/解密值的示例,只需搜索它,即使在 SO 上也是如此。您不妨看看my blog about encryption in Java - 它是关于基本的低级加密 API。
我希望您不是要对用户密码使用加密——即使是使密码可逆的远程可能性也会使您的系统有泄漏的潜在危险。
【解决方案2】:
您可以使用对称加密算法,而不是使用哈希函数,例如 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() 的密码存储在安全的地方。
此外,您还希望使用不同的方式为您的密码生成一个 salt(可能为每个新密码加密生成一个 salt)并将其存储起来以供以后解密密码的地方使用。
此外,您可能不希望将密码保留为纯文本(字符串),而是将其保留为 char[] 或 byte[],但这应该是您可以开始的起点。
还有一个不同的库,来自 Apache,Apache Commons Crypto,它使用与 Spring Crypto 相同的算法。
请记住,使用库而不是自己实现会更安全,因为使用包 javax.crypto 将要求您知道自己在做什么,并且不会造成不必要的伤害。
旁注:您可能会遇到 jdk 限制为 128 位的情况。要从 256 位中受益,请确保添加 Java Cryptography Extension
【解决方案3】:
哈希函数的定义对原像具有抵抗力:给定 h(x),应该不可能恢复 x。 “可逆”的哈希函数与该属性完全相反。因此,您无法反转哈希函数,因此无法从哈希值中获取实际值。您无法从 h(x) 中获取 x,您唯一能做的就是为即将到来的新密码 y 计算 h(y) 并查看是否它等于 h(x)。
不仅仅是 jBcrypt,任何安全散列函数都不会提供这种恢复功能