通过MessageDigest了解Java中的散列密码

Roy*_*ari 4 java cryptography hash-function

我正在创建一个简单的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);
}
Run Code Online (Sandbox Code Playgroud)

我得不到的是: 在这段代码中,我该如何设置哈希键?我需要确保在验证过程中使用相同的密钥.如果我没有设置密钥,我怎么能这样做?

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

JB *_*zet 7

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

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

  • 它使用String.getBytes(),它依赖于默认的平台编码,因此不同于平台.您应该指定一个编码,如UTF-8.
  • 它使用新的String(byte []),它有与上面相同的问题+另外一个:所有字节序列都不是有效字符.要将纯二进制字节数组转换为String,请使用base64编码算法.apache commons代码有一个.