Django有没有提供加密所有/至少字段的方法,如auth.User模型的first_name,last_name,email_id,就像它在将PASSWORD字段存入数据库之前加密PASSWORD字段一样?
我的解决方法:
我已经阅读了文档&关于StackOverflow的几个问题,根据它可以继承默认的BaseUser模型&通过定义加密和自定义的自定义字符字段,按照我们想要的方式定义我们自己的myUser模型。解密字符。
问题出在我的应用程序中,我提供了SEARCH选项,可以轻松访问字符字段。如果我加密所有这些Char字段,我很难查询搜索选项。
例如:如果ABCD,ABCDE,ABC是数据库中的字符串&用户希望知道所有具有BC的条目,没有结果弹出。原因是每个ABCD,ABCDE,ABC加密到不同/唯一的字符串(我使用PyCrypto提供的AES加密)。 BC也被加密为一些唯一的字符串,它与ABCD,ABCDE,ABC之间没有相似之处(显然我使用AES算法,密钥长度为32)。我写的查询就像
MyModel.objects.filter(first_name__icontains='BC')
不会返回任何结果。 (是的,我希望搜索不区分大小写。)
[注意:我在自定义字段中添加了所有必需的方法,如“to_python”,“get_db_prep_value”,也尝试了查找方法。但是,实际问题是每个字符串都被加密为相同长度的AES中的唯一字符]
由于我是Django的新手,我的问题可能不像Django开发人员那样。我想知道上述两个问题中的任何一个的答案。除非我得到答案,否则我陷入僵局。在此先感谢,但请善待我和他。答案。
答案 0 :(得分:0)
我尝试了很多,如果字段是加密的,则没有找到有用的答案来查询部分匹配。所以我必须在Python中做到这一点(找不到其他方法)。
这项工作只有在我们使用的数据库很小的情况下才能正常工作,否则会带来性能成本。
从数据库中查询所有元组,使用python进行部分匹配。
result = []
temp_result = MyModel.objects.all()
for temp in temp_result:
if query.lower() in temp.first_name.lower():
result.append(temp)
或类似的东西。我知道这是一种粗鲁的查询方式,但对于给定的条件,这只是可用的解决方案。