Шифрование пароля - PullRequest
3 голосов
/ 24 мая 2011

Я создаю экран входа для приложения в C #.На экране входа в систему я читаю имя пользователя и пароль из базы данных и проверяю правильность введенных имени пользователя и пароля.Мне нужен пароль для шифрования, пока я читаю пароль из базы данных.Может кто-нибудь объяснить, как работает шифрование и дешифрование.

  1. Должен ли я хранить зашифрованное значение в базе данных для чтения.
    column names: username         password 
    
    values:        admin            password
    
  2. Должен ли я хранить зашифрованное значение пароля в другом поле в таблице входа в систему?

Ответы [ 5 ]

14 голосов
/ 24 мая 2011

Во-первых: общий подход теперь заключается в том, чтобы хранить соленый хэш пароля вместо самого обычного текстового пароля (предпочтительнее SHA-1 и лучший алгоритм хеширования, избегайте MD5, потому что он больше не безопасен).Когда пользователь входит в систему, вы пересчитываете хэш входной строки, а затем сравниваете его со строкой, хранящейся в базе данных.

РЕДАКТИРОВАТЬ: почему вы не должны использовать шифрование для пароля?Потому что, когда злоумышленник знает ключ шифрования, все ваши пароли будут открыты (это очень плохо).Если вы используете хеш, он просто может угадать один за другим (и это не легко).В противном случае алгоритмы хеширования, как правило, быстрее, чем шифрование, вы выиграете в производительности.

РЕДАКТИРОВАТЬ: почему вы должны хранить соленый хеш, а не хеш?Поскольку алгоритмы хеширования гарантированы, что если вы хешируете одинаковые строки, результат будет одинаковым.Это может привести к проблеме, заключающейся в том, что, когда злоумышленник увидит те же значения хеш-функции, он может догадаться , что тексты были одинаковыми, и это дает ему возможность получить исходный пароль.

Соль означает, что помимо исходного текста, вы помещаете некоторый случайный текст, и, следовательно, две идентичные строки будут генерировать разные значения хеша

Взгляните на это: http://www.obviex.com/samples/hash.aspx

В случае, если пользователь забыл свой пароль, вы можете использовать функцию сброса пароля, которую используют многие сайты:

  1. Пользователь запрашивает сброс пароля
  2. Письмо содержитна зарегистрированный адрес электронной почты будет отправлена ​​специальная ссылка (включая секретный токен / ПИН-код), позволяющая пользователю сбросить свой пароль.
  3. Случайно созданный пароль будет отправлен пользователю снова, после чего он сможет войти и изменитьего пароль.

ОБНОВЛЕНИЕ 14 мая 2012 г .: Ответ кажется старым и не совсем верным.Люди переходят на более безопасный алгоритм хеширования-шифрования для хранения пароля.Одним из известных решений сейчас является bcrypt, а другим (новым и многообещающим) является scrypt.

Преимущество такого шифрования?Они медленные!Гораздо медленнее, чем алгоритм хеширования.Благодаря мощным графическим процессорам (например, CUDA от nVidia) взломать значение хеш-функции теперь невозможно, а медлительность может усложнить взлом этого шифрования.

Подробнее о bcrypt можно узнать по адресу:http://codahale.com/how-to-safely-store-a-password/

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

1 голос
/ 24 мая 2011

Наряду с данными советами существуют и другие способы защиты паролей:

  1. Одноразовый пароль: несмотря на реализацию хеш-функции с солями, пароли все еще хранятся на жестком диске и являются склоннымибыть сломленным.Таким образом, лучший подход требуется здесь.В отличие от статических паролей, одноразовые пароли меняются каждый раз, когда пользователь входит в систему, и обычно пользователи должны иметь небольшое оборудование, используемое для синхронизации с сервером.В основном существует два типа OTP: (Посещение Безопасная аутентификация с одноразовым паролем )

    • Синхронизация по времени
    • Контрсинхронизация
  2. Использование BCrypt, который использует вариант расписания ключей алгоритма шифрования Blowfish и содержит рабочий фактор, который позволяет определить, насколько дорогой будет хеш-функция.Чтобы ознакомиться с bCrypt, посетите: http://codahale.com/how-to-safely-store-a-password/

В C # вы можете использовать библиотеку BCrypt.Net, которая является портом библиотеки iBCrypt: прочитайте следующую статью, чтобы понять, как получить этои запуск библиотеки в Visual Studio.Net:

Использование BCrypt в приложении .NET - почему это лучше, чем SHA или MD5.

Конечно, естьМного обсуждений об этом алгоритме в SO, ищите и изучайте больше об этом.

0 голосов
/ 24 мая 2011

Реализуете ли вы свой собственный механизм аутентификации? Вы можете использовать уже существующую аутентификацию Microsoft System.Web.Security. Используя класс Membership, вы можете проверить пароль пользователя, не извлекая его из базы данных. Таким образом, вы сможете хранить соленый (зашифрованный) пароль в вашей базе данных. Просто используйте Membership.CreateUser и Membership.ValidateUser. Если вам не нужно (с точки зрения производительности или собственной реализации) использовать существующие реализации и сэкономить время.

0 голосов
/ 24 мая 2011

Пароль должен храниться в базе данных с само зашифрованным значением.И когда пользователь пытается войти в систему, зашифруйте пароль с помощью того же алгоритма, а затем сравните его со значением в дБ.

Md5 обычно используется для шифрования пароля, поскольку его невозможно расшифровать.Если пользователь забывает пароль, он не может восстановить его, но его можно только сбросить.

Надеюсь, это поможет!

0 голосов
/ 24 мая 2011

Вы можете зашифровать пароли разными способами.

Одним из способов является использование шифрования MD5. Позвольте мне показать вам один из методов шифрования, который я использую.

#region Encrypt
public string Encrypt(string simpletext, string keys)
{
    try
    {
        XCryptEngine xe = new XCryptEngine();

        xe.Algorithm = XCrypt.XCryptEngine.AlgorithmType.DES; //DES = Data Encryption Standard

        string cipher = xe.Encrypt(simpletext, keys);
        if (cipher != null)
            return (cipher);
        else
            return null;
    }

    catch (Exception ex)
    {
        throw ex;
    }
}
#endregion

#region Decrypt
public string Decrypt(string simpletext, string keys)
{
    try
    {
        XCryptEngine xe = new XCryptEngine();

        xe.Algorithm = XCrypt.XCryptEngine.AlgorithmType.DES;

        //Console.WriteLine(xe.Decrypt(simpletext, keys));
        simpletext = simpletext.Replace(" ", "+");
        string cipertext = xe.Decrypt(simpletext, keys);
        if (cipertext != null)
            return (cipertext);
        else
            return null;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
#endregion

вам нужно использовать ссылку для XCrypt, чтобы использовать это.

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