Шифрование данных и управление ключами в С#
Какой маршрут взять, какие плюсы и минусы, которые более безопасны.
1) Создание ключа AES, шифровать данные с него, а затем зашифровать ключ AES с RSA, сохранять зашифрованные данные и зашифрованный ключ AES в файл и RSA пары ключей к KeyContainer.
2) Или использовать класс DPAPI ProtectedData для шифрования данных и сохранить его в файл, а затем сохранить энтропию, что я использовал с ProtectedData.Protect()
где-то.. (возможно allso зашифровать его с RSA, хранения ключей RSA для KeyContainer и зашифрованная энтропия в файл с данными?)
EDIT: просто для получения дополнительной информации: нам нужно обеспечить использование файловой системы наших приложений. Таким образом, любой файл, который приложение хранит в файловой системе, мы хотим, чтобы он был зашифрован. Файл, скорее всего, используется одним и тем же приложением или другим компонентом того же стека приложений.
Ответы
Ответ 1
Если вы ищете схему шифрования для защиты данных локальных приложений, то ваш выбор API зависит от того, нужно ли вам передавать зашифрованные данные между разными серверами, использующими одно и то же приложение.
Если только один сервер будет нуждаться в доступе к данным, DPAPI должен быть достаточно хорош для ваших целей. Безопасность обеспечивается учетными данными пользователя, которые в этом контексте будут учетными данными, запускающими стек приложений. Вы можете обеспечить дополнительную энтропию (или "соль" ) жестко закодированную в ваше приложение для повышения безопасности, чтобы она не зависела только от учетных данных конечного пользователя. Это просто реализовать, и вам не нужно иметь дело с экспортом/импортом ключей.
Если нескольким серверам необходимо будет обращаться к тем же файлам/данным, то лучше использовать метод контейнера RSA Key Container. Один и тот же ключ можно экспортировать на несколько серверов, и они могут совместно использовать одни и те же зашифрованные файлы. Ключ также может быть скопирован для целей восстановления. У вас нет такой опции с DPAPI.
Безопасность в одном методе не лучше, чем другая, поскольку они используют аналогичные схемы, и оба ключа в конце защищены учетными данными пользователя. DPAPI использует учетные данные для защиты внутренних ключей RSA, которые он использует, и Windows будет контролировать доступ к контейнерам ключей RSA, используя учетные данные, а также.
Ответ 2
Я использовал DPAPI в прошлом, и это было довольно просто. RSA keypair выглядит для меня довольно ручным. вы можете использовать защиту DPAPI на основе уровня User/Machine.
Ссылка MSDN в DPAPI
Ответ 3
DPAPI ограничивает дешифрование ключом, связанным с машиной или даже с пользователем на этом
машина.
с AES и RSA у вас нет такого ограничения... вы даже можете расшифровать на совершенно другой платформе + здесь вы знаете, как работает система... в отличие от DPAPI
вы, вероятно, захотите посмотреть this
Ответ 4
Извините, но ваш вопрос не содержит достаточной информации, чтобы дать хороший ответ на ваш вопрос. Вы должны больше описать архитектуру своего приложения и структуру данных, которые он использовал.
Является ли приложение службой Windows или EXE-приложением в пользовательском контексте? Кому принадлежат данные, которые вы хотите зашифровать: приложение, пользователь? Доступны ли данные между пользователями? Вы сохраняете данные на локальном жестком диске или на сервере (в смешанном режиме)? Вы сохраняете данные как часть профиля пользователя?
Наиболее важным является вопрос: , где вы планируете удерживать ключ? Проблема в том, что ключ похож на ключ из вашего дома: вы хотите, чтобы только вы (или ваши близкие друзья) имели доступ к ключу, но никто другой. Тем не менее часто можно найти ключ где-то рядом с замком: под ковриком, лежащим у двери. Это делается потому, что есть еще одна проблема: что делать, если ключ будет потерян? Все вопросы являются частью "управления ключами".
DPAPI больше, чем 10 лет. Самое главное, что он помогает сохранить ключ, принадлежащий пользователю, так что пользователь держит ключ автоматически, и зашифрованные данные могут быть дешифрованы на другом компьютере в сети в случае использования перемещаемые профили. Если у вас есть те же требования, DPAPI может дать вам преимущества.
Извините за такой общий ответ, но на мой взгляд, ключ к поиску решения вашей проблемы - это не использовать тот или иной API. Самое главное - управление ключами. Прежде чем приступать к шифрованию данных приложения, вы должны сначала иметь ясное представление о ключевом управлении вашим приложением, включая действия над некоторыми типичными проблемами поддержки.