[C#] Как зашифровать пароль для его сохранения позже в базе данных или текстовом файле?



Answers

BCrypt - мощное шифрование паролей для .NET и Mono

Question

Я хочу, чтобы мое приложение сохраняло пароль, зашифрованный в базе данных или в текстовом файле. Как я могу это сделать, предполагая, что база данных или текстовый файл может быть открыт кем-либо?

дублировать

Шифрование / Хеширование простых текстовых паролей в базе данных

Не дублируем. Я прошу указать код для .NET.

EDIT: я сохраняю пароль для последующего использования. Мне нужно его расшифровать и использовать для входа. Он не должен быть супер безопасным, он просто должен быть нечитаемым для человеческого глаза и трудно декодировать с помощью тривиального скрипта.




Вот строковая статья шифрования с примером кода .NET.

http://www.devarticles.com/c/a/VB.Net/String-Encryption-With-Visual-Basic-.NET/3/

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




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

Причина того, что не используется двухстороннее шифрование, заключается в том, что нельзя расшифровать свой ключ, поскольку хорошая хэш-функция имеет коллизии.




Исходя из вашего вопроса, я вижу два подхода в зависимости от того, почему вы храните пароль.

О. Если вам нужно только пройти аутентификацию, используя свой пароль, и ничего больше.

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

  1. Убедитесь, что соединение зашифровано при передаче пароля от клиента на сервер. Это предотвратит его обнюхивание. Это довольно сложно делать с веб-приложениями, так как веб-сервер делает тяжелую работу для вас. Если это не так много, и это вопрос другого вопроса.

  2. Выберите надежный алгоритм хеширования для предотвращения столкновения. Я бы рекомендовал SHA-256, даже если он дает больший результат, чем SHA1 или MD5. Ссылка от Microsoft на использование их реализации алгоритма здесь .

  3. Солить пароль для предотвращения атак с использованием радуги (например, поиск пароля в большой таблице с предварительно вычисленным хешем и связанный с ним пароль в виде открытого текста). Ответ здесь (помеченный в вашем вопросе) дает хороший псевдокод в Python о том, как это сделать. Здесь также есть хороший пример .NET-кода.

B. Если вам нужно иметь возможность читать пароль для каждого пользователя для других целей, кроме аутентификации пользователя.

Этот случай прост, если мы говорим только о хранении пароля (или любой важной информации) на одном компьютере (сервере). Если это так, использование Microsoft Data Protection API было бы хорошим решением, поскольку оно привязано к этому компьютеру и (в зависимости от того, как вы работаете), пользователь, под которым работает ваше приложение, и заботится о худшем из ваших работ (создание, хранение и использование ключей). Здесь вы можете найти ссылку на код от Microsoft. Если вам это нужно в более чем одной системе и вы не хотите вводить пароль для каждой системы, которую вы устанавливаете в своем приложении, тогда все становится намного сложнее, потому что вам нужно много реализовать с нуля. Это было бы предметом другого вопроса, который я бы подумал.




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




Как ocdecio, я бы использовал TripleDes, я бы также сохранил соль в базе данных. Ключ для меня обычно жестко закодирован, но соль должна изменяться для каждого зашифрованного элемента.




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

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




Links