2016-06-10 121 views
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/') 

到現在我看很多博客和帖子,但我還沒有找到任何好的辦法來保存加密的文本數據庫

我試圖此方法,但它也沒有爲我工作,請檢查下面我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功能?

回答

0

我解決它通過使用Django的加密領域的軟件包 步驟是:

項目的根目錄打開終端上執行命令。

  1. 安裝包Django的加密領域

    $ 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) 
    

瞭解更多詳情,請訪問here

跳e這將幫助未來的某人

3

您可以通過兩種可能的方式來實現。

  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

檢查BaseEncryptedField您還可以使用this包。

0

對於密碼字段,django使用自己的哈希。你仍然可以改變它。

django中幾乎沒有加密方法。你可以像AES一樣使用它們。它可以從加密密碼導入。

否則您可以使用默認的django簽名者。點擊鏈接

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