Подтвердить что ты не робот

Рекомендации по шифрованию и расшифровке паролей? (С#/. NET)

Мне нужно сохранить и зашифровать пароль в файле (желательно текстовом), который позже мне нужно будет расшифровать. Пароль используется для другой службы, которую я использую, и ее необходимо отправить туда в текстовом виде (через SSL). Это не то, что я могу изменить. Каковы наилучшие практики в этой области? Как можно добиться некоторой степени защиты пароля от вредоносных пользователей?

Моя платформа - это WinForms с С#/.NET 3.5.

Спасибо.

4b9b3361

Ответ 1

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

То, что я бы рекомендовал, фактически выведет его из контроля пользователей. Например, создайте веб-службу, которая связывается с клиентом и надежно возвращает пароль по запросу. Это также позволяет вам изменить пароль, если это необходимо в будущем, а также предоставить вам способ проверки законных пользователей.

Ответ 2

Почему вам нужно расшифровать пароль? Обычно засоленный хэш пароля сохраняется и сравнивается. Если вы зашифруете/дешифруете пароль, у вас есть пароль как обычный текст, и это опасно. Хэш должен быть солен, чтобы избежать дублирования хэша, если некоторые пользователи имеют одинаковые пароли. Для соли вы можете взять имя пользователя.

HashAlgorithm hash = new SHA256Managed();
string password = "12345";
string salt = "UserName";

// compute hash of the password prefixing password with the salt
byte[] plainTextBytes = Encoding.UTF8.GetBytes(salt + password);
byte[] hashBytes = hash.ComputeHash(plainTextBytes);

string hashValue = Convert.ToBase64String(hashBytes);

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

Совет. Никогда не храните и не отправляйте пароль незашифрованным. Если вы получите новый пароль, зашифруйте как можно скорее!

Ответ 3

System.Security.Cryptography.ProtectedData в сборке System.Security использует некоторые API Windows для шифрования данных с помощью пароля, который он знает.

Возможно, это будет иметь сервис Windows, который фактически выполняет операцию, требующую пароля. Приложение, которое пользователь взаимодействует с вызовами в службу через удаленный доступ или WCF. Пока служба, использующая DataProtectionScope.CurrentUser и пользователь службы отличается от зарегистрированного пользователя, пароль должен быть довольно безопасным.

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

Ответ 4

Поскольку вы используете WinForms и .Net, ваш код будет отображаться в MSIL - даже если он запутан, и, следовательно, ваш код дешифрования будет виден.

С чего вы пытаетесь скрыть пароль? Пользователь не должен знать пароль?

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

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

Ответ 5

Зашифрованный в AES, если вы должны сохранить его в текстовом файле.

AES лучше известен как Rijndael в С#

http://www.obviex.com/samples/Encryption.aspx

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

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

Или существует System.Security.Cryptography.ProtectedData, что кто-то еще предложил.

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

Ответ 6

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

Из вашего вопроса кажется, что ваш злонамеренный пользователь фактически использует ваше приложение, так что это приведет только к запутыванию. Хотя никакой ключ не будет обнаружен с помощью Reflector, обычный текст будет отображаться в отладчике.

static byte[] entropy = { 65, 34, 87, 33 };

public string Password
{
    get
    {
        if (this.EncryptedPassword == string.Empty)
        {
            return string.Empty;
        }

        var encrypted = Convert.FromBase64String(this.EncryptedPassword);
        var data = ProtectedData.Unprotect(encrypted, entropy, DataProtectionScope.CurrentUser);
        var password = Encoding.UTF8.GetString(data);
        return password;
    }
    set
    {
        if (value == string.Empty)
        {
            this.EncryptedPassword = string.Empty;
            return;
        }

        var data = Encoding.UTF8.GetBytes(value);
        var encrypted = ProtectedData.Protect(data, entropy, DataProtectionScope.CurrentUser);
        var stored = Convert.ToBase64String(encrypted);
        this.EncryptedPassword = stored;
    }
}

Ответ 7

Не храните пароль как часть кода. Помимо вопросов декомпиляции и использования безопасности через неясность, если вы измените пароль, вам необходимо перекомпилировать и перераспределить ваше приложение.

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

Ответ 8

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

Ответ 9

Поскольку вы должны отправить пароль в незашифрованном виде по сети, вы ничего не можете сделать, чтобы защитить его на 100%.

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

Такая защита паролей достаточно хороша, чтобы предотвратить случайный выбор, а не предотвращать расшифровку proffesionals.