2009-07-06 5 views
5

Я искал способ хэшировать заданную строку в C#, которая использует предопределенный ключ.MD5 Hashing с учетом ключа на C#

На моих приключениях через Интернет, пытаясь найти пример, я видел множество примеров MD5CryptoServiceProvider, которые, похоже, используют ключ по умолчанию для машины, но ни один из них не применяет конкретный ключ. Мне нужно иметь специальный ключ для кодирования данных, чтобы синхронизировать его с чужим сервером. Я передаю им хэшированную строку и идентификационный номер, и они используют этот анализ данных и возвращают мне подобный набор. Так или иначе, чтобы получить md5 в хэш через определенный ключ, который был бы совместим с обоими.

Я бы предпочел, чтобы это было сделано на C#, но если это невозможно с библиотеками, вы можете сделать это с помощью некоторых веб-языков, таких как php или asp?

Редактировать: Неисправность сценария, в который я был брошен, и после небольшого сидения и размышления о том, почему они хотели бы, чтобы я использовал ключ, кажется, что им нужен ключ, прикрепленный к концу строки и хешированный. Таким образом, сервер может добавить ключ, который он имеет вместе с переданными данными, чтобы обеспечить его действительный доступ к компьютеру. В любом случае ... спасибо всем^_^

Edit2: Как говорится в моем комментарии ниже, это был термин «соление», о котором я не обращал внимания. О, радости попасть в нечто новое, без каких-либо указаний.

+1

Там нет ключа для MD5 ..., как Том Риттер отметил, что это ** не ** алгоритм шифрования –

+0

Как все это указал MD5 является хеширования, не шифрование, но это не ясно из вашего поста, если вы на самом деле * делаете * хотите хэширования и оговорок или действительно хотите шифрования. Уточните пожалуйста. – annakata

+0

Ваше изменение не совсем разъясняло ваш вопрос. MD5 не использует «предопределенный ключ», о котором вы спрашиваете. Однако, если вам нужно всего лишь сравнить хэши, просто возьмите хэш двух ваших входов и сравните результаты бит-бит. Обратите внимание, что MD5 обычно (за исключением очень маловероятного случая хеш-столкновения) дает совершенно разные результаты, даже если входы меняются на наименьшую величину. – Naaff

ответ

17

MD5 не шифрование - это хэш. Это не позволяет расшифровать строку.

Вы ищете симметричный алгоритм шифрования. Он использует тот же ключ для шифрования и дешифрования. Пытается использовать функции шифрования without understanding them is dangerous. Даже если вы думаете, что понимаете их, вы можете сделать ошибку.

Если вы переносите данные на сервер другого человека, вы можете быть лучше использовать что-то вроде gpg для шифрования файла с помощью симметричного ключа вы оба согласны на по телефону, или возможно, некоторые с открытой ключом криптографии. Таким образом, вы не пишете криптокода, и это безопаснее (не полностью безопасно, заметьте, но безопаснее).


Edit: Я все еще пытаюсь расшифровать ваши требования.

MD5 - это неглавная хеш-функция - ключ вообще не используется. Итак, скажем, сервер отправляет вам гигантскую строку, или файл, и хэш этого. Затем вы должны указать MD5 на строку или файл и сравнить хэш, вычисленный с хешем, который они отправили. Если они совпадают - данные были не повреждены в пути. То, что не означает, что никто не подделывал то, что они вам отправили, потому что у MD5 нет «секретного соуса». Я могу md5 все, что хочу, и отправить его вам.

A HMAC - это ключ-хэш-функция. У этого есть секретный ингредиент, который должен знать только вы и группа, с которой вы общаетесь, - секретный ключ. Если они отправят вам длинную строку или файл и HMAC, вы можете сами вычислить HMAC, сравнить свой HMAC и их, а если они совпадают, данные не были повреждены при переходе, и данные не были изменены с помощью.

+0

+1 для упоминания HMAC. – ojrac

2

MD5 является хеш-функцией и, строго говоря, не используется для «шифрования» строки. Он создает 128-битный «Message Digest» (отсюда MD в имени), который используется как своего рода отпечаток для входной строки.

0

Вы можете использовать AES из C# сделать тип шифрования, который вы ищете. Вот an article о том, как.

0

Вы должны использовать один из классов, унаследованных от SymmetricAlgorithm, например:

  • AesCryptoServiceProvider
  • DESCryptoServiceProvider
  • RC2CryptoServiceProvider
  • TripleDESCryptoServiceProvider
0

Итак, почему следующий тест сбой, если обе входные строки идентичны?

[TestMethod] 
    public void MD5HashTest() 
    { 
     var hash1 = (new MD5CryptoServiceProvider()).ComputeHash(new System.Text.ASCIIEncoding().GetBytes("now is the time for all good men.")); 
     var hash2 = (new MD5CryptoServiceProvider()).ComputeHash(new System.Text.ASCIIEncoding().GetBytes("now is the time for all good men.")); 

     Assert.AreEqual(hash1, hash2); 
    } 
+0

Это потому, что Assert.AreEqual проверяет ссылочное равенство: hash1 и hash2 - разные объекты, поэтому ваш тест не выполняется. Однако, если вы посмотрите на содержимое hash1 и hash2, вы увидите, что они содержат точно такой же набор байтов. –