我有以下自定义字段类:
class Binary(models.Field):
__metaclass__ = models.SubfieldBase
def get_prep_value(self, value):
return encryptAES(key, iv_random, str(value))
def to_python(self, value):
return value
def db_type(self, connection):
return 'VARBINARY(900)'
这是我的模特:
class Received(models.Model):
user = models.ForeignKey(User, unique=False, editable=False)
address = Binary(blank=True)
aes_key = Binary(blank=True)
iv = Binary(blank=True)
我正在尝试使用自定义字段类加密/解密数据。当用户提交表单时,get_prep_value方法需要加密数据。在Django Admin界面中,我需要使用to_python方法来解密更改视图中的数据字段。我正在考虑对to_python方法进行以下添加:
def to_python(self, value):
return decryptAES(aes_key?, iv?, value)
我遇到的问题是to_python方法单独循环遍历每个字段的值,而我需要字段本身的值,包括字段aes_key和iv来解密数据。我不知道如何获得aes_key和iv字段,因此问号。
希望这可以解决问题。
答案 0 :(得分:1)
根据您问题的更新,您尝试做的事情并不可行。如果您希望字段能够自动加密/解密,那么执行此操作所需的所有信息必须存储在相应的数据库字段中(请参阅@ DanielRoseman的答案)。如果您的数据库受到损害,这基本上否定了加密的实用性。虽然,我想入侵者仍然需要弄清楚如何正确地将它拼凑起来。
绝对没有办法在多个数据库字段中存储必需的信息,但是有一个字段可以将所有信息一起提取以解密自身。字段是孤立的实体。很明显,它们不允许有关于模型上其他字段的任何信息,因为它们可以用在模型上可能不存在其他字段的地方。
最好的办法是在标准的Django模型字段中存储加密值和解密所需的信息,并使用一种解密值的模型方法,而不是加密值。
答案 1 :(得分:0)
如果key
,iv_random
和name
都需要此字段在进出数据库的路上加密和解密,那么它们不应该是单独的字段完全 - 相反,你应该定义这个Binary
类(可怕的名字,BTW),以便它产生/接受三个值的序列。