如何在 Django 项目中存储敏感数据?

Jac*_*022 1 python security django django-forms django-views

我正在构建一个项目,在其中我将能够保存 API 密钥,然后该密钥将用于从外部 python 机器人在我的网站上执行一些操作。

显然,除了我的代码将使用这些密钥执行某些任务之外,任何人都不应访问该密钥。

目前,密钥存储在我的数据库中并且没有加密,但现在我想让这个系统尽可能安全,这样即使有人可以访问我的凭据,他也无法使用它。

问题是我对安全和加密知之甚少。我的第一个想法是加密密钥,但我真的不知道该怎么做。

基本上,这就是它应该如何工作:使用表单提交密钥 -> 密钥必须加密并保存在我的数据库上 -> 稍后,当我需要执行任务时,应该解密这些密钥以便执行以下操作我需要

我的做法正确吗?我怎样才能在 Django 中实现这一点?

这是我目前的观点:

def homepage(request):
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = ApiForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            send = form.save()
            send.save()
            messages.success(request, f"Success")

    else:
        form = ApiForm()

    return render(request,
                  "main/home.html",
                  context={"form":form})
Run Code Online (Sandbox Code Playgroud)

这是表格:

class ApiForm(forms.ModelForm):

    key = forms.CharField(widget=forms.TextInput(
        attrs={
            'placeholder': 'Enter here your api key',
            }
        ), #max_length=9
    )

    secret = forms.CharField(widget=forms.TextInput(
        attrs={
            'placeholder': 'Enter here your secret key',
            }
        ), 
    )


    class Meta:
        model = MyModel
        fields = ("key", "secret")

    def save(self, commit=True):
        send = super(ApiForm, self).save(commit=False)
        if commit:
            send.save()
        return send
Run Code Online (Sandbox Code Playgroud)

请记住,这些 API 密钥将由将执行某些操作的外部 Python scrypt 使用,因此需要由该脚本解密。

Tom*_*ski 6

这是我解决问题的方法(但请注意,根据您的具体情况/要求/等,这可能是一种矫枉过正或完全不负责任的方法!我只是在这里大声思考。)。

如果您使用对称加密对数据库中的 API 密钥进行加密,那么任何设法破坏 Web 服务器的攻击者都将能够访问加密密钥(因为应用程序可以访问它们),因此能够解密 API 密钥。尽管如此,如果数据库备份(但不是加密密钥)泄露,它仍然可以保护您。(我在这里假设加密执行正确,正如生活所表明的那样,这是一个单独的问题!)

一个可能更好的解决方案(但更难正确实现)是使用非对称加密,然后将 Web 服务器与工作脚本分开。

具体来说,Web服务器可以使用公钥对API密钥进行加密并将其存储在数据库中。然后,在不同用户(或者更好的是,在单独的计算机上)下运行的工作脚本可以使用 Web 服务器既不知道也无法访问的私钥来解密它们。

该解决方案可以保护您免受数据库泄漏和 Web 服务器损害(嗯,某种程度上,正确设置所有必需的内容并不简单,即使如此,像Heartbleed这样的漏洞偶尔也会出现......)。

不过,工作脚本需要使用解密的 API 密钥,因此无论系统的其他部分多么安全,这都是您的弱点。

还有专门的秘密管理解决方案,例如Vault,但即使您使用它们并正确保护整个设置,工作脚本仍将是您的弱点。

  • @Jack022 谢谢!如果您有一般性的安全问题,那么 https://security.stackexchange.com/ 可能是提问的地方。这是一个与您类似的问题,在那里问:https://security.stackexchange.com/questions/11242/how-to-encrypt-a-password-stored-in-a-database-need-to-decrypt-later? rq=1 (2认同)