0

Мне нужно тайно скрыть пароль который используется в программе ( внутри кода )
Как безопасно и где хранить пароль?
Если я не могу использовать сторонние серверы ( нельзя использовать по интернету )
Нельзя использовать реестр для хранения данных, ну вот не хочу я его использовать)
Где мне сохранить пароль тогда? В файле? ( Записать в конец файла? )


Я использую шифрование файла по AES-256 ключ по паролю, так же использую pbkdf2
пример:

byte[] key, vector;
private const string Password = "TestPassword";
public static byte[] Salt = new byte[22];
using (var bytes = new Rfc2898DeriveBytes(Password, Salt, 20000))
{
  key = bytes.GetBytes(32);
  vector = bytes.GetBytes(16);
}
Encrypt(@"file", key, vector);

Метод для шифрования:

public static void Encrypt(string filename, byte[] keyencrypt, byte[] vector)
{
  // ...
  using (var aes = new RijndaelManaged())
  {
     aes.Key = keyencrypt;
     aes.IV = vector;
  }
  // ...
}

Password - ничем не зашифрован!
А ведь его могут легко достать, как его зашифровать и где хранить?

ZidoX
  • 660
  • А для чего вам его хранить? Идеальная ситуация -- вообще не хранить, пусть пользователь сам вводит. А вы этим паролем получите нужный токен, который пропадёт при выходе из приложения. – A K Oct 02 '20 at 13:02
  • без ввода пользователя – ZidoX Oct 02 '20 at 13:04
  • 3
    "безопасно" и "хранение" не сочетаемы. ни как. Надо выбрать уровень этой самой "безопасности" от чего вы хотите защитить свой пароль ? Обычно его достаточно просто обфусцировать, что бы в открытом виде не лежал, собрать его например из частей или например из десятичных кодов символов. на этом все. Кому надо будет действительно достать - достанет, вне зависимости от способа шифрования и места хранения – Mike Oct 02 '20 at 13:08
  • @Mike, Это я понял, да его можно достать, но какие есть способы хранить его? – ZidoX Oct 02 '20 at 13:11
  • На вот прямо так в коде, как вы сейчас, например. только не строкой, а из чего нибудь собрать. Или, как вариант хранить как есть, но перед передачей функции шифрования использовать не сам пароль, а функцию от него, например md5. тогда не зная алгоритма уже будет сложно что либо сделать. а разбираться в алгоритме то еще занятие. Или вообще не использовать строку пароля. а взять другие данные из приложения, например подтянуть из ресурсов иконку приложения, чем не пароль и никому в голову не придет что иконка используется не только по прямому назначению – Mike Oct 02 '20 at 13:14
  • @Mike, Понял, подскажите в данном коде передаётся хэш функции пароля в метод? Если нет то как передать не сам пароль а его хэш? – ZidoX Oct 02 '20 at 13:17
  • Вообще сейчас шифрованию передается Rfc2898DeriveBytes от пароля и соли. смотрите описание этой функции. Кстати соль вы сейчас ничем не заполняете, надеюсь там 0 а не случайная каша на момент выполнения – Mike Oct 02 '20 at 13:21
  • byte[] Salt = new byte[22]; - по умолчанию же нулями заполняется? – ZidoX Oct 02 '20 at 13:24
  • Да, нулями заполняется. Console.WriteLine(default(byte)); – aepot Oct 02 '20 at 13:25
  • Мне сейчас просто главное понять/разобраться по передаче хеш функции от пароля, чем шифровать и где хранить. Идея с иконкой прикольная, может воспользуюсь. MD5 смотрю сейчас мало используют, типо устарела функция, за место неё использую SHA256 и.т.д – ZidoX Oct 02 '20 at 13:28
  • 1
    А вообще, пароль для того и создан, чтобы его нигде не хранить. Пользователь ввел - зашифровали данные, пользователь еще раз ввел - расшифровали. – aepot Oct 02 '20 at 13:28
  • 1
    Вот здесь я шифрую и расшифровываю хранилище кук. Но у меня ситуация, что данные потерять можно, а отдать злоумышленнику нельзя. Поэтому мне подошел вариант с ProtectedData.Protect для защиты ключа шифрования, которым шифруются остальные данные. Защищенный ключ пишу прямо в файл. А вектор я вообще в открытом виде храню. При этом данные (если знать как), можно достать только под текущей учеткой пользователя в системе, и больше никак, ну если не взломать защиту Windows DPAPI. – aepot Oct 02 '20 at 13:53

0 Answers0