Есть ли разница между SHA256.Create() и HashAlgorithm.Create("SHA-256")?

Эти два блока кода возвращают одно и то же? Предполагать arr та же byte[] в обоих примерах:

Пример кода 1

HashAlgorithm a = HashAlgorithm.Create("SHA-256");
var result = a.ComputeHash(arr);

Пример кода 2

SHA256 b = SHA256.Create();
var result = b.ComputeHash(arr);

ОБНОВЛЕНИЕ: я получил пример проекта создания кода подписи AWS в C# (который написан на.Net 4.5) и пытаюсь использовать его классы в проекте dotnetcode5 и просто потому, что HashAlgorithm.Create() пока недоступен в dotnetcode5, я решил использовать второй подход вместо первого. Проблема в том, что второй пример возвращает канонический результат, который недопустим в AWS.

4 ответа

Решение

SHA256.Create() делает это внутренне:

return (HashAlgorithm) CryptoConfig.CreateFromName("System.Security.Cryptography.SHA256");

HashAlgorithm.Create("SHA-256") приведет к этому:

return (SHA256) CryptoConfig.CreateFromName("SHA-256");

Оба эти вызова приведут к созданию экземпляра SHA256Managed,

См. https://msdn.microsoft.com/en-us/library/system.security.cryptography.cryptoconfig(v=vs.110).aspx

Так что нет никакой разницы между этими двумя подходами.

Я думаю, что основной вопрос, который отсутствует в OP - как сравнить массив из двух байтов.

Если вы делаете что-то вроде:

    static void Main(string[] args)
    {           
        byte[] arr = Encoding.ASCII.GetBytes("sample");
        HashAlgorithm a = HashAlgorithm.Create("SHA-256");
        var resulthash = a.ComputeHash(arr);

        SHA256 b = SHA256.Create();
        var resultsha = b.ComputeHash(arr);

        Console.WriteLine(StructuralComparisons.StructuralEqualityComparer.Equals(resulthash, resultsha ));
    }     

вы получите правильный ответ.

Обратите внимание, что вы не можете сделать что-то вроде resulthash==resultsha это вернет ложь.

Оба результата будут одинаковыми, потому что do вызывает один и тот же метод внутри

new static public SHA256 Create() {
    return Create("System.Security.Cryptography.SHA256");
}

new static public SHA256 Create(String hashName) {
    return (SHA256) CryptoConfig.CreateFromName(hashName);
}

static public HashAlgorithm Create(String hashName) {
    return (HashAlgorithm) CryptoConfig.CreateFromName(hashName);
}

разница только в типе возврата (SHA256 происходит от HashAlgorithm)

Ссылка на SHA256, Ссылка на HashAlgorithm

вар ша = SHA256.Create();

если (! строка.IsNullOrEmpty (соль)) пароль = $"{пароль}{соль}";

var hashSha = sha.ComputeHash(Encoding.Unicode.GetBytes (пароль));

вернуть Encoding.Unicode.GetString (hashSha);

Другие вопросы по тегам