我正在构建一个项目,在该项目中我将能够保存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使用,因此它们需要由该脚本解密。
答案 0 :(得分:0)
这是我如何解决此问题的方法(,但请注意,这取决于您的具体情况/要求/等。 这可能是一种矫kill过正或完全不负责任的方法!我只是在这里大声思考。)。
如果您使用对称加密对数据库中的API密钥进行加密, 那么任何设法破坏Web服务器的攻击者都可以访问加密密钥 (因为该应用有权访问它们),因此可以解密API密钥。 尽管如此,如果例如数据库备份被泄漏,但加密密钥未被泄漏。 (我在这里假设加密已正确执行,正如生活所示,这是一个单独的问题!)
一个可能更好的解决方案(但更难正确实施)是使用非对称加密 然后将Web服务器与辅助脚本分开。
具体来说,Web服务器可以使用公共密钥对API密钥进行加密 并将它们存储在数据库中。然后,在另一个用户下运行的工作程序脚本 (或者更好,在单独的计算机上)可以使用私钥对其进行解密 Web服务器既不知道也无法访问的内容。
此解决方案可保护您免受数据库泄漏和Web服务器危害 (嗯,正确地设置所有必需的东西并不容易。 甚至有时还会弹出诸如Heartbleed的漏洞...)。
仍然,工作脚本需要使用解密的API密钥,因此这是您的弱点 不管系统其他部分的安全性如何。
还有一些专用的秘密管理解决方案,例如Vault, 但是即使您使用它们并正确保护了整个安装程序,辅助脚本仍将是您的弱点。