Кодировать пароль в MD5 используя ключи - PullRequest
2 голосов
/ 10 сентября 2010

На данный момент я делаю это:

    public static class Crypto
    {
        public static string Encode(string original)
        {
            var md5 = new MD5CryptoServiceProvider();
            var originalBytes = Encoding.Default.GetBytes(original);
            var encodedBytes = md5.ComputeHash(originalBytes);

            return BitConverter.ToString(encodedBytes);
        }
    }

Я слышал, что мне нужно использовать какой-то ключ для кодирования вещей. Нужно ли мне? Это нужно здесь? Как это сделать? <Ч /> Я закончил этим http://encrypto.codeplex.com/ (sha1managed + случайная соль)

Ответы [ 7 ]

6 голосов
/ 10 сентября 2010

то, о чем вы говорите, называется «солью». Это последовательность случайных данных, которые вы добавляете в исходную текстовую строку. Это обычно используется для паролей, предотвращая атаки радужных таблиц / словарей.

Читайте об этом на: http://en.wikipedia.org/wiki/Salt_%28cryptography%29

Для C # есть хорошая статья: http://www.aspheute.com/english/20040105.asp

3 голосов
/ 10 сентября 2010

Вы должны использовать кодировку Base64 для представления. I.e.:

StringBuilder hash = new StringBuilder();

for (int i = 0; i < encodedBytes.Length; i++)
{
    hash.Append(encodedBytes[i].ToString("X2"));
}

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

Пара примечаний (, пожалуйста, прочитайте это ):

  • MD5 - необратимая функция хеширования (и в этом не очень хорошая)
  • Если вы действительно хотите зашифровать пароли, используя шифрование на основе ключей, например AES, не . Используйте метод хеширования, но используйте более сильный. посмотрите на этот ответ здесь для получения дополнительной информации о расширении паролей.

Еще одно замечание: в вашей реализации вы можете получить доступ к интерфейсу IDisposable, т.е.

public static string Encode(string original)
{
    byte[] encodedBytes;

    using (var md5 = new MD5CryptoServiceProvider())
    {
        var originalBytes = Encoding.Default.GetBytes(original);
        encodedBytes = md5.ComputeHash(originalBytes);
    }

    return Convert.ToBase64String(encodedBytes);
}
2 голосов
/ 10 сентября 2010

Поскольку SHA считается более безопасным, чем MD5, я бы порекомендовал использовать его.

byte[] data = new byte[SALT_SIZE+DATA_SIZE];
byte[] result;
SHA256 shaM = new SHA256Managed();
result = shaM.ComputeHash(salt+data);
1 голос
/ 10 сентября 2010

MD5 - это не алгоритм шифрования, а алгоритм хеширования и поэтому не требует ключа. Это также означает, что вы не можете отменить (/ дешифровать) процесс. Хеширование работает только в одном направлении и полезно, когда необходимо сравнить исходные (не хеш-данные) данные с

edit: если вы действительно хотите зашифровать свои данные обратимым способом. Попробуйте взглянуть на шифрование AES, например.

0 голосов
/ 01 февраля 2016

Пример класса:

using System.Security.Cryptography;
using System.Text;

private static string MD5(string Metin)
{
    MD5CryptoServiceProvider MD5Code = new MD5CryptoServiceProvider();
    byte[] byteDizisi = Encoding.UTF8.GetBytes(Metin);
    byteDizisi = MD5Code.ComputeHash(byteDizisi);
    StringBuilder sb = new StringBuilder();
    foreach (byte ba in byteDizisi)
    {
        sb.Append(ba.ToString("x2").ToLower());
    }
    return sb.ToString();
}

MessageBox.Show(MD5("isa")); // 165a1761634db1e9bd304ea6f3ffcf2b
0 голосов
/ 10 сентября 2010

Вот пара моментов, которые более подробно раскрываются в ответе @Kyle Rozendo.

  1. Вам следует избегать использования кодировки по умолчанию Encoding.Default. Если у вас нет веских причин поступать иначе, всегда используйте UTF-8 en / de-coding. Это легко сделать с помощью пространства имен .NET System.Text.
  2. Вывод MD5 является двоичными данными без ограничений и не может быть надежно преобразован непосредственно в строку. Вы должны использовать специальную кодировку, предназначенную для преобразования двоичного вывода в допустимые строки и обратно. @ Кайл Розендо показывает один метод; Вы также можете использовать метод в классе System.Convert.
0 голосов
/ 10 сентября 2010

Я разместил эту ссылку в комментарии к ответу Слэда, но стоит отдельного поста.

http://codahale.com/how-to-safely-store-a-password/

Звучит так, будто вам дали совет засолить хэши паролей (я думаю, вы называете соль "ключом"). Это лучше, чем просто хеш, так как делает ненужными радужные таблицы. Радужная таблица принимает широкий диапазон возможных паролей (например, диапазон паролей, как у радуги диапазон цветов) и вычисляет их хэши md5 заранее. Затем, чтобы развернуть md5, просто посмотрите md5 в таблице.

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

Золотой инструмент для этого - bcrypt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...