Хранение ключей шифрования - лучшие практики?



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



Как бы вы хранили секретный ключ и вектор инициализации? Хранение в виде литерала в коде кажется плохой идеей. Как насчет настроек приложения? Какая здесь лучшая практика?

1134   5  

5 ответов:

один стандартный подход в мире веб-приложений состоит в том, чтобы разделить ключ и поместить его в разные места. Например, вы можете разделить ключ и поместить его часть в файловую систему (вне каталога "webapps"), часть его в конфигурации JNDI (или эквивалент .net) и часть его в базе данных. Получение какой-либо одной части не особенно сложно, если вы скомпрометированы, например, изучение резервного носителя или SQL-инъекции, но получение всех частей потребует намного больше работа.

вы можете разделить ключ, XOR - ing его со случайными числами того же размера. (Используйте криптографически сильный генератор случайных чисел!) Вы можете повторить этот процесс несколько раз, если вы хотите разделить ключ на несколько частей. В конце процесса вы хотите, например, три частичных ключа, таких что p1 ^ p2 ^ p3 = ключ. Возможно, Вам потребуется base64-кодировать некоторые из частичных ключей, чтобы их можно было правильно хранить, например, в свойстве JNDI.

(больше сложные способы разделения ключа, например, алгоритм n-of-m, где вам не нужны все части для воссоздания ключа, но это далеко за пределами того, что вам нужно здесь.)

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

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

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

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

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

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

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

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

вставьте его в сеть.config и зашифровать раздел

это так вопрос говорит больше о web.шифрование конфигурации

Это должно помочь ...

http://msdn.microsoft.com/en-us/library/ms998280.aspx

но вы действительно должны рассмотреть возможность перехода на PKI, если вы серьезно относитесь к защите своих данных.

Comments

    Ничего не найдено.