Для шифрования в своей практике использовал шифрование и расшифровку именно на уровне приложения (правда было приложение на nodejs). В базе хранились шифрованные данные и передавались по каналу связи аналогично шифрованные данные. Их расшифровкой и проверкой целостности занималось как раз приложение. Ключ для расшифровки указывался один раз при запуске приложения. Это лишало возможности автономного перезапуска приложения, но как раз давало возможность не хранить ключ в явном виде (в файлах). При "скачивании" зачастую редко делается "дамп" оперативной памяти, на что и была сделана собственно ставка плюс к этому были подключены дополнительные системы мониторинга для ограничения доступа, контроля целостности. Таким образом базу данных можно было хранить хоть в открытом источнике (недовенренном датацентре), а пароль для запуска приложения был составным.
Быстродействие приложения конечно немного просела, но того требовали условия его использования. И да, шифровались только те данные, которые не участвовали в поиске / индексации.