Безопасное хранение данных в приложении C# в Windows 10

У меня есть приложение C # - для этих целей оно работает только в Windows 10 - которому необходимо безопасно хранить данные (ключи, пароли, что угодно). Это нужно делать таким образом, чтобы это было недоступно для любого чтения/записи, кроме приложения сам.

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

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


person Nicknow    schedule 16.03.2019    source источник
comment
@KenWhite - это обычный вариант использования. Его можно использовать не только для шифрования диска. docs.microsoft.com/ en-us/окна/безопасность/   -  person Nicknow    schedule 17.03.2019
comment
@KenWhite - я никогда не говорил, что хочу или нуждаюсь в прямом доступе к TPM. Я просто сказал, что его можно использовать не только для Bitlocker (тот факт, что вы сказали, что Crypto API использует TPM, просто доказывает, что у него есть приложения помимо Bitlocker).   -  person Nicknow    schedule 17.03.2019
comment
TPM — это пассивное устройство. Было бы неплохо, если бы он мог проверять подпись вашего приложения перед обработкой запроса, но не может. Ваше приложение может быть измерено в TPM, но Windows пока нет, насколько я знаю. Я думаю, что лучшее, что вы можете сделать, это создать ключ TPM или сохранить что-то в NV RAM, а затем защитить его паролем, о котором знает только ваше приложение.   -  person mnistic    schedule 17.03.2019
comment
Я думаю, вы пытаетесь сломать уловку 22. Что кажется невозможным. Для любого доступа/зашифрованных данных вам нужен ключ. Ключом может быть пароль пользователя, сертификат, аппаратный токен. Если вы поместите один из них в свое приложение, они могут быть реконструированы (кроме токена HW, если он съемный). Попытка хранить ключ в облаке, а ключ доступа к облаку в приложении ситуацию не меняет, просто добавляет слой. Таким образом, пароль пользователя или съемный аппаратный токен — единственный вариант. Кроме того, помните: если учетная запись пользователя скомпрометирована — это их ответственность, но если ваше приложение скомпрометировано — это ваша ответственность.   -  person Max    schedule 17.03.2019
comment
@Max - это ситуация, которую я пытаюсь преодолеть, надеясь, что у них есть какая-то возможность через ОС (Win 10) для защиты данных в приложении. Я могу согласиться с тем, что если ядро ​​​​взломано, все пойдет наперекосяк, но таких взломов немного и они редки (поэтому риск разумен). То, что я описываю, полностью выполнимо ОС - я просто пытаюсь выясните, реализует ли Windows такую ​​возможность, и если да, то как использовать ее из C#/.NET.   -  person Nicknow    schedule 17.03.2019
comment
@Никнау. У меня есть безумная идея (в конце концов, это может оказаться полной ерундой), но что, если вычислить хэш исполняемого файла приложения и использовать его в качестве ключа для стандартного шифрования ОС? Это невозможно, если кто-то может создать другой исполняемый файл с тем же хешем, чтобы прочитать ваши секреты. Но это превращает обновления и отладку в кошмар. Вам нужно найти механизм, позволяющий старой версии расшифровывать старые данные, передавать их в новую версию и сохранять.   -  person Max    schedule 17.03.2019
comment
@Max - Как мне получить исполняемый хэш приложения на C#?   -  person Nicknow    schedule 17.03.2019
comment
@Nicknow, посмотри stackoverflow.com/questions/8875296/. Я также подумал о переносе данных между версиями: вам нужно будет попросить пользователя о помощи - сделать одноразовый резервный пароль и ввести его дважды (3 раза) для резервного копирования (2 раза) и для восстановления на новую версию (1 раз). ).   -  person Max    schedule 17.03.2019