我开始了解jBCrypt用于散列密码并将其存储在数据库中。但是我没有找到任何从散列值中取回实际值的选项。只有返回布尔值的BCrypt.checkpw(password, hashedPassword)可用。http://www.mindrot.org/projects/jBCrypt/如何从散列值中获取实际值。如果这在jBCrypt中是不可能的,有没有其他方法来加密和解密java中的值呢?先谢谢你...
发布于 2018-08-27 17:41:36
您可以使用对称加密算法,而不是使用哈希函数,该算法来自他们的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相同的算法。
请记住,使用库比自己实现更安全,因为使用package javax.crypto将要求您知道自己在做什么,并且不会造成超过需要的危害。
附注:您可能会遇到jdk被限制为128位的情况。要从256位中获益,请确保添加Java Cryptography Extension
发布于 2018-08-27 17:22:12
哈希函数的定义对原图像有抵抗力:给定h( x ),恢复x应该是不可能的。哈希函数是“可逆的”,这一性质正好相反。因此,你不能反转哈希函数,因此不可能从哈希函数中获得实际值,value.You不能从h(x)中获得x,你唯一能做的就是为即将到来的新密码y计算h(y),并查看它是否等于h(x)。
不仅仅是jBcrypt,任何安全的散列函数都不会提供这种恢复功能
发布于 2018-08-27 18:44:09
,但我没有找到从散列值中获取实际值的任何选项
这就是密码学哈希函数的主要目的。
有没有其他方法可以加密和解密java中的值?先谢谢你...
在Java中有很多加密/解密值的例子,只要搜索它,甚至在这里也是如此。你不妨看看my blog about encryption in Java --它是关于基本的低级加密API的。
我希望你的意思不是要对用户密码进行加密--即使是远程的可逆密码也会使你的系统存在泄露的潜在危险。
https://stackoverflow.com/questions/52036137
复制相似问题