Skip to content

Instantly share code, notes, and snippets.

@georgefs
Last active December 23, 2015 03:39
Show Gist options
  • Select an option

  • Save georgefs/6574547 to your computer and use it in GitHub Desktop.

Select an option

Save georgefs/6574547 to your computer and use it in GitHub Desktop.
simple django 16 byte aes field
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