Один из стандартных подходов в мире веб-приложений - разделить ключ и поместить его в разные места. Например, вы можете разделить ключ и поместить его часть в файловую систему (вне каталога «webapps»), часть в конфигурации JNDI (или эквивалент в .net), а часть в базу данных. Получение какого-либо отдельного фрагмента не особенно сложно, если вы взломаны, например, изучаете носитель резервной копии или SQL-инъекцию, но получение всех фрагментов потребует намного больше работы.
Вы можете разделить ключ, добавив в него случайные числа одинакового размера. (Используйте криптографически сильный генератор случайных чисел!) Вы можете повторить этот процесс несколько раз, если хотите разбить ключ на несколько частей. В конце процесса вы хотите, например, три частичных ключа, таких что p1 ^ p2 ^ p3 = key. Вам может понадобиться закодировать в base64 некоторые из частичных ключей, чтобы они могли храниться должным образом, например, в свойстве JNDI.
(Существуют более изощренные способы разделения ключа, например, алгоритм n-of-m, где вам не требуется, чтобы все части воссоздали ключ, но это далеко от того, что вам нужно здесь.)
Если вы можете потребовать от пользователя активного ввода пароля, существуют алгоритмы PBE (шифрование на основе пароля), которые преобразуют пароль в хороший симметричный ключ. Вы хотите найти тот, который также требует внешнего файла. Опять же, это тот случай, когда резервных копий на магнитной ленте или самого пароля недостаточно, вам нужны оба. Вы также можете использовать это для разделения пароля на две части с помощью JNDI - вы можете использовать незашифрованную фразу-пароль в JNDI и файл инициализации где-нибудь в файловой системе.
Наконец, что бы вы ни делали, будьте уверены, что вы можете легко «переназначить» ваше приложение. Один из подходов заключается в использовании пароля, полученного выше, для расшифровки другого файла, который содержит фактический ключ шифрования. Это позволяет легко сменить пароль, если вы считаете, что он был взломан, без необходимости массового повторного шифрования всех данных - просто зашифруйте ваш фактический ключ.