Как я могу хранить конфиденциальные данные в проекте Django? - PullRequest
0 голосов
/ 04 июня 2019

Я строю проект, в котором я смогу сохранить ключ API, затем этот ключ будет использоваться для выполнения некоторых операций на моем сайте с внешнего бота Python.

Очевидно, что никто не долженполучить доступ к ключу, кроме моего кода, который будет выполнять некоторые задачи с использованием этих ключей.

В настоящий момент ключи хранятся в моей базе данных и не зашифрованы, но теперь я хотел бы сделать эту систему максимально безопасной, чтобы даже если кто-то имел доступ к моим учетным данным, онЯ не могу его использовать.

Проблема в том, что я очень мало знаю о безопасности и защите.Моей первой мыслью было зашифровать ключи, но я не знаю, как это сделать.

По сути, так оно и должно работать: ключи отправляются с использованием формы -> ключи должны быть зашифрованы и сохранены в моей БД -> позже, когда мне нужно выполнить задачу, эти ключи должны бытьрасшифровывать, чтобы сделать то, что мне нужно

Правильно ли подходит мой подход?И как я могу сделать это в Джанго?

Вот мой текущий взгляд:

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, который будет выполнять некоторые операции, поэтому они должны быть расшифрованы этим сценарием.

1 Ответ

0 голосов
/ 04 июня 2019

Вот как я бы подошел к проблеме (, но учтите, что это зависит от ваших конкретных обстоятельств / требований / и т. Это может быть излишним или совершенно безответственным подходом! Я просто размышляю здесь вслух. ).

Если вы шифруете ключи API в базе данных с помощью симметричного шифрования, тогда любой злоумышленник, которому удастся скомпрометировать веб-сервер, получит доступ к ключам шифрования (потому что приложение имеет к ним доступ) и поэтому сможет расшифровывать ключи API. Тем не менее, это защитит вас, если, например, произошла утечка резервных копий базы данных, но не ключа шифрования. (Я предполагаю, что шифрование выполняется правильно, что, как показывает жизнь, является отдельной проблемой!)

Вероятно, лучшим решением (но труднее реализовать правильно) будет использование асимметричного шифрования а затем отделите веб-сервер от рабочего скрипта.

В частности, веб-сервер может шифровать ключи API с помощью открытого ключа. и сохранить их в базе данных. Затем рабочий скрипт работает под другим пользователем (или лучше, на отдельной машине) может расшифровать их с помощью закрытого ключа это не известно и не доступно веб-серверу.

Это решение защищает вас от утечек базы данных и взломов веб-сервера. (ну, вроде, это не тривиально, чтобы правильно установить все необходимые вещи и даже тогда появляются такие уязвимости, как Heartbleed ...).

Тем не менее, рабочий скрипт должен использовать ключи API, расшифрованные, так что это ваше слабое место независимо от того, насколько безопасны другие части системы.

Существуют также специальные решения для секретного управления, такие как Vault , но даже если вы используете их и правильно защитите все настройки, рабочий скрипт останется вашим слабым местом.

...