我有一个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;
}
我没有得到的是双重更新功能正在做什么。它真的在做什么吗?
这个问题被重新发布,因为它被错误地标记为重复。我找到了答案并决定分享。
答案 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;
}