Мне интересно, в чем разница между этими функциями хеширования:
System.Security.Cryptography
Кажется, они дают разные результаты. В прошлом я успешно использовал HMACSHA1 с ключом.
Но теперь мне нужен хеш без ключа, и SHA1CryptoServiceProvider, похоже, возвращает правильный результат. Который заставляет меня задаваться вопросом, почему мне нужно внезапно переключиться на другой класс. Трудно найти информацию об этом. Пример:
// y1 = "2jmj7l5rSw0yVb/vlWAYkK/YBwk=" (seems correct)
var f1 = new SHA1CryptoServiceProvider();
string y1 = Convert.ToBase64String(f1.ComputeHash(new byte[] { }));
// y2 = "+9sdGxiqbAgyS31ktx+3Y3BpDh0=" (seems wrong)
HMAC f2 = HMACSHA1.Create();
f2.Key = new byte[]{};
string y2 = Convert.ToBase64String(f2.ComputeHash(new byte[] { }));
EDIT
Контекст: я пытаюсь реализовать OAuth 1.0 с SHA512, потому что я не смог найти библиотеку .NET, которая это делает (я знаю, что SHA1 слаб). У меня уже есть вычисление подписи с использованием HMACSHA1.Create (), хотя вызов Create может не выполнять то, что я ожидаю, как указал один из вас. Я пытался реализовать параметр oauth_body_hash:
https://tools.ietf.org/id/draft-eaton-oauth-bodyhash-00.html#anchor16
Именно тогда я заметил, что HMACSHA1.Create () не создает правильный хеш, даже если он работает для oauth_signature. SHA1CryptoServiceProvider действительно работал для oauth_body_hash. Идея использования SHA1 заключается в том, что в сети есть еще несколько примеров. После этого я хочу изменить его на SHA512