У меня была такая же проблема, и я создал следующее решение: http://djangosnippets.org/snippets/2489/
Я использовал M2Crypto в качестве механизма шифрования, но при желании его можно заменить.
КакTomTom отмечает, что это просто поднимает планку для злоумышленника, а не делает невозможным враждебное дешифрование - в дополнение к доступу к вашей базе данных, теперь они также должны иметь доступ везде, где вы храните ключевую фразу, которая подается в функцию получения ключа.Однако, отделяя ключ от данных, которые он защищает таким образом, вы по крайней мере теперь имеете возможность дополнительно защитить этот ключ (например, с помощью сервера управления ключами), чтобы поднять планку еще выше.Глубокая защита - это хорошая стратегия, но вам также необходимо решить, какие элементы превышают допустимые для данного приложения.
Также ужасна идея зашифровать любое поле, которое может быть полезно для целей поиска или сортировки (я использую толькоэтот прием для хранения учетных данных OAuth для веб-службы, которая не поддерживает правильные токенизированные подключения OAuth).