Как легко добавить пароль в приложение Windows Forms на C #?

Как я могу легко добавить пароль из Textbox.Text?

Есть ли в .NET framework какие-то встроенные волшебства?


person Sergio Tapia    schedule 17.06.2010    source источник
comment
вы можете легко использовать этот encrypto.codeplex.com   -  person Omu    schedule 14.09.2010


Ответы (5)


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

Использование пароля: передовой опыт?

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

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

Вот небольшой фрагмент, который будет работать на C #:

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buffer = new byte[1024];

rng.GetBytes(buffer);
string salt = BitConverter.ToString(buffer);
var saltedPassword = password + salt;

or...

var salt = Guid.NewGuid().ToString();
var saltedPassword = password + salt;
person Randolpho    schedule 17.06.2010
comment
Если вы генерируете случайные соли, не забывайте их держать, так как они понадобятся вам для расшифровки на выходе. - person Adam Houldsworth; 17.06.2010
comment
@ Адам: хороший момент. Изначально у меня было предложение на этот счет, но, видимо, я его отредактировал. Я вставлю обратно. - person Randolpho; 17.06.2010

Я полагаю, вы запрашиваете имя пользователя вместе с паролем?

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

Лично используйте следующий код:

byte[] GetSaltedPasswordHash(string username, string password)
{
    byte[] pwdBytes = Encoding.UTF8.GetBytes(password);
    // byte[] salt = BitConverter.GetBytes(userId);
    byte[] salt = Encoding.UTF8.GetBytes(username);
    byte[] saltedPassword = new byte[pwdBytes.Length + salt.Length];

    Buffer.BlockCopy(pwdBytes, 0, saltedPassword, 0, pwdBytes.Length);
    Buffer.BlockCopy(salt, 0, saltedPassword, pwdBytes.Length, salt.Length);

    SHA1 sha = SHA1.Create();

    return sha.ComputeHash(saltedPassword);
}
person Regent    schedule 17.06.2010

Вот хорошая статья и еще один (более адаптированный для приложений ASP.NET).

person Darin Dimitrov    schedule 17.06.2010
comment
Вторая статья лучше, так как допускает произвольный размер соли. Первый рекомендует 4-байтовую соль; определенно путь к малому. Соли должны быть долгими. Я не критикую вас, просто помещаю это здесь для потомков. :) - person Randolpho; 17.06.2010

Здесь нет волшебства, соль - это просто какой-то случайный текст, добавленный к паролю, чтобы отразить атаки по словарю - придумайте свой собственный треп.

person Adam Houldsworth    schedule 17.06.2010

Взгляните на функции hmac, такие как hmacdm5, hmacsha1 или hmacsha256. Посмотрите также на пространство имен System.Security.Cryptography.

person tanascius    schedule 17.06.2010