如何在保存到数据库

时间:2016-06-10 06:30:22

标签: django python-2.7 django-models django-admin

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

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,

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 

这里我收到错误,

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功能?

3 个答案:

答案 0 :(得分:4)

你可以用两种可能的方式做到这一点。

  1. 为您的模型编写自定义保存方法

    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/')
    
        def save(self, *args, **kwargs):
            if not self.pk:
                # encrypt_field_value_here
            super(Server, self).save(*args, **kwargs)
    
  2. 您可以使用自定义模型字段。您可以从here获取有关此文档的文档。另请检查here

  3. 中的BaseEncryptedField

    您也可以使用this包。

答案 1 :(得分:0)

我通过使用django-encrypted-fields包解决了这个问题 步骤是:

在项目根目录打开终端和执行命令。

  1. 安装包django-encrypted-fields

    $ pip install django-encrypted-fields
    
  2. 创建一个基本的keyczar键集。在这种情况下,AES-256。

    $ mkdir fieldkeys
    $ keyczart create --location=fieldkeys --purpose=crypt
    $ keyczart addkey --location=fieldkeys --status=primary --size=256
    
  3. 在settings.py中添加设置

    ENCRYPTED_FIELDS_KEYDIR = os.path.join(BASE_DIR, 'fieldkeys')
    
  4. 现在位于models.py

    from django.db import models
    import encrypted_fields
    class Server(models.Model):
        password = encrypted_fields.EncryptedCharField(max_length=500)
    
  5. 有关详细信息,请访问here

    希望这将有助于将来的某个人

答案 2 :(得分:0)

对于密码字段,django使用自己的散列。你仍然可以改变它。

django中的加密方法很少。您可以像AES那样使用它们。它可以从加密密码导入。

否则,您可以使用默认的django签名者。点击链接

https://docs.djangoproject.com/en/1.9/topics/signing/