Как правильно хранить ключ шифрования для десктопных приложений?

Недавно увидел статью https://habr.com/ru/company/globalsign/blog/492970/ (кратко взлом относительно старых версий team Viewer, который хранил файлы с паролями в реестре в зашифрованном виде), и задался вопросом, есть ли надежный способ для хранения ключа шфирования (с учетом того, что он должен хранится локально)?
  • Вопрос задан
  • 1322 просмотра
Решения вопроса 2
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Единственный надежный способ - это использовать мастер пароль. Если пароля нет, то любой способ шифрования можно отреверс-инженирить и расшифровать все сохраненные данные точно так же, как это делает сам продукт. Иногда даже разбираться не надо - можно просто выдрать нужные куски кода из продукта и запустить.

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

Главное самостоятельно ничего криптографического не велосипедить. Берите популярные крипто-библиотеки и используйте стандратные и современные криптографические приметивы.

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

Для проверки, что пароль правильный, данные надо снабдить какой то контрольной суммой (до шифрования).

Все остальное - это security through obscurity. Не работает в долгой перспективе.
Ответ написан
Protos
@Protos
Спрашивай - отвечу
Не слушайте этого экс олимпиадника Илью, отмените ответ на вопрос. Вариант безопасно хранить пароль это использовать встроенный TPM модуль материнской платы или внешний функциональный ключевой носитель (eToken, например). Эти средства не позволяют закрытому ключу оказаться вне контейнера т.к. расшифрование и электронная подпись осуществляются внутри этих устройств. Ну есть у тебя мастер пароль, это всего лишь один этап для злоумышленника. Есть еще технологии HSM, даже программные есть. Если же вы хотите хранить локально, то нет смысла его как-то защищать кроме мониторинга обращения к контейнеру с паролем и клбча в реальном времени. Обратился не тот процесс - пк вырубается либо вы выбегаете с кочергой и бежите бить злоумышленника
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@none7
Пароли в принципе нельзя хранить, ни на диске, ни в памяти, ни к чему хорошему это не приводит. Даже мастер-пароли могут украсть во время их ввода и обработки. Но справедливости ради сервера хранят секретные ключи, чтобы мы могли к ним подключится с шифрованием. Они всего лишь уповают на разграничение привилегий операционной системой. Но если другая программа запущена с привилегиями Вашем программы или более высокими или злоумышленник имеет физический доступ к Вашему железу, то они могут прочесть все ваши секреты. Но на Windows или Android это разграничение бесполезно, на первой куча мусора исполняется с максимальными привилегиями, а на второй дыры не закрывают вообще и только самоё свежее железо в состоянии хранить секреты.
Безопасность это комплекс мер и простым действиями на уровне программы её не обеспечить.
Ответ написан
Jump
@Jump
Системный администратор со стажем.
Да как угодно.
В вашем случае ключ шифрования это по сути просто ценная информация, утечка которой критична.
Не храните ее на компьютере, если храните то зашифруйте, и компьютер от сети отключите.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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