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

时间:2019-06-03 21:16:48

标签: python django security 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})

这是表格:

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

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

1 个答案:

答案 0 :(得分:0)

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

如果您使用对称加密对数据库中的API密钥进行加密, 那么任何设法破坏Web服务器的攻击者都可以访问加密密钥 (因为该应用有权访问它们),因此可以解密API密钥。 尽管如此,如果例如数据库备份被泄漏,但加密密钥未被泄漏。 (我在这里假设加密已正确执行,正如生活所示,这是一个单独的问题!)

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

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

此解决方案可保护您免受数据库泄漏和Web服务器危害 (嗯,正确地设置所有必需的东西并不容易。 甚至有时还会弹出诸如Heartbleed的漏洞...)。

仍然,工作脚本需要使用解密的API密钥,因此这是您的弱点 不管系统其他部分的安全性如何。

还有一些专用的秘密管理解决方案,例如Vault, 但是即使您使用它们并正确保护了整个安装程序,辅助脚本仍将是您的弱点。