C #: Как создать короткий код MD5? - PullRequest
21 голосов
/ 09 августа 2009

Когда я шифрую 23 с использованием шифрования MD5, я получаю 37693cfc748049e45d87b8c7d8b9aacd эту 32-символьную длинную строку, которая всегда будет статической для 23.

Мне нужен такой же механизм, но он должен генерировать 18 или менее (например: 122ff1e4883358b6) длинную строку символов вместо 32.

Как я могу это сделать в C #, есть ли более короткая версия MD5 в C # ??

Ответы [ 7 ]

30 голосов
/ 09 августа 2009

Мне нравится ответ @ RichieHindle. Однако, если вы заинтересованы в том, чтобы потерять меньше битов верности (и тем самым снизить риск коллизий), вы можете взять 128-битное значение, возвращаемое хешем MD5, и кодировать его, используя ASCII85 (также известный как как кодировка Base85) вместо шестнадцатеричной кодировки. Это даст вам весь хэш в 20 байтов (это больше, чем вы хотели, но вы можете сократить 2 байта, что приведет к гораздо меньшим потерям, чем удаление 14 из 32 байтов, которые вы получите, используя шестнадцатеричное кодирование).

Редактировать: Прашант говорит, что 20 символов достаточно близко, и попросил образец кода:

После получения хеша MD5 из вызова MD5.ComputeHash вы можете использовать кодировщик Джеффа Этвуда ASCII85 :

MD5 m = MD5.Create();
byte[] hash = m.ComputeHash(System.Text.Encoding.ASCII.GetBytes("23"));
Ascii85 encoder = new Ascii85();
encoder.EnforceMarks = false;
string hash85 = encoder.Encode(hash);
Console.Out.WriteLine(hash85);

Урожайность

2ebDPFFZsD?&,r1fX\$,

так что вы можете просто использовать hash85. encoder.EnforceMarks гарантирует, что кодировка не включает некоторые типичные префиксы и суффиксы, связанные с ASCII85.

10 голосов
/ 09 августа 2009

Вы можете просто взять столько хеша MD5, сколько вам нужно, и выбросить все остальное. Все биты имеют одинаковое значение, поэтому нет никакой разницы между этим и использованием некоторого алгоритма хеширования, который изначально генерирует меньше битов.

(Если вы делаете это по соображениям безопасности, помните, что меньшее количество битов облегчает взлом хэшей, независимо от алгоритма. Даже за пределами приложений безопасности меньшее количество битов увеличивает риск коллизий. Также имейте в виду, что MD5 Относительно небезопасно в наши дни - SHA-1 или SHA-2 считаются более безопасными.)

7 голосов
/ 09 августа 2009

MD5 всегда создает 128-битный хэш.

Другие более мелкие хэштипы (взяты из Википедии)

Хеш-функция Фаулера-Нолла-Во (32, 64, 128, 256, 512 или 1024 бита)
Хеш-функция Дженкинса (32 бита)
MurmurHash (32 или 64 бита)
Хеширование Пирсона (8 бит)

Но помните коллизии хешей

4 голосов
/ 09 августа 2009

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

Если ваша цель - превратить небольшое десятичное число в длинную запутанную строку, просто придумайте какой-нибудь алгоритм отображения и закодируйте результат с помощью zBase32 или подобного.

public string Obfuscate(long x)
{
    return ToZBase32(BitConverter.GetBytes(x * 63498398L));
}

public long Deobfuscate(string x)
{
    return BitConverter.ToInt64(FromZBase32(x)) / 63498398L;
}

23 кодируется в "gmuyaiayyyyyy". (63498398 выбрано по броску костей).

3 голосов
/ 25 июня 2012

самый короткий полезный алгоритм хеширования будет md5. генерирует 16 байтов = 128-битный хэш. если вы используете кодирование base 64 ... это 6 полезных бит на байт / символ.

Вы должны быть в состоянии уменьшить md5 до 22 символов (ascii). у вас есть шестнадцатеричная версия, где 2 байта представляют один фактический байт

(оставляя задний отступ, введенный b64)

с дополнительным преимуществом использования того же самого для допустимых имен файлов. (Конечно, вам придется заменить символы по умолчанию / и + любым другим символом, который не вступает в противоречие с соглашением об именах файлов вашей ОС.

base64 (путем замены / и +) гарантирует, что ваш хеш не испортит URL со специальными символами, которые могут означать что-то еще для вашего веб-сервера

ASCII85 добавляет символы, с которыми трудно иметь дело при использовании в качестве имен файлов и URL

md5 («Эта строка будет хэширована»)

'37aa3296c523f6c5a7fd2102a9155dcc' (шестнадцатеричный) (32 байта)

raw md5 («Эта строка будет хеширована»)

[55, 170, 50, 150, 197, 35, 246, 197, 167, 253, 33, 2, 169, 21, 93, 204] = (16 байт)

base64 необработанной строки md5

N6oylsUj9sWn_SECqRVdzA ==

Мой последний хэш

N6oylsUj9sWn_SECqRVdzA на самом деле это полный md5 из 22 символов ascii

([вы можете убрать два завершающих = всегда будет два для md5, добавьте их позже при декодировании. Также замените символы + и / в b64 на любые другие, которые я предпочитаю - (тире) и _ (подчеркивание)] *

3 голосов
/ 09 августа 2009

Использовать FVNHash - http://www.codeproject.com/KB/security/FnvHash.aspx

Вы можете установить длину своего хэша, не используйте его по соображениям безопасности .

1 голос
/ 09 августа 2009

эта 32-символьная длинная строка является числом от шестнадцатеричного: 0-f Вы можете сократить его, преобразовав шестнадцатеричное значение в основание 36: 0-z

...