なぜ「ワンタイムコード生成ユーティリティ」が業務で重要なのか
業務システムでは、本人確認やセキュリティ強化のために「一度だけ使えるコード(ワンタイムコード)」が頻繁に使われます。 SMS認証コード、メールに送る確認コード、パスワードリセット用のコード、二要素認証(2FA)のコードなど、用途はとても広いです。
このとき、「なんとなくランダムっぽい数字を作る」だけでは、攻撃者から見れば簡単に総当たりできる弱い仕組みになってしまいます。 ワンタイムコードは、生成の仕方と同じくらい、長さ・文字種・有効期限・試行回数などのルールが重要になります。
ここでは、プログラミング初心者向けにステップバイステップで思考しながら、 実務で通用する「ワンタイムコード生成ユーティリティ」を丁寧に解説していきます。
ステップ1:ワンタイムコードの役割を整理する
「本人確認」と「一度きり」をセットで考える
ワンタイムコードは、だいたい次のような流れで使われます。
- システムがランダムなコードを生成する
- ユーザーにSMSやメールでコードを送る
- ユーザーが画面にコードを入力する
- システムが「送ったコード」と「入力されたコード」を照合する
- 一度成功したら、そのコードは無効にする
ここで重要なのは、「コード自体は短くてもよいが、推測されにくくなければならない」という点です。 人間が入力するので、あまり長すぎると使い勝手が悪くなります。 そのため、6桁前後の数字や、短めの英数字コードがよく使われます。
ステップ2:乱数クラスの選び方を決める
セキュリティ用途なので SecureRandom 一択で考える
ワンタイムコードは完全にセキュリティ用途ですので、 乱数クラスは java.security.SecureRandom を使うべきです。
import java.security.SecureRandom;
public class SecureRandomHolder {
public static final SecureRandom RANDOM = new SecureRandom();
}
JavaSecureRandom は、攻撃者が乱数のパターンを推測しにくいように設計されたクラスです。 Random や Math.random() は、ゲームや簡単なシャッフルには十分ですが、 認証コードのような用途には向きません。
