Любой приличный алгоритм шифрования имеет в качестве одной из основных особенностей тот факт, что невозможно ничего сделать из открытого текста, просто взглянув на зашифрованный текст. Если бы вы могли, просто взглянув на зашифрованный текст, сказать, что открытый текст содержал строку william
, любой злоумышленник сможет получить эту информацию так же легко, и вы, возможно, вообще не будете шифровать.
Единственный способ выполнить такую операцию над данными - это получить доступ к расшифрованным данным. Используя описанную вами модель - где база данных только когда-либо видит зашифрованные данные - для этой базы данных невозможно выполнить эту работу, поскольку база данных не имеет доступа к нужным ей данным.
Вам необходимо расшифровать данные, которые вы хотите найти. Единственный полный способ сделать это - вытащить приложение все из базы данных, расшифровать его, а затем выполнить фильтрацию / сортировку / что угодно в вашем приложении. Очевидно, что это не будет хорошо масштабироваться, но это, безусловно, то, что вы учли, когда решили зашифровать данные перед их помещением в базу данных.
Другой вариант - хранить фрагменты данных в незашифрованном виде. Например, если у вас есть поле first_name
и вы хотите иметь возможность извлекать все записи, где first_name
начинается с a
, укажите поле first_name_first_letter
. Очевидно, что это не будет хорошо масштабироваться - если вы хотите искать все записи, в которых first_name
содержит ill
, вам придется хранить полный first_name
в незашифрованном виде.
Однако в этом решении есть более серьезная проблема: храня незашифрованные данные, вы теряете информацию о зашифрованных данных. Чем больше незашифрованных данных вы храните, тем больше утечек. Чем больше у вас утечек, тем больше у вас остается улик, чтобы злоумышленник смог победить ваше шифрование - плюс, если вы сохранили бит, который им был интересен, в незашифрованном виде, он уже выиграл.