Java 当您多次执行MessageDigest.update时,MessageDigest在做什么?
我有一个Java方法,我正在移植到C#,它使用salt散列字符串。方法是执行如下操作Java 当您多次执行MessageDigest.update时,MessageDigest在做什么?,java,c#,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(
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;
}
我不明白双重更新函数在做什么。它真的在做什么吗
这个问题被重新提出,因为它被错误地标记为重复。我找到了答案,决定与大家分享
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;
}