私は長い間検索しましたが、パスワードリセットトークンを作成する方法を完全に説明する記事や投稿は実際には見つかりませんでした。
これまでに知っていること:
よくわからないこと:
crypto.randomBytes
十分ですか?プロセス全体は次のようになると思います。
パスワードリセットトークンは、パスワードとあまり似ていません。これらは短期間で使い捨てであり、最も関連性が高いのは、ここではマシンによって生成され、メモリに記録できないことです。
crypto.randomBytes
で十分です。トークンの長さが十分であることを確認してください。 16バイト(128ビット)程度のものが機能するはずです。あなたの基本的なプロセスは理にかなっています。
1.はい、トークンを生成するには暗号化方式を使用する必要があります。セキュリティに関連することを行うときは常に、暗号のランダム性を使用してください。はい、 crypto.randomBytes
結構です。 16バイトを使用します(少し少なくても問題はありませんが、トークンをクリックまたはコピーアンドペーストするだけでなく、絶対に入力する必要がない限り、リスクを冒さないでください)。 (16バイトは、Base64の24文字または32桁の16進数に変換されます。)
2. SHA-256やSHA-512などの暗号化ハッシュでトークンをハッシュします。ここではパスワードハッシュは必要ありません。bcryptなどのパスワードハッシュは、入力が人間が覚えているパスワードである場合に使用され、入力がランダムに生成された十分に少ない文字列である場合は役に立ちません。パスワードハッシュの使用は少し難しく、処理速度も非常に遅いため、ここでは必要ありません。
3.トークンに情報を追加することに利点はないようです。有効期限やトークンの目的などの情報は、いずれにしてもデータベースに存在する必要があります。