ランダムIDに基づいてハッシュを作成したいのですが、そのハッシュは15分間だけ有効でなければなりません。それを行う方法はありますか?
これをフォームの送信に使用しています。不明な送信フォームまたは15分後に送信されたフォームがある場合、作成された時期を把握できますか?
セッションにランダムIDを保存しています。ユーザーがフォームを送信するときに、値を復号化して元のIDと照合します。それが一致し、15分以内または作成時間内にある場合、いくつかの検証を行った後、その値をデータベースに追加します。
あなたが通信する必要があるそのマルチパート情報。
まず、タイムスタンプを提供します。これは、「15分以内に送信された」ことに対して検証するものです。次に、タイムスタンプのハッシュに salt を追加します。ソルトは(サーバー上で)あなただけが知っています。
タイムスタンプが変更された場合、変更されたタイムスタンプ+ saltのハッシュは、ハッシュされた変更されていないタイムスタンプ+ saltと一致せず、フォームの送信を拒否します。
これは次のようになります。
<form ...>
<input type="hidden" name="timestamp" value="2015.07.15.22:17" />
<input type="hidden" name="timehash" value="9BC54D13B43D456D9167DA13F2E8351B" />
...
</form>
次に、タイムスタンプに対して検証します。文字列2015.07.15.22:17somesalt
のmd5ハッシュを確認すると、md5合計9BC5...
と一致することがわかります。したがって、タイムスタンプが有効であることがわかります。タイムスタンプがハッシュと一致しない(既知のソルトを使用)場合は、改ざんされています。
生成されたすべてのページでsomesalt
が定数である必要はないことを指摘しなければなりません。これは、ユーザーセッションごとに生成された乱数である可能性があります(したがって、持続します)。あなたが保持し、このユーザーセッションで一貫しているのは秘密の情報です。
これを行う標準的な方法は [〜#〜] totp [〜#〜] と呼ばれます。基本的に、有効期限(現在+ t)だけでなく、時間間隔(通常は現在->現在+ t)をハッシュする方法。
Google、Facebook、Microsoft、GitHubなどで2要素認証に使用されます。通常、30秒程度有効な短い数字のセットですが、同じ原則を任意の期間に使用できます。
多くの言語で利用可能な実装があります。または、ウィキペディアの説明で、必要に応じて自分で実装することもできます。