Java jBCrypt加密和解密
我开始了解jBCrypt,它可以散列密码并存储在数据库中。但是我没有找到从散列值返回实际值的任何选项。只有Java jBCrypt加密和解密,java,spring-mvc,spring-boot,java-8,jbcrypt,Java,Spring Mvc,Spring Boot,Java 8,Jbcrypt,我开始了解jBCrypt,它可以散列密码并存储在数据库中。但是我没有找到从散列值返回实际值的任何选项。只有BCrypt.checkpw(密码,hashedPassword)可用,返回布尔值。 如何从散列值中获取实际值。 如果在jBCrypt中不可能,那么在java中还有其他加密和解密值的方法吗?提前感谢…哈希函数的定义对前映像有抵抗力:给定h(x),应该不可能恢复x。“可逆”的哈希函数与该属性正好相反。因此,您无法反转散列函数,因此无法从散列值中获取实际值。您无法从h(x)中获取x,您唯一能做的
BCrypt.checkpw(密码,hashedPassword)
可用,返回布尔值。
如何从散列值中获取实际值。
如果在jBCrypt中不可能,那么在java中还有其他加密和解密值的方法吗?提前感谢…哈希函数的定义对前映像有抵抗力:给定h(x),应该不可能恢复x。“可逆”的哈希函数与该属性正好相反。因此,您无法反转散列函数,因此无法从散列值中获取实际值。您无法从h(x)中获取x,您唯一能做的就是为即将到来的新密码y计算h(y),并查看它是否等于h(x)
不仅仅是jBcrypt,任何安全的哈希函数都不会提供恢复功能,而不是使用哈希函数,您可以使用对称加密算法,如
Spring Security
提供的对称加密算法,从他们的加密模块
,更具体地说是他们的类
下面是一个基本的加密/解密示例:
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不同的库,它使用与Spring Crypto相同的算法
请记住,使用库比实现自己更安全,因为使用packagejavax.crypto
将要求您知道自己在做什么,并且不会造成比需要更多的伤害
旁注:您可能会遇到jdk限制为128位的情况。要从256比特中获益,请确保添加
但是我没有找到从散列值返回实际值的任何选项
这就是加密哈希函数的主要用途
在java中还有其他加密和解密值的方法吗?先谢谢你
Java中有很多加密/解密值的示例,只需搜索它,即使在这里也是如此。您还可以研究一下——它是关于基本的低级加密API的
我希望你不是想对用户密码使用加密——即使是远程可能使密码可逆,也会使你的系统存在潜在的泄漏危险