なぜ「ランダム文字列生成ユーティリティ」が業務で役に立つのか
業務システムでは、ちょっとした「ランダム文字列」が頻繁に必要になります。 一時的なトークン、ファイル名のユニーク化、セッションID、検証コード、CSRFトークン、招待コードなど、用途はかなり広いです。 そのたびに場当たり的に Math.random() を使ったり、適当に UUID を文字列化したりしていると、コードがバラバラになり、強度や形式も統一されません。
そこで「ランダム文字列生成ユーティリティ」を用意しておくと、 どの機能からも同じルールでランダム文字列を生成できるようになり、 セキュリティ面でも、保守性の面でも、かなり楽になります。
ここでは、プログラミング初心者向けにステップバイステップで考えながら、 実務で使えるランダム文字列生成ユーティリティを丁寧に解説していきます。
ステップ1:乱数の種類を理解する
Random と SecureRandom の違いを押さえる
まず、「ランダム文字列」を作るためには「乱数」が必要になります。 Java には java.util.Random と java.security.SecureRandom という二つの代表的な乱数クラスがあります。
Random は、ゲームや簡単なシャッフルなど「セキュリティを気にしない用途」には十分ですが、 乱数のパターンを解析されると、次に出てくる値をある程度予測されてしまう可能性があります。
一方 SecureRandom は、暗号用途向けに設計されており、 攻撃者が乱数のパターンを推測しにくいようになっています。
業務でランダム文字列を使う場面は、 「トークン」「検証コード」「セッションID」など、セキュリティに関わるものが多いため、 基本的には SecureRandom を使うことをおすすめします。
ステップ2:どんな文字を使うか(文字集合)を決める
英数字だけか、記号も含めるかを用途ごとに考える
ランダム文字列の「見た目」は、使う文字集合によって決まります。 例えば、次のようなパターンがあります。
英数字だけ(A〜Z、a〜z、0〜9) 英小文字と数字だけ(a〜z、0〜9) 英大文字だけ(A〜Z) 記号も含める(!@#$%^&* など)
用途によって、許可される文字が違います。 URLに埋め込むトークンなら「URLで安全な文字だけ」にした方がよいですし、 人間が手入力する検証コードなら「紛らわしい文字(Oと0、Iと1など)を避ける」方がよいです。
まずは、汎用的な「英数字」の文字集合を用意してみます。
private static final String UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String LOWER = "abcdefghijklmnopqrstuvwxyz";
private static final String DIGITS = "0123456789";
private static final String ALPHANUM = UPPER + LOWER + DIGITS;
Javaこのようにしておくと、「英数字だけのランダム文字列」を簡単に作れるようになります。
