django python models AES pycrypto 自动加解密

充阳秋
2023-12-01

使用Django models 的特性给我们提供方便的AES加密、解密

思路:django Field 在存入 Mysql 时会调用 get_prep_value 方法,从 Mysql 中取数据时会调用 to_python 方法,根据这个逻辑,我们就有方案啦。

1)存数据时加密(重写 get_prep_value方法);
2)取数据时解密(重写 to_python 方法)。

准备

AES 包安装

pip install pycrypto

Example Demo

 

# coding: utf-8
# name: aes_field.py
# date: '2016-12-16'
from Crypto.Cipher import AES
import base64
from django.db import models

__author__ = 'Anlim'


class AesField(models.TextField):
    PADDING = '{'
    block_size = 16
    secret = 'this_is_secret'
    """ 
    model Fields for aes
    """
    #__slots__ = ('coder',)

    def __init__(self, *args, **kwargs):
        self.coder = kwargs.pop("coder", None)
        self.secret = self.pad(self.secret)
        self.cipher = AES.new(self.secret)

        super(AesField, self).__init__(*args, **kwargs)

    def from_db_value(self, value, expression, connection, context):
        return self.to_python(value)

    def to_python(self, value):
        #print "to python"
        # django  get db data
        """ 
        if not value:
            return value
        return self.coder.decode(value)
        """
        #try:
        return self.decode(value)
        #except Exception:
        #    return value

    def get_prep_value(self, value):
        # django 保存数据时会调用
        if not value:
            return value
        if not isinstance(value, str):
            value = str(value)
        return self.encode(value)

    def pad(self, s):
        return s + (self.block_size - len(s) % self.block_size) * self.PADDING     

定义models

from django.db import models
from aes_field import AesField

class UserInfo(models.Model):
      name = AesField(verbose_name='姓名')
      id_card = AesField(verbose_name='身份证号')
      address = AesField(verbose_name='家庭住址')



作者:Anlim
链接:https://www.jianshu.com/p/3edf34a652ef
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

另外还有一个自动加解密方法可参考:

https://www.jianshu.com/p/193fd76e7a96

 类似资料: