2015-08-19 2 views
-4

Как я могу получить SHA1 hash в C# эквивалентного производство сайта http://www.sha1-online.com/Использование SHA1 в C# для хеширования строки

мой образец строка

"20150819100015.test.1002-4-2015.978.GBP"

его хэш-строка

«caed6ade209e95ad973 cce8def473f1e39e75c0b»

+1

Не используйте SHA-1. Он сломан и уходит. –

+0

@ Поверьте, но иногда вам нужно взаимодействовать с устаревшими или плохо обслуживаемыми системами. – CodeCaster

+0

@CodeCaster, true. Только предупреждение, на всякий случай. –

ответ

1

Примечание: Обновленный мой ответ будет более конкретно к рассматриваемому вопросу при отражении замечаний.

Хэши - это компьютерные байт-массивы, и поскольку представление массива байтов строки зависит от используемой текстовой кодировки, возможно, не удастся ответить на ваш вопрос. Это связано с тем, что мы точно не знаем, что использует кодировка текста http://www.sha1-online.com.

Я сделал следующее предположение, использующее кодировку UTF8, поэтому, пока мой примерный код будет выдавать хеш, указанный вами в вопросе, с соответствующим вводом, он может не всегда воспроизводить один и тот же хэш как http://www.sha1-online.com для других данных.

.NET Framework предоставляет 3 класса реализации SHA1, а именно SHA1Cng, SHA1CryptoServiceProvider и SHA1Managed.

Основное отличие этих реализаций здесь от Which one to use: Managed vs. NonManaged hashing algorithms, но я использовал его для SHA1Указанный в фрагменте кода ниже, поскольку он полностью реализован в управляемом коде и поэтому, хотя и медленнее, потенциально может быть более переносимым на разные платформы.

Выход хэша также представляет собой массив байтов, поэтому для превращения хэша в текстовое представление я преобразовал байты в их шестнадцатеричное представление и объединил их, поскольку это представляется представлением, которое http://www.sha1-online.com решит использовать.

static void Main(string[] args) 
{ 
    var sha1 = new System.Security.Cryptography.SHA1Managed(); 
    var plaintextBytes = Encoding.UTF8.GetBytes("20150819100015.test.1002-4-2015.978.GBP"); 
    var hashBytes = sha1.ComputeHash(plaintextBytes); 

    var sb = new StringBuilder(); 
    foreach (var hashByte in hashBytes) 
    { 
     sb.AppendFormat("{0:x2}", hashByte); 
    } 

    var hashString = sb.ToString(); 
} 
+1

Что является неправильным в этом вопросе? Не голосуйте, не оставляя комментариев о том, почему это не полезно. – DanL

+1

«Здесь, я написал ваш код», дамп без каких-либо объяснений вообще не считается довольно хорошим ответом. – CodeCaster

+0

Вопрос Ops: «Как я могу получить хэш SHA1 в эквиваленте C#, созданный сайтом ». Поскольку вы предлагаете «здесь, я написал ваш код», это не очень хороший подход, но он не делает недействительным такой подход. Я считаю, что мой подход оправдан, поскольку это относительно простая задача, а Op - специфическая для языка, поэтому такой простой фрагмент кода выполнит требуемые цели. Если бы Упро попробовал что-то сам и не получил тот же ответ (например, потому что он использовал неправильную кодировку), тогда мой ответ оправдал бы объяснение. Однако эта краткость полезна. – DanL