【问题标题】:Encrypt django model field using python 3.5使用 python 3.5 加密 django 模型字段
【发布时间】:2016-09-11 01:46:14
【问题描述】:

我希望对我的 django 模型字段之一进行加密。我发现了一些扩展,例如django-encrypted-fieldsdjango_extensions,但它们都使用keyzcar,它用于python 2.7,我用python 3.5 做我的项目。 你们能建议在 3.5 版本的 python 下进行 django 字段加密的简单方法吗?

【问题讨论】:

    标签: django python-3.x encryption django-models


    【解决方案1】:

    解决了django-fernet-fields 扩展的问题。效果很好,它使用来自 django 设置的 SECRET_KEY 。您还可以指定自定义加密密钥。 这是web page

    【讨论】:

      【解决方案2】:

      我通过安装django-fernet-fields 尝试了@Михаил Павлов 解决方案,但它不适用于 Django 3+ 版本。我的工作是创建一个自定义模型,扩展默认 CharField 并使用 Fernet 本机库进行底层加密:

      import base64
      
      from django.db.models import CharField
      from cryptography.fernet import Fernet
      from cryptography.hazmat.backends import default_backend
      from cryptography.hazmat.primitives import hashes
      from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
      from core import settings
      
      
      class SecureString(CharField):
          """Custom Encrypted Field"""
      
          salt = bytes(settings.SECURE_STRING_SALT, encoding="raw_unicode_escape")
          kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), 
                           length=32, 
                           salt=salt, 
                           iterations=100000, 
                           backend=default_backend())
      
          key = base64.urlsafe_b64encode(kdf.derive(settings.SECRET_KEY.encode('utf-8')))
          f = Fernet(key)
      
          def from_db_value(self, value, expression, connection):
              return str(self.f.decrypt(value), encoding="raw_unicode_escape")
      
          def get_prep_value(self, value):
              return self.f.encrypt(bytes(value, encoding="raw_unicode_escape"))
      

      【讨论】:

      猜你喜欢
      • 2014-04-25
      • 1970-01-01
      • 2011-04-12
      • 2011-02-28
      • 2019-01-07
      • 2021-08-24
      • 2012-05-13
      • 2019-01-01
      • 1970-01-01
      相关资源
      最近更新 更多