【问题标题】:Matching Hashed and Salted Passwords from Database匹配数据库中的散列和加盐密码
【发布时间】:2017-09-26 21:02:29
【问题描述】:

我使用 Apache Shiro 构建了一个自定义领域,以说明我们的应用程序具有多个用户帐户和存储密码的位置。最初我使用 Shiro 来散列和匹配密码,但自定义领域意味着我必须手动执行其中一些操作。

查看后我发现了这段代码:

public String sha256(String base) {
    try{        
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(base.getBytes("UTF-8"));
        StringBuffer hexString = new StringBuffer();

        for (int i = 0; i < hash.length; i++) {
            String hex = Integer.toHexString(0xff & hash[i]);
            if(hex.length() == 1) hexString.append('0');
            hexString.append(hex);
        }

        return hexString.toString();
    } catch(Exception ex){
       throw new RuntimeException(ex);
    }
}

我添加了一个盐,它工作得很好,所以我想知道我是否可以在创建用户名\密码对时将返回的值存储在数据库中,然后稍后检索它以匹配提供的密码(加上盐) .这似乎应该可以工作,但是当我之前使用 Shiro 执行此操作时,SHA256 密码散列器每次都没有使用相同的基本密码返回相同的值,但它始终能够匹配它。我想确保我遵循有效(最重要的是安全)的方法来处理密码。

【问题讨论】:

    标签: java authentication shiro sha256


    【解决方案1】:

    有几件事: 您可以使用以下内容创建字符串购买的哈希:new Sha256Hash(password, salt)

    看看this example

    如果您有多个存储用户的位置,您可能应该为每个存储设置不同的域。

    【讨论】: