【问题标题】: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,任何安全散列函数都不会提供这种恢复功能

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-03
          • 2011-11-27
          • 2012-04-29
          • 2011-09-02
          • 2013-02-18
          • 2015-01-20
          • 2014-01-05
          • 2019-01-06
          相关资源
          最近更新 更多