有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何解密pbkdf的散列密码

我正在尝试做一个项目,我散列了密码并将散列后的密码存储在数据库中

现在我面临着解密的问题。如何解密此pbkdf形式的密码?我正试图用Java实现这一点


共 (4) 个答案

  1. # 1 楼答案

    要检查登录,您需要散列用户输入,并将其与散列密码进行比较

    如果您的散列不可重复(同一个字符串使用同一个散列),那么您是做错了-即,您选择了错误的散列方法

    对于salt散列,您需要使用散列密码存储salt,并使用相同的salt对正在检查的用户输入进行散列

  2. # 2 楼答案

    where I hashed the password and store hashed password in database.

    干得好!但是,你是如何做到这一点的

    How can I decrypt this pbkdf form of password?

    不可能。这就是重点

    密码哈希库只应公开2个操作。回到原来的问题(你是如何对这些密码进行哈希运算的?),如果你的库的API不是这样工作的,那就是一个垃圾库,找点别的吧

    这两个原语是:

    String encodeNewPassword(String password);
    
    boolean verifyPassword(String passwordEnteredByUser, String thingThatEncodeNewPassReturned);
    

    这个过程很简单,当你有一个新密码(一个新的帐户注册,或者一个用户更改了他们的密码)时,调用encodeNewPassword,获取这个方法返回的字符串或者byte[]或者其他什么,将整个东西存储在数据库中的某个地方,然后检索该密码,并在稍后需要验证用户是否输入了“他们的”密码时将其传回:您将用户刚刚输入的密码与您存储在数据库中的内容一起传递,然后返回“是”或“否”

    盐和土豆条都被烤成一根线

    充其量,createNewPassword调用还允许您配置容差或难度(例如,如果我们谈论的是bcrypt,那么可能需要多少“轮”)

    你没有说你正在使用哪个库,但它很可能像上面所说的那样工作(同样,正如我所说的,如果它不工作,去掉它,它是不好的),所以去寻找“另一种方法”,一种同时接收用户输入的密码和之前获得的字符串并返回布尔值以指示其正确与否的方法

    请注意,此方法在内部不解密任何内容。它以相同的方式对输入的密码进行加密/散列,并检查是否出现相同的散列。如果它们相等,则用户输入与以前相同的密码

  3. # 3 楼答案

    哈希是一个单向函数,无法解密哈希。您可以通过散列比较文本,然后比较数据库中的散列是否为原始文本

  4. # 4 楼答案

    PBKDF不是加密。同样,它是一个基于密码的密钥派生函数。这是一个散列,但故意慢。简短的回答:你不能。PBKDF的整个想法是让它很难找到碰撞。即使您知道使用了多少发子弹,也要花费太多时间才能发生碰撞