Создайте зашифрованный пароль и сохраните его в sqlite для использования при аутентификации

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

Любая помощь, пожалуйста?

2 ответа

Решение

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

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

Посмотрите на эту статью. Он в значительной степени охватывает все основы, но не используйте SHA-1, как рекомендовано в статье. Вам нужна медленная хеш-функция, которая требует больших вычислительных затрат, например BCrypt или PBKDF2 (которая включена в.NET). Смотрите раздел "Что делает хорошую хеш-функцию для паролей". (Спасибо @CodeInChaos за указание на это).

Вы можете использовать Rfc2898DeriveBytes в System.Security.Cryptography для создания соленого хэша пароля в стиле PBKDF2.

byte[] salt = Guid.NewGuid().ToByteArray[];
Rfc2898DeriveBytes saltedHash = new Rfc2898DeriveBytes("P@$$w0rd", salt, 1000);

Хорошее практическое правило заключается в том, что количество итераций должно привести к тому, что операция хеширования займет около секунды.

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

Не забудьте добавить using System.Security.Cryptography; Пространство имен.

    public static string ComputeHash(string passwordPlainText, string saltString)
    {
        // Convert plain text into a byte array.
        byte[] saltBytes = Encoding.UTF8.GetBytes(saltString);

        // Convert plain text into a byte array.
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

        // Allocate array, which will hold plain text and salt.
        byte[] plainTextWithSaltBytes =
                new byte[plainTextBytes.Length + saltBytes.Length];

        // Copy plain text bytes into resulting array.
        for (int i = 0; i < plainTextBytes.Length; i++)
            plainTextWithSaltBytes[i] = plainTextBytes[i];

        // Append salt bytes to the resulting array.
        for (int i = 0; i < saltBytes.Length; i++)
            plainTextWithSaltBytes[plainTextBytes.Length + i] = saltBytes[i];

        // Because we support multiple hashing algorithms, we must define
        // hash object as a common (abstract) base class. We will specify the
        // actual hashing algorithm class later during object creation.
        HashAlgorithm hash;

        hash = new SHA256Managed();

        // Compute hash value of our plain text with appended salt.
        byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);

        // Create array which will hold hash and original salt bytes.
        byte[] hashWithSaltBytes = new byte[hashBytes.Length +
                                            saltBytes.Length];

        // Copy hash bytes into resulting array.
        for (int i = 0; i < hashBytes.Length; i++)
            hashWithSaltBytes[i] = hashBytes[i];

        // Append salt bytes to the result.
        for (int i = 0; i < saltBytes.Length; i++)
            hashWithSaltBytes[hashBytes.Length + i] = saltBytes[i];

        // Convert result into a base64-encoded string.
        string hashValue = Convert.ToBase64String(hashWithSaltBytes);

        // Return the result.
        return hashValue;
    }

Ты можешь измениться SHA256Managed для любого другого поддерживаемого алгоритма хеширования.

Обновление: я думаю, что вы должны понять концепцию в первую очередь. Я постараюсь объяснить это:

Перед входом в систему необходимо создать пользователей в вашей базе данных. Для их создания вам понадобится имя пользователя и пароль.

  1. Генерация случайной соли, Guid.NewGuid().ToString(); например.
  2. Теперь вы добавляете эту соль к своему паролю и хешируете результат, смысл этого в том, чтобы повысить безопасность вашего пароля от атак методом перебора. (Этот шаг можно сделать с помощью функции string ComputeHash(string passwordPlainText, string saltString) Я отправил раньше.
  3. Сохраните имя пользователя (предоставленный пользователем), соль (guid) и пароль (результат computeHash) в базе данных.
  4. Авторизуйтесь, используя таблицу с данными пользователя!
Другие вопросы по тегам