Обычный способ сделать это - использовать симметричный ключ шифрования, полученный из пароля пользователя. Стандартный способ сделать это - использовать алгоритм, указанный в RFC2898 , который генерирует набор криптографически защищенных байтов, которые вы можете использовать в качестве ключа и IV. Вероятно, он поддерживается библиотекой для вашего языка, например .NET, которую я использую, имеет класс Rfc2898DeriveBytes .
Конечно, когда ваш пользователь меняет свой пароль, вам придется расшифровать любой существующий текст шифра, а затем получить новый ключ и повторно зашифровать.