我认识到jBCrypt用于哈希密码并存储在数据库中。但是我没有找到任何选择从哈希值取回实际值。仅BCrypt.checkpw(password, hashedPassword)
可用,返回布尔值。http://www.mindrot.org/projects/jBCrypt/
如何从散列值中获取实际值。
如果在jBCrypt中不可能,是否还有其他方法可以在Java中加密和解密值?预先感谢...
答案 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的。
我希望您不是要对用户密码使用加密-即使是远程可能使密码可逆,也会使您的系统有潜在的泄漏危险。