J'ai cherché pendant longtemps et je n'ai jamais vraiment trouvé d'articles ou de messages qui expliquent complètement comment un jeton de réinitialisation de mot de passe devrait être créé.
Ce que je sais jusqu'à présent:
Ce dont je ne suis pas trop sûr:
crypto.randomBytes
assez?J'imagine que l'ensemble du processus ressemblerait à ceci:
Les jetons de réinitialisation de mot de passe ne ressemblent pas beaucoup aux mots de passe. Ils sont de courte durée, à usage unique et - plus pertinent ici - générés par machine et non mémorisables.
crypto.randomBytes
est assez bon, oui. Assurez-vous que le jeton est suffisamment long; quelque chose de l'ordre de 16 octets (128 bits) devrait fonctionner.Votre processus de base est logique.
1. Oui, vous devez utiliser une méthode cryptographique pour générer le jeton. Utilisez toujours l'aléa cryptographique chaque fois que vous faites quelque chose qui est lié à la sécurité. Oui, crypto.randomBytes
c'est bien. Utilisez 16 octets (vous pourriez vous en tirer avec un peu moins, mais ne prenez pas de risques à moins que le jeton ne doive absolument être tapé plutôt que simplement cliqué ou copié-collé). (16 octets se traduisent par 24 caractères de Base64 ou 32 chiffres hexadécimaux.)
2. Hachez le jeton avec un hachage cryptographique tel que SHA-256 ou SHA-512. Vous n'avez pas besoin d'un hachage de mot de passe ici: les hachages de mot de passe tels que bcrypt sont pour quand l'entrée est un mot de passe dont un humain se souvient, et sont inutiles lorsque l'entrée est une chaîne générée aléatoirement de suffisamment moins. Un hachage de mot de passe est un peu plus difficile à utiliser et beaucoup plus lent, et vous n'en avez pas besoin ici.
3. Je ne vois aucun avantage à ajouter des informations dans le jeton. Les informations telles que la date d'expiration et à quoi sert le jeton doivent de toute façon être dans la base de données.