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



我正在构建一个项目,我将能够保存一个 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 使用,因此需要由该脚本解密。

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

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

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

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

此解决方案可保护您免受数据库泄漏和 Web 服务器入侵的影响 (嗯,有点,正确设置所有必需的东西并非易事 即便如此,像《心血》这样的漏洞偶尔也会出现......

尽管如此,worker脚本仍然需要使用解密的API密钥,所以这是你的弱点。 无论系统的其他部分多么安全。

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

最新更新