我有一个要移植到C#的Java方法,该方法使用盐对字符串进行哈希处理。该方法的作用类似于以下内容。

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;
}

关于java - 当您多次执行MessageDigest.update时,MessageDigest会做什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37321409/

10-10 16:36