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


Answers

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

Question

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

дублировать

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

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

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




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




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

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




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




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

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

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

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

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

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

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

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




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

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

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




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

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