如何在数据库中保存
问题描述:
在这里,我想创建模式,我可以保存密码之前加密文本字段,在这里我的模型:如何在数据库中保存
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功能?
答
我解决它通过使用Django的加密领域的软件包 步骤是:
项目的根目录打开终端上执行命令。
-
安装包Django的加密领域
$ pip install django-encrypted-fields
-
创建基本keyczar键集。 AES-256在这种情况下。
$ mkdir fieldkeys $ keyczart create --location=fieldkeys --purpose=crypt $ keyczart addkey --location=fieldkeys --status=primary --size=256
-
添加设置在您的settings.py
ENCRYPTED_FIELDS_KEYDIR = os.path.join(BASE_DIR, 'fieldkeys')
-
现在models.py
from django.db import models import encrypted_fields class Server(models.Model): password = encrypted_fields.EncryptedCharField(max_length=500)
了解更多详情,请访问here
跳e这将帮助未来的某人
答
您可以通过两种可能的方式来实现。
-
写自定义的保存方法为你的模型像这样
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)
检查BaseEncryptedField您还可以使用this包。
答
对于密码字段,django使用自己的哈希。你仍然可以改变它。
django中几乎没有加密方法。你可以像AES一样使用它们。它可以从加密密码导入。
否则您可以使用默认的django签名者。点击链接