我正在构建一个项目,我将能够保存一个 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脚本仍将是您的弱点。