4

我正在创建一个简单的 Web 应用程序,并希望将散列密码存储到数据库中。我也需要身份验证令牌的哈希函数(连接用户名和日期,并将它们与哈希一起作为令牌发送给客户端)。

我发现 MessageDigest Java 类可以帮助我解决这个问题。这是一个链接。基本思想是这样的:

public String digestString (String stringToHash) throws NoSuchAlgorithmException {
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");        
    byte[] stringBytes = stringToHash.getBytes();
    byte[] stringDigest = sha256.digest(stringBytes);
    return new String(stringDigest);
}

我不明白的是: 在这段代码中,如何设置哈希键?我需要确保在验证过程中使用相同的密钥。如果我不设置密钥,我该怎么做?

顺便说一句:我知道我应该在散列之前向散列文本添加一个盐(在这种情况下为 256 个字节)。

4

1 回答 1

7

哈希不使用密钥。这只是一种单向算法。你给它一些消化的东西,它会返回一个哈希值。它保证的是很难找到原始输入或任何其他导致相同哈希的输入。

您的算法有两个基本问题(除了缺乏盐渍):

  • 它使用 String.getBytes(),它依赖于默认的平台编码,因此因平台而异。您应该指定一种编码,例如 UTF-8。
  • 它使用 new String(byte[]),它与上面的问题相同 + 一个附加问题:所有字节序列都是无效字符。要将纯二进制字节数组转换为字符串,请使用 base64 编码算法。apache 公共代码有一个。
于 2012-01-04T18:36:33.547 回答