首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在数据库保存前加密TextField

如何在数据库保存前加密TextField
EN

Stack Overflow用户
提问于 2016-06-10 06:30:22
回答 4查看 8K关注 0票数 2

在这里,我试图创建模型,在这里我可以保存密码,这里是我的模型:

代码语言:javascript
运行
复制
class Server(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=20, null=True)
    hostname = models.CharField(max_length=50, null=True, blank=True)
    ip = models.GenericIPAddressField()
    ip2 = models.GenericIPAddressField(null=True, blank=True)
    user_name = models.CharField(max_length=20, null=True)
    password = models.TextField(max_length=500, null=True, blank=True)
    ssh_key = models.FileField(null=True, blank=True, upload_to='Keys/')

到目前为止,我读了很多博客和帖子,但我还没有找到在数据库中保存加密文本的好方法。

我正在尝试这个方法,但它也不适用于我,请查看下面的View.py,

代码语言:javascript
运行
复制
from cryptography.fernet import Fernet
class HostCreate(CreateView):
    model = Server
    template_name = 'inventory/host_create.html'
    form_class = HostForm

    # after getting POST data of fields (name, hostname, ip, pass, key) adding user and saving
    def form_valid(self, form):
        host = form.save(commit=False)
        host.user = User.objects.get(pk=self.request.user.pk)
        host.password = self.ecrypt(host.password)
        host.save()
        return redirect('inventory:hosts')

    def ecrypt(self, password): # need password and return cipher password
        key = 'wgjSSyfVKgz0EjyTilqeJSaANLDu7TzHKdpAXUeZPbM='
        cipher_suite = Fernet(key)
        cipher_text = cipher_suite.encrypt(password)
        return cipher_text 

我犯了错误,

代码语言:javascript
运行
复制
Exception Type:     TypeError
Exception Value:    data must be bytes.
Exception Location:     /usr/lib64/python2.7/site-packages/cryptography/fernet.py in _encrypt_from_parts, line 55

密码字段有任何内置django功能吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-06-10 09:37:08

我通过使用django加密的字段包来解决这个问题,步骤如下:

在Project根目录上,打开终端并执行命令。

  1. 安装django包-加密-字段 $ pip install django-加密-字段
  2. 创建一个基本的keyczar键集。在这种情况下是AES-256。 $ mkdir字段键$ keyczart创建-位置=字段键-用途=加密$ keyczart addkey -location=字段键-status=主-size=256
  3. 在settings.py中添加设置 ENCRYPTED_FIELDS_KEYDIR = os.path.join(BASE_DIR,'fieldkeys')
  4. 现在在models.py 从encrypted_fields.EncryptedCharField(max_length=500)导入模型导入encrypted_fields类服务器(models.Model):encrypted_fields=

欲知更多详情,请访问这里

希望这能对将来的人有所帮助

票数 0
EN

Stack Overflow用户

发布于 2016-06-10 08:12:56

你可以用两种可能的方法来做。

  1. 为您的模型编写如下自定义保存方法 类服务器(models.Model):user =models.ForeignKey(用户,on_delete=models.CASCADE) name = models.CharField(max_length=20,null=True)主机名= models.CharField(max_length=50,null=True,blank=True) ip = models.GenericIPAddressField() ip2 = models.GenericIPAddressField(null=True,blank=True) user_name =models.CharField( blank=True )密码=(,,)(,,上传_to=‘Keys/’) def保存(self,*args,**kwargs):如果不是self.pk:# encrypt_field_value_here超级(服务器,自).save(*args,**kwargs)
  2. 您可以使用自定义模型字段。您可以从这里获得这方面的文档。还可以从BaseEncryptedField中查看这里

您还可以使用包。

票数 5
EN

Stack Overflow用户

发布于 2016-06-10 14:18:57

对于password字段,Django使用自己的散列。不过,你可以变化它。

Django中有几种加密方法。你可以像AES一样使用它们。它可以从密码中导入。

否则,您可以使用默认的Signer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37741339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档