2012-06-28 2 views
0

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

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

+0

Если вы используете шифрование для защиты пароля, вы делаете это неправильно. –

ответ

4

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

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

Посмотрите на this article. Он в значительной степени охватывает все базы, но не использует SHA-1, как рекомендовано в статье. Вы хотите медленную хеш-функцию, которая является дорогостоящей вычислительной, такой как BCrypt, или PBKDF2 (которая включена в .NET). См. "What makes a good hash function for passwords". (Спасибо @CodeInChaos за то, что указали это).

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

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

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

+0

Спасибо, я посмотрю – Ostorlabi

+0

-1, потому что код в статье слаб. Единая итерация SHA1 просто слишком быстрая. – CodesInChaos

+0

@CodeInChaos спасибо, отредактирован, чтобы рекомендовать BCrypt вместо этого. – idlemind

-1

Вам необходимо сохранить хешированный пароль и соль в базе данных. Используйте случайную соль для каждого пользователя (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. Войти с помощью таблицы с пользователем данные!
+0

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

+0

@Ostorlabi Я объяснил концепцию этого в ответе. –

+0

-1 для использования одного итерационного хеширования. Используйте PBKDF2, bcrypt или scrypt. – CodesInChaos