1

ほとんどの人にとってはかなり一般的なテーマです。Spring + Spring Security + Hibernate +MySQL+などを使用してJavaでWebアプリを構築しています...

「パスワードのリセット」モジュールを実装中です。私はすでにプロセスフローを知っており、すべてのフォームと対応するコントローラーを持っています。コードを書く前に、右足から始めて、それを改善し続けるかどうかを知りたいだけです。

MySQLテーブル

PASSWORD_CHANGE_REQUESTS ( 
       TOKEN VARCHAR(126) NOT NULL,
       USERNAME VARCHAR(50) NOT NULL,         
       CREATION_TIME DATETIME NOT NULL,        
       PRIMARY KEY(TOKEN)          
) 

一部の投稿でEXPIRE_DATEフィールドが推奨されていることを確認しました。それは本当に価値がありますか?

一意のトークン:

ユーザー名+タイムスタンプをパラメーターとして(+必要なソルト値)、92c303b9740da5959418c32d04b6ec6f4ca61637などの文字列を返すSpringSHAエンコーダーを使用しています。

このメソッドは本当にURLの一意のトークンを生成しますか?それともそれを行うためのより良い方法はありますか?

Javaでは、タイムスタンプは次のように生成されます。

 Date date = new Date();
 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy h:mm:ss");
 String timestamp = sdf.format(date);
4

2 に答える 2

2

フィールドEXPIRE_DATEをDBに追加すると言います。1-便宜のために、データベース内の値に対してトークンを検証および妥当性確認するときに、選択を実行して有効性を一挙にチェックするために、EXPIRE_DATEフィールドが必要になる場合があります。2-データベースのクリーンアップでは、スクリプトを実行するだけで、期限切れのレコードを簡単に切り捨てることができます。

現在の時刻と照合することで、アプリケーション層でトークンの有効期限が切れていないことを検証することもできますが、それはもっと面倒なようです。また、DBのクリーンアップは、レコードの有効期限が切れて削除の準備ができているかどうかを判断するために、アプリケーションロジックまたはスクリプトロジックに依存します。

そのSpringHSAエンコーダーは目的に応じて機能するはずですが、その使用は主にパスワードをエンコードすることであり、一意のトークンを生成することではありません。一意のトークンについては、JavaUUIDを確認できます

そして、あなたはここでもっと読むことができます

ランダムな英数字の文字列を生成するにはどうすればよいですか?

HTTPURLトークン標準

于 2013-01-22T20:00:50.060 に答える
1

パスワード変更要求の有効期限は、ハッカーがユーザーの電子メールを制御し、これらのリンクの1つを見つけた場合に役立ちます。ユーザーがシステムでその電子メールアカウントを使用しなくなった場合、少なくとも、リクエストの有効期限が切れている可能性があるため、システムでパスワードがリセットされないように保護されます。明らかに、彼らがあなたのシステムに使用されている電子メールアカウントの制御を取得した場合、彼らは単にリセットを再度要求できるので、有効期限はあまり効果がありません。いずれにせよ、ユーザーに追加のセキュリティを提供するために実行できるのは比較的簡単なことです。

ユニークなトークンを生成するという点では、あなたの戦略はかなり良いと思います。競合するトークンの生成をさらに困難にするために、System.nanoTime()またはのようなものを使用System.currentTimeMillis()して、より正確に時間を取得できます。現在のメソッドは、同じ秒内に呼び出された場合、一意でないトークンを取得することを意味します。これはおそらくまれですが、ミリ秒またはナノ秒の場合はかなり多くなります。

于 2013-01-22T19:30:59.793 に答える