C #: String -> MD5 -> Hex - PullRequest
       26

C #: String -> MD5 -> Hex

4 голосов
/ 09 июля 2009

в таких языках, как PHP или Python, есть удобные функции для преобразования входной строки в выходную строку, которая является ее шестнадцатеричным представлением.

Я считаю это очень распространенной и полезной задачей (хранение и проверка пароля, контрольная сумма содержимого файла ...), но в .NET, насколько мне известно, вы можете работать только с байтовыми потоками.

Функцию для выполнения работы легко надеть (например, http://blog.stevex.net/index.php/c-code-snippet-creating-an-md5-hash-string/),, но я хотел бы знать, если я что-то упускаю, использую неправильный шаблон или просто нет такого в .NET .

Спасибо

Ответы [ 3 ]

7 голосов
/ 09 июля 2009

Метод, на который вы ссылаетесь, кажется правильным, немного другой метод показан в MSDN C # FAQ

Комментарий предполагает, что вы можете использовать:

System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(string, "MD5");
5 голосов
/ 09 июля 2009

Одна проблема связана с самой концепцией "шестнадцатеричного представления [строки]".

Строка - это последовательность символов . То, как эти символы представляются как отдельные биты, зависит от кодировки. «Нативной» кодировкой для .NET является UTF-16, но обычно достигается более компактное представление (при сохранении возможности кодировать любую строку) с использованием UTF-8.

Вы можете использовать Encoding.GetBytes, чтобы получить закодированную версию строки после того, как вы выбрали подходящую кодировку - но факт, что равен , этот выбор - Причина в том, что не так много API-интерфейсов, которые переходят прямо из строки в base64 / hex или выполняют шифрование / хеширование непосредственно в строках. Любые такие API, которые существуют do , почти наверняка будут выполнять «кодирование в массив байтов, выполнение соответствующих двоичных операций, декодирование непрозрачных двоичных данных в hex / base64».

(Это заставляет меня задуматься, не стоит ли писать вспомогательный класс, который может принимать кодировку, Func<byte[], byte[]> и формат вывода, такой как hex / base64, - который может представлять произвольную двоичную операцию, примененную к строке .)

5 голосов
/ 09 июля 2009

Да, вы можете работать только с байтами (насколько я знаю). Но вы можете легко превратить эти байты в их шестнадцатеричное представление, просматривая их и делая что-то вроде:

myByte.ToString("x2");

И вы можете получить байты, составляющие строку, используя:

System.Text.Encoding.UTF8.GetBytes(myString);

Так что это можно сделать в пару строк.

...