Есть ли разница между 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.Create();
если (! строка.IsNullOrEmpty (соль)) пароль = $"{пароль}{соль}";
var hashSha = sha.ComputeHash(Encoding.Unicode.GetBytes (пароль));
вернуть Encoding.Unicode.GetString (hashSha);