Как легко посолить пароль в приложении формы C # windows? - PullRequest
7 голосов
/ 17 июня 2010

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

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

Ответы [ 5 ]

10 голосов
/ 17 июня 2010

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

Соль Ваш пароль: лучшие практики?

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

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

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

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

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

или ...

var salt = Guid.NewGuid().ToString();
var saltedPassword = password + salt;
4 голосов
/ 17 июня 2010

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

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

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

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);
}
2 голосов
/ 17 июня 2010

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

0 голосов
/ 17 июня 2010

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

0 голосов
/ 17 июня 2010

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

...