django python models AES pycrypto 自动加解密

本文介绍了如何利用Django Models的get_prep_value和to_python方法,自定义AesField来实现数据存取时的AES加密和解密。通过安装pycrypto库,创建AesField类并重写相关方法,可以实现模型字段的自动加解密,确保敏感信息的安全存储。
摘要由CSDN通过智能技术生成

使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值