Защита ключей шифрования в C # - PullRequest
10 голосов
/ 11 марта 2011

Мне известно о многих поставщиках криптографии, доступных в .NET Framework, а также об основных принципах их использования. Это достаточно просто.

Но мое беспокойство таково.

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

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

Итак, как надежно хранить ключ для алгоритма шифрования в разобранном приложении?

РЕДАКТИРОВАТЬ: Так что, если я правильно понимаю оба ответа ниже. Что это означает, что по существу любая реализация (чтобы быть безопасной) требует, чтобы она была только для чтения или только для записи, но никогда не для обоих? Это правильно?

Ответы [ 3 ]

4 голосов
/ 11 марта 2011

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

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

Теперь, если вы все еще хотите пойти по этому пути и хранить конфиденциальные данные без аутентификации, ваш лучший выбор - или, по крайней мере, легкий путь на полпутибезопасный - это, вероятно, DPAPI (см. класс ProtectedData в System.Security.Cryptography).Он будет зашифровывать данные либо ключом машины, либо ключом учетной записи пользователя (вы можете выбрать это).Так что программа, запущенная на другом компьютере или с другой учетной записью пользователя, не может получить к ней доступ.Windows попытается защитить эти ключи, но в действительности любое приложение, работающее на правильном компьютере или с соответствующей учетной записью пользователя, сможет получить доступ к вашим данным.

1 голос
/ 11 марта 2011

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

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

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

0 голосов
/ 11 марта 2011

Существуют различные возможные решения. Один из них использует RSA . В качестве альтернативы вы можете использовать тот же подход, что и в TLS .

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

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