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 使用,因此需要由该脚本解密。
这是我解决问题的方法(但请注意,根据您的具体情况/要求/等,这可能是一种矫枉过正或完全不负责任的方法!我只是在这里大声思考。)。
如果您使用对称加密对数据库中的 API 密钥进行加密,那么任何设法破坏 Web 服务器的攻击者都将能够访问加密密钥(因为应用程序可以访问它们),因此能够解密 API 密钥。尽管如此,如果数据库备份(但不是加密密钥)泄露,它仍然可以保护您。(我在这里假设加密执行正确,正如生活所表明的那样,这是一个单独的问题!)
一个可能更好的解决方案(但更难正确实现)是使用非对称加密,然后将 Web 服务器与工作脚本分开。
具体来说,Web服务器可以使用公钥对API密钥进行加密并将其存储在数据库中。然后,在不同用户(或者更好的是,在单独的计算机上)下运行的工作脚本可以使用 Web 服务器既不知道也无法访问的私钥来解密它们。
该解决方案可以保护您免受数据库泄漏和 Web 服务器损害(嗯,某种程度上,正确设置所有必需的内容并不简单,即使如此,像Heartbleed这样的漏洞偶尔也会出现......)。
不过,工作脚本需要使用解密的 API 密钥,因此无论系统的其他部分多么安全,这都是您的弱点。
还有专门的秘密管理解决方案,例如Vault,但即使您使用它们并正确保护整个设置,工作脚本仍将是您的弱点。
| 归档时间: |
|
| 查看次数: |
3330 次 |
| 最近记录: |