【问题标题】:Django Model Field for a Secure String安全字符串的 Django 模型字段
【发布时间】:2020-07-16 20:21:30
【问题描述】:

简而言之: 我想将加密的字符串存储在数据库中,并在需要时对其进行解密。这方面的最佳做法是什么?

背景: 我正在构建一个使用需要登录名和密码的 3rd 方 API 的应用程序。我想将用于 3rd 方 API 的凭据存储在数据库中,因为它们将是许多不同的凭据。我正在查看 django 文档和 stackoverflow,但我只找到了散列密码的东西。

编辑:我做了更多搜索,我真的很喜欢这个: https://github.com/georgemarshall/django-cryptography

任何人对我发现的存储库有其他想法或意见?

【问题讨论】:

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


    【解决方案1】:

    您应该创建一个自定义模型字段并覆盖from_db_value()get_prep_value 以加密和解密字符串。你可以使用很多包来做加密算法。

    使用密码学,您可以执行以下操作:

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

    注意:您应该抽象加密逻辑以获得更优化的解决方案。

    【讨论】:

      猜你喜欢
      • 2014-02-09
      • 2013-04-13
      • 1970-01-01
      • 2021-03-30
      • 2011-06-28
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多