2026年08月25日 03:40 / - PV

開発をしていると、ランダム文字列が今すぐ欲しい場面が定期的にやってきます。
そのたびに「えーと、opensslのオプションなんだっけ...」となりがちなので、本記事ではブラウザ・コマンドライン・プログラミング言語別のランダム文字列の作り方を、実務での注意点と合わせてまとめておきます。
先に一番大事な話をします。ランダム文字列には2種類の用途があります。
セキュリティ用途では、暗号論的に安全な乱数生成器(CSPRNG)を使うことが必須です。JavaScriptのMath.random()やPHPのrand()は内部状態から出力が予測できてしまうため、トークンに使うと総当たりより遥かに効率的に破られる可能性があります。
以下で紹介する方法は、いずれもCSPRNGベースのものを選んでいます。
弊社のWebツール集 Spoon Tools! の「ランダム文字列発行」を使うと、インストール不要で作れます。
「メンバー10人分の初期パスワードを一気に用意する」ような場面では、コマンドより速いと思います。
# base64で32文字前後(記号 + / = を含む)openssl rand -base64 24
# 16進数で32文字(0-9a-fのみ。記号なしで扱いやすい)openssl rand -hex 16
URLやシェルに貼っても事故らない文字列が欲しいときは-hexが無難です。-base64は+や/が入るため、コピペ先によってはエスケープ問題を起こします。
# 英大小文字+数字で20文字
head -c 100 /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 20; echo
# 記号も含める場合
head -c 100 /dev/urandom | tr -dc 'A-Za-z0-9!#$%&()*+,-./' | head -c 20; echo
「一意でありさえすればいい」識別子なら、UUIDで済むことも多いです。
uuidgen # 例: 1B9D6BCD-BBFD-4B2D-9B5D-AB8DFBBD4BED
// トークン用途: Web Crypto APIを使う(Node.js 19+ / ブラウザ共通)
const token = crypto.randomUUID(); // UUID v4
// 文字種を指定したい場合
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const randomString = (len) =>
Array.from(crypto.getRandomValues(new Uint32Array(len)))
.map((n) => chars[n % chars.length])
.join('');
console.log(randomString(20));
Math.random()はここでは使いません。 テストデータ生成ならOKですが、癖としてcrypto側を使っておくと安全です。
// 素のPHP: random_bytes()がCSPRNG
$token = bin2hex(random_bytes(16)); // 32文字の16進数
// Laravelならヘルパ一発
$token = Str::random(32);
LaravelのStr::randomは内部でrandom_bytes()を使っているため、そのままトークン用途に使えます。
初期パスワードを人間が手入力する場合、l(小文字エル)と1とI、Oと0の混在は
問い合わせ事故のもとです。手入力される文字列では、これらを文字種から抜いておくのがおすすめです。
記号入りは強度が上がりますが、メール・チャット・CSV経由で渡す途中で 壊れたりエスケープされたりしがちです。運用フロー全体で安全に渡せる文字種にしておく方が、結果的にトラブルが少ないです。
openssl rand -hex 16で32文字)openssl rand -hex 16crypto.getRandomValues、PHPはrandom_bytes()いずれの場合も、セキュリティ用途にMath.random()やrand()を使わない。これだけは徹底しましょう。
この記事が何かのお役に立てれば幸いです。
最後までお読みいただきありがとうございました!
Share Me!