Last active
December 23, 2015 03:39
-
-
Save georgefs/6574547 to your computer and use it in GitHub Desktop.
simple django 16 byte aes field
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from django.db import models | |
| from django.utils.encoding import smart_str | |
| from Crypto.Cipher import AES | |
| import base64 | |
| class AESField(models.TextField): | |
| __metaclass__ = models.SubfieldBase | |
| def __init__(self, key="", iv="", aes_prefix="aes:", *args, **kwargs): | |
| self.key = smart_str(key).rjust(16) | |
| self.iv = smart_str(iv).rjust(16) | |
| self.aes_prefix = aes_prefix | |
| assert len(self.key) == 16, 'key must less then 16 byte string' | |
| assert len(self.iv) == 16, 'iv must less then 16 byte string' | |
| return super(AESField, self).__init__(*args, **kwargs) | |
| def to_python(self, value): | |
| try: | |
| assert value.startswith(self.aes_prefix), 'source' | |
| value = base64.b64decode(value[len(self.aes_prefix):]) | |
| value = self.aes.decrypt(value).strip() | |
| value = base64.b64decode(value) | |
| except: | |
| pass | |
| finally: | |
| return value | |
| def get_prep_value(self, value): | |
| value = base64.b64encode(value) | |
| value = value + " " * (16 - len(value) % 16) | |
| value = self.aes.encrypt(value) | |
| value = "{}{}".format(self.aes_prefix, base64.b64encode(value)) | |
| return value | |
| @property | |
| def aes(self): | |
| return AES.new(self.key, AES.MODE_CBC, self.iv) | |
| try: | |
| from south.modelsinspector import add_introspection_rules | |
| except ImportError: | |
| pass | |
| else: | |
| add_introspection_rules([], ["^fields\.AESField"]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment