Лучшие практики для шифрования и дешифрования паролей? (C#/.NET)

Вот простой ответ, использующий только bash:

while read DNS IP; do
  DDD=$(dig +short "$DNS")
  if [ "$DDD" = "$IP" ]; then
    echo "'$DDD' and '$IP' match."
  else
    echo "'$DDD' and '$IP' do not match."
  fi
done < all.log

Имейте в виду, что команда dig +short NAME может вернуть более одной строки в результате, и в этом случае скрипт не будет работать ...

21
задан John Topley 24 April 2009 в 08:53
поделиться

9 ответов

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

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

13
ответ дан 29 November 2019 в 21:24
поделиться

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

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);

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

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

7
ответ дан 29 November 2019 в 21:24
поделиться

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

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

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

6
ответ дан 29 November 2019 в 21:24
поделиться

Because you are using WinForms and .Net, your code is going to be visible in MSIL - even if obfuscated, and therefore your decryption code is visible.

Who are you trying to hide the password from? Is the user of the app not supposed to know the password?

I think you are going to need to do some user validation, and I would be tempted to put keys to the decryption in a separate database and provide some other mechanism to get that out which should require authentication. That way you can get the decryption code out of the winforms app.

I would also suggest a separate service which runs to regularly change the encryption decryption keys and updates all passwords in the database.

2
ответ дан 29 November 2019 в 21:24
поделиться

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

AES более известен как Rijndael в c #

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

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

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

Или есть System.Security. Криптография. Защищенные данные, которые кто-то предложил.

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

1
ответ дан 29 November 2019 в 21:24
поделиться

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

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

0
ответ дан 29 November 2019 в 21:24
поделиться

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

0
ответ дан 29 November 2019 в 21:24
поделиться

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

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

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

0
ответ дан 29 November 2019 в 21:24
поделиться

Я только что реализовал нечто подобное для хранения пароля, вводимого пользователем. Я преобразовал зашифрованный результат в строку с кодировкой base 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;
    }
}
1
ответ дан 29 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: