なぜ「パスワード生成ユーティリティ」が業務で重要なのか
業務システムでは、ユーザーアカウント、APIキー、一時的な初期パスワード、管理者用の秘密情報など、さまざまな場面で「安全なパスワード」を生成する必要があります。 しかし、ここで「なんとなくランダムっぽい文字列」を作ってしまうと、攻撃者から見れば簡単に推測できる弱いパスワードになってしまいます。
安全なパスワード生成には、セキュリティの観点から守るべきルールがいくつかあります。 それをきちんとユーティリティとしてまとめておくことで、どの機能からも同じ品質のパスワードを生成できるようになり、システム全体の安全性が底上げされます。
ここでは、プログラミング初心者向けにステップバイステップで考えながら、実務で通用するパスワード生成ユーティリティを解説していきます。
ステップ1:安全な乱数とは何かを理解する
「Random」ではなく「SecureRandom」を使う理由
Java には java.util.Random と java.security.SecureRandom という二つの乱数クラスがあります。 見た目にはどちらも「ランダムな値」を返してくれますが、セキュリティの観点ではまったく違います。
Random は統計的にはそれなりにランダムですが、「次の値を予測しようとする攻撃」に対して弱いです。 一方 SecureRandom は、暗号用途向けに設計されており、攻撃者が乱数のパターンを推測しにくいようになっています。
パスワード生成は「攻撃者に推測されたくない値」を作る処理なので、必ず SecureRandom を使うべきです。
ステップ2:どんな文字を使うか(文字集合)を決める
大文字・小文字・数字・記号をどう組み合わせるか
パスワードの強さは「長さ」と「使う文字の種類」で決まります。 例えば、数字だけの 8 桁よりも、大文字・小文字・数字・記号を混ぜた 12 桁の方が圧倒的に強くなります。
実務では、次のような文字集合をよく使います。
英大文字(A〜Z) 英小文字(a〜z) 数字(0〜9) 記号(!@#$%^&* など)
ただし、記号はシステムや連携先によって許可される種類が違うため、プロジェクトごとに「使ってよい記号」を決めておく必要があります。
ステップ3:基本的なパスワード生成コードを書く
SecureRandom と文字集合を組み合わせる
まずは、シンプルなパスワード生成ユーティリティを見てみます。
import java.security.SecureRandom;
public class PasswordGenerator {
private static final String UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String LOWER = "abcdefghijklmnopqrstuvwxyz";
private static final String DIGITS = "0123456789";
private static final String SYMBOLS = "!@#$%^&*";
private static final String ALL = UPPER + LOWER + DIGITS + SYMBOLS;
private static final SecureRandom RANDOM = new SecureRandom();
public static String generate(int length) {
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
int index = RANDOM.nextInt(ALL.length());
sb.append(ALL.charAt(index));
}
return sb.toString();
}
}
Java使い方の例としては、次のようになります。
String password = PasswordGenerator.generate(12);
System.out.println(password);
Javaここで重要なのは、「乱数でインデックスを選び、その位置の文字を取り出す」というシンプルな構造です。 この形を理解しておくと、文字集合を変えたり、長さを変えたりするのが簡単になります。

