当您多次执行MessageDigest.update时,MessageDigest正在执行什么操作?

时间:2016-05-19 11:08:33

标签: java c#

我有一个Java方法,我移植到C#,使用salt散列字符串。该方法如下所示。

private byte[] hash(byte[] bytes, byte[] salt) {
    MessageDigest digester = MessageDigest.getInstance("SHA-256");
    digester.update(salt);
    digester.update(bytes);
    byte[] hashed = digester.digest();
    return hashed;
}

我没有得到的是双重更新功能正在做什么。它真的在做什么吗?

  

这个问题被重新发布,因为它被错误地标记为重复。我找到了答案并决定分享。

1 个答案:

答案 0 :(得分:1)

Java中的MessageDigest和c#中的HashAlgorithm之间的区别在于MessageDigest是有状态的,而HashAlgorithm不是。调用MessageDigest.update时,您需要在MessageDigest中附加提供给字节数组的字节数组。这在调用MessageDigest.digest时重置。

在c#中,由于HashAlgorith不是有状态的,它只是散列所提供的任何东西。问题中哈希函数的等效c#方法如下......

private byte[] Hash(byte[] bytes, byte[] salt)
{   
    HashAlgorithm sha256 = new SHA256CryptoServiceProvider();
    byte[] combined = salt.Concat(bytes).ToArray();
    byte[] hashed = sha256.ComputeHash(combined);
    return hashed;
}