2017-06-18 2 views
0

Je possède ce code source en Ruby:Où stock-clé utilisée pour la génération de jetons dans le courrier électronique de confirmation

Ruby code

Je suis en train de construire une classe à peu près semblable. Je possède ce point final:

@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) 

Ce envoyer un email avec un lien, y compris un jeton généré en utilisant cette classe:

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 

Et j'avoir un autre point de terminaison qui est supposé déchiffrer le jeton généré précédemment:

@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) 

Je ne sais pas vraiment où stocker ma clé dans mon environnement flacon, ni où la clé est le magasin dans le code Ruby.

Pourriez-vous me dire quelle est la meilleure et la plus sûre façon de stocker ma clé?

EDIT:

je le flux suivant:

  1. L'inscription utilisateur en complétant: prenom, email sur/register_account
  2. Je Crypter via une clé symétrique JSON: { » first_name ": prénom," email ": email} (il me donne un jeton URL_SAFE
  3. J'envoie à l'utilisateur par email un lien/registre/
  4. Lorsque l'utilisateur clique sur l'e-mail, nous récupérons le jeton dans l'URL décryptez-le en utilisant la même clé symétrique précédente et pré-remplissez le champ prénom et e-mail, puis l'utilisateur peut remplir les champs comme mot de passe etc.
  5. Nous stocker l'utilisateur

Ma question est comment puis-je stocker la clé symétrique utilisée dans mon processus de chiffrement/déchiffrement?

+0

Avec store, vous voulez dire une couche de persistance ou seulement dans la session de la requête en cours? –

+0

@LuisOrduz I modifier ma question pour être moire spécifique – mel

Répondre

1

Je suggère d'ajouter deux champs à votre table utilisateur,

  1. verfied
  2. verified_token

Enregistrez votre jeton généré à verified_token. Et lorsque l'utilisateur vérifie l'adresse e-mail, définissez verified sur true.

+0

Je ne veux pas enregistrer l'utilisateur dans ma base de données s'il n'a pas confirmé son compte. Donc mon flux est comme: l'inscription de l'utilisateur avec son prénom et son email, je crypte le JSON résultant avec une clé symétrique et j'en génère un jeton. Le jeton est envoyé dans un lien par email. L'utilisateur clique sur le lien puis le jeton dans l'URL sera décrypté à l'aide de la clé symétrique précédente, pour remplir le champ prénom et email, puis l'utilisateur pourra remplir d'autres champs comme mot de passe etc .. lorsque l'utilisateur poste cette demande. Je crée un compte. Ma question est de savoir comment stocker la clé symétrique. – mel

+0

Je modifie ma question pour être plus précis – mel