【问题标题】:Encrypting a django field (not a password)加密 django 字段(不是密码)
【发布时间】:2021-12-29 01:50:11
【问题描述】:

我有一个用 django 制作的电子商务网站,我想存储订单的详细信息。这些字段将包含 id、购买的东西、数量、总价等。现在我只将它们存储为纯文本,所以我想让它更安全。散列不是一种选择,因为我希望能够读取数据。我虽然关于加密,但还有其他方法吗?如果没有我有几个问题, 如何安全地加密和解密数据 我在哪里以及如何存储加密密钥 是否只有 1 个主密钥?

感谢任何帮助!

【问题讨论】:

  • 到目前为止你尝试过什么?researched
  • 我找到了这个文档pypi.org/project/cryptography。但我不确定我是否应该只为所有内容使用 1 个密钥,或者为每一行提供 1 个密钥。另一件事是我不确定存储密钥的最安全方法是什么。
  • 您可能注意到您的任务实际上包含许多要解决的子任务。在 Stack Overflow 上,每个问题我们只能处理一个问题,希望您尽最大努力自己解决问题。
  • 我已经知道如何加密数据了。我只是不知道存储密钥的最安全方法是什么。
  • 你试过 django-cryptography 吗?

标签: python html css django encryption


【解决方案1】:

这是我加密 Django 模型字段的解决方案 你应该创建一个 EncodedChar 类并像这样使用它:

   from utils.char_encoder import EncodedChar
password = EncodedChar(null=False, blank=False, max_length=256, verbose_name=_('Merchant Password'))

而我的 utils.char_encoder 文件将是:

from django.db import models
import base64
import os
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from django.conf import settings


class EncodedChar(models.CharField):
    salt = bytes(settings.SECURE_STRING_SALT, 'utf-8')
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
                     length=32,
                     salt=salt,
                     iterations=100000,
                     )
    key = base64.urlsafe_b64encode(kdf.derive(bytes(settings.SECRET_KEY,'utf-8')))
    f = Fernet(key)

    def decrypt_value(self, value):
        value = str(self.f.decrypt(bytes(value, 'cp1252')), encoding='utf-8')
        return value

    def get_prep_value(self, value):
        value = str(self.f.encrypt(bytes(value, 'utf-8')), 'cp1252')
        return value

如您所见,我使用cryptography 对 CharField 进行编码和解码,而 PBKDF2HMAC 与 Django 用于散列密码的散列算法相同。您可以根据自己的要求使用任何其他算法。

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多