0

我在 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. 用户注册时填写:first_name, email on /register_account
  2. 我使用对称密钥加密 JSON: {"first_name": first_name, "email": email} (它给了我一个 URL_SAFE 令牌
  3. 我通过电子邮件向用户发送链接 /register/
  4. 当用户点击电子邮件时,我们检索 URL 中的令牌,使用之前相同的对称密钥对其进行解密,并预先填写名字和电子邮件字段,然后用户可以填写密码等字段。
  5. 我们存储用户

我的问题是如何存储加密/解密过程中使用的对称密钥?

4

1 回答 1

1

我建议在您的用户表中添加两个字段,

  1. verfied
  2. verified_token

将生成的令牌保存到verified_token. 当用户验证电子邮件地址时,设置verifiedtrue.

于 2017-06-19T05:42:02.143 回答