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

У меня есть этот исходный код в ruby:

Рубиновый код

Я пытаюсь построить примерно такой же класс. У меня есть эта конечная точка:

@register_endpoint.route('/', methods=['POST'])
def process_signup_form():
    form = InitializeAccountForm(request.form)
    if form.validate_on_submit():
        email = form.email.data
        first_name = form.first_name.data
        # TODO add exception if the email doesn't land
        response = verify_email_account(first_name, email)
        return render_template("auth/register.html", form=form)
    else:
        return render_template("auth/register.html", form=form)

Это отправляет письмо со ссылкой, включающей токен, созданный с использованием этого класса:

class SecureMessage:

    def __init__(self):
        self.key = nacl.utils.random(nacl.secret.SecretBox.KEY_SIZE)

    def encrypt(self, message):
        if message:
            box = nacl.secret.SecretBox(self.key)
            cypher_text = box.encrypt(bytes(message, "utf-8"))
            encoded_cypher_text = base64.urlsafe_b64encode(cypher_text)
            return encoded_cypher_text
        else:
            return None

    def decrypt(self, token64):
        if token64:
            token = base64.urlsafe_b64decode(token64)
            box = nacl.secret.SecretBox(self.key)
            decrypted_token = box.decrypt(token)
            return decrypted_token
        else:
            return None

И у меня есть другая конечная точка, которая должна расшифровать ранее сгенерированный токен:

@register_endpoint.route('/<string:token>', methods=['GET'])
def display_register_form(token):
    error = None
    decrypted_token = SecureMessage().decrypt(token)
    form = RegisterAccountForm(decrypted_token)
    return render_template("auth/register.html", form=form, error=error)

Я действительно не знаю, где хранить свой секретный ключ в моей среде фляги, ни где ключ хранится в коде ruby.

Не могли бы вы сказать мне, каков наилучший и безопасный способ хранения моего ключа?

РЕДАКТИРОВАТЬ:

У меня есть следующий поток:

  1. Регистрация пользователя путем заполнения: имя_почты, адрес электронной почты / register_account
  2. Я шифрую с помощью симметричного ключа JSON: {"first_name": first_name, "email": email} (это дает мне токен URL_SAFE
  3. Я отправляю пользователю по электронной почте ссылку / зарегистрироваться /
  4. Когда пользователь нажимает на электронное письмо, мы получаем токен в URL-адресе, расшифровываем его, используя тот же предыдущий симметричный ключ, и предварительно заполняем поле имени и адреса электронной почты, затем пользователь может заполнить поля, такие как пароль и т. Д.
  5. Мы храним пользователя

У меня вопрос, как я могу сохранить симметричный ключ, используемый в моем процессе шифрования / дешифрования?

1 ответ

Я бы предложил добавить два поля в вашу пользовательскую таблицу,

  1. verfied
  2. verified_token

Сохраните сгенерированный токен в verified_token, И когда пользователь проверяет адрес электронной почты, установите verified в true,

Другие вопросы по тегам