ランダム文字列生成ツール
無料で使えるオンラインのランダム文字列生成ツールです。暗号論的に安全で分布は均一、サーバーには何も送信しません。
その他のオプション
このランダム文字列生成ツールについて
ランダム文字列生成ツールは、選んだ文字セットから各位置の文字を偶然に選んで文字列を作ります。開発者はランダム文字列を API キー、セッショントークン、パスワード再設定リンク、データベースの識別子、ファイル名、招待コード、テストデータとして使います。良いツールと悪いツールを分けるのは、乱数がどこから来るのか、そしてそれがどう文字に変換されるのかだけで、どちらも出力を見ても分かりません。ランダムに見える文字列と、本当にランダムな文字列は別物です。
このランダム文字列生成ツールは、サーバーではなくお使いのブラウザーのタブの中で動作します。OS がパスワードマネージャーや TLS ライブラリに提供しているのと同じ暗号論的な乱数源を使い、それを偏りなく文字に変換し、結果がどれだけのエントロピーを持つかを正確に表示します。無料で、アカウントは不要です。ページを読み込んだ後は、ネットワークを切断しても動き続けます。
使い方
- 数値ボックスまたはスライダーで長さを設定します。初期値は 24 文字で、スライダーは 1 から 128 まで、数値ボックスは 4,096 まで指定できます。
- 文字セットを選びます。ボタンで大文字、小文字、数字、記号のオン・オフを切り替えられ、ドロップダウンからは 16進数、Base58、Base32、Base64 URLセーフなどの既製の文字セットを選べます。
- 「生成」ボタンか G キーを押します。新しい文字列が上に表示され、その下にビット単位の強度が表示されます。
- 「コピー」を押します。複数の値が必要な場合は「その他のオプション」を開いて最大 10,000 までの個数を指定し、1行に1つ、カンマ区切り、JSON 配列、引用符付きリスト、
.env形式の代入から選んで、まとめてコピーまたはダウンロードします。
記号入りのランダム文字列
記号のボタンをオンにすると、! # $ % * + - = ? @ ^ _ の 12 個の記号が加わります。この組み合わせは意図的に選んでいます。どれも Microsoft Entra ID、Active Directory、OWASP のパスワード許可リストに含まれており、バックスラッシュや引用符、空白のようにシェルコマンド、URL、引用符で囲んだ設定値を壊すこともありません。英字と数字と合わせると 74 文字の文字セットになり、1文字あたり 6.2095 ビットで、印字可能な ASCII 文字 94 種類すべてを使った場合より 5.3% 低いだけです。すべての記号や別の組み合わせが必要な場合は、カスタム文字セットの欄に使いたい文字を入力してください。どのシステムがどの記号を受け付けないかは、記号入りランダム文字列のページ(英語)で詳しく説明しています。
長いランダム文字列
長いランダム文字列の生成は、暗号鍵や署名用のシークレットのほか、入力欄を上限まで埋めて何が壊れるかを確かめるのに役立ちます。このツールでは最大 4,096 文字の文字列を1つ生成でき、どの長さでも同じく偏りのないサンプリングを使います。長さと文字セットは掛け算で効きます。英字と数字 24 文字でおよそ 143 ビットとなり、これはすでにどんな総当たり攻撃も届かない水準です。64 文字ならおよそ 381 ビットです。およそ 128 ビットを超えると、シークレットを長くしても実用上の安全性はほとんど増えず、サイズが増えるだけなので、用途に合った長さにしてください。64 文字の文字列生成ツールとエントロピー計算ツール(どちらも英語)では、あらゆる組み合わせの計算を確認できます。
安全なランダム文字列生成ツールの条件
条件は2つあり、多くのツールは少なくとも一方を満たしていません。1つ目は乱数源です。安全なランダム文字列生成ツールは、暗号論的に安全な乱数生成器から値を読み取ります。ブラウザーでは、OS から乱数を得る crypto.getRandomValues() がそれにあたります。オンラインツールの多くはいまだに Math.random() を使っていますが、これは高速でゲームには十分でも、出力をいくつか観察すれば予測できてしまいます。詳しくはMath.random() が安全でない理由(英語)で説明しています。
2つ目は変換方法です。乱数を文字セットのサイズで割った余りを使うと、一部の文字が他の文字より出やすくなります。このツールでは、後述する棄却サンプリングでこれを取り除いています。詳しくはモジュロバイアスの解説(英語)をご覧ください。これを確かめる統計検定の結果は、同じ検定で検出される、意図的に欠陥を入れた実装の結果と並べて、検証方法のページで公開しています。
オンラインで使うか、自分のコードで生成するか
今すぐ値が必要なときは、オンラインのランダム文字列生成ツールが最も手軽です。.env ファイル用のシークレット、テスト用のデータ、一度きりのパスワードなどです。アプリケーションの実行時に文字列を作る必要がある場合は、値を貼り付けるのではなく、その言語で生成してください。このページの下にあるコード例で、各プラットフォームでの正しい方法を紹介しています。
- Python:
secretsモジュールを使い、randomは使わない。 - Java:
SecureRandomを使い、java.util.Randomは使わない。 - JavaScript: ブラウザーでも Node.js でも
crypto.getRandomValues()を使い、Math.random()は使わない。 - C++:
std::random_deviceに対してstd::uniform_int_distributionを使う。保証が必要な場合は libsodium を使う。 - PHP:
random_int()を使い、rand()やmt_rand()は使わない。 - C#: .NET 8 では
RandomNumberGenerator.GetString()、.NET 6 と 7 ではGetInt32()を使う。 - PowerShell: PowerShell 7 では
RandomNumberGenerator、5.1 では1文字ごとにGet-Random -Maximumを使う。-SetSeedは付けず、-Countで文字列を組み立てない。
ランダム文字列生成ツールの選び方
ランダム文字列生成ツールはどれも似て見えるので、自分で確認できる点で判断しましょう。値はブラウザー内で作られているか、それとも記録されうるサーバーから返されているか。サイトは使っている乱数源を明示しているか。すべての文字種を必須にしたとき、強度の数値は本来あるべき形で下がるか。人が読む文字列のために 0 O 1 l I のような紛らわしい文字を除外できるか。ブラウザーの開発者ツールを開き、ネットワークタブに切り替えて「生成」を押してみてください。このサイトでは何も表示されません。より専門的な用途には、一括生成ツール、カスタム文字の生成ツール、パスワード生成ツール、またはサイト内のすべてのジェネレーター(いずれも英語)をご覧ください。
このツールの仕組み
すべての値は、OS の暗号論的乱数生成器へのブラウザーのインターフェースである crypto.getRandomValues() から得られます。代替手段はありません。ブラウザーが安全な乱数源を提供できない場合、このツールは弱い乱数源でこっそり代用するのではなく、生成そのものを拒否します。
生のビットを文字に変換する部分で、多くのツールは失敗しています。乱数を文字セットのサイズで割った余りを使うというよくある方法では割り切れず、出力が文字セットの先頭側の文字に偏ります。1バイトを 62 文字に割り当てると、最初の 8 文字が残りの 54 文字より1.25 倍出やすくなります。このツールは、最後の不完全な周期に入った値を捨てることで、すべての文字の出現確率を完全に等しくしています。
「選択した種類をそれぞれ1文字以上含める」オプションにも同じ配慮をしています。数字を決まった位置に押し込むと目に見えるパターンが残るため、このツールは候補の文字列全体を生成し、制約を満たさなければ丸ごと捨てます。有効な文字列はすべて同じ確率で出現し、エントロピーの表示も単純な公式による値ではなく、本当の値まで下がります。
信用してほしいとお願いするのではなく、検定結果を公開しています。生成した 500,000 文字に対し、文字頻度のカイ二乗検定は p = 0.673 となりました。同じ検定群を意図的に偏らせた実装にかけると、カイ二乗値 = 3345(自由度 61)で検出されます。これにより、検定が十分に敏感であり、問題なしという結果に意味があることが分かります。検証方法の全文を読む(英語)。
ご自分のコードで生成する
ブラウザーのタブではなくアプリケーション内で必要な場合の、各言語での正しい方法です。どの例も、そのプラットフォームの暗号論的な乱数源と偏りのない変換を使っています。
JavaScript(ブラウザーと Node 19 以降)
const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
function randomString(length) {
const n = ALPHABET.length;
// Largest multiple of n that fits in a uint32. Values at or above this
// are discarded, which is what removes the modulo bias.
const limit = Math.floor(2 ** 32 / n) * n;
const out = new Array(length);
const buf = new Uint32Array(length);
crypto.getRandomValues(buf);
for (let i = 0, j = 0; i < length; i++) {
let v = buf[j++];
while (v >= limit) {
// Refill one word at a time on the rare rejection.
const extra = new Uint32Array(1);
crypto.getRandomValues(extra);
v = extra[0];
}
out[i] = ALPHABET[v % n];
}
return out.join("");
}
randomString(24); crypto.getRandomValues() は 1 回の要求が 65,536 バイトを超えると拒否するため、大量に生成する場合は分割する必要があります。
Python 3.6+
import secrets
import string
ALPHABET = string.ascii_letters + string.digits
def random_string(length: int) -> str:
# secrets.choice() is unbiased: it uses randbelow(), which is itself
# rejection sampling over os.urandom. Do not use random.choice() here,
# which is a Mersenne Twister and is not cryptographically secure.
return "".join(secrets.choice(ALPHABET) for _ in range(length))
random_string(24) secrets は Python 3.6 から標準ライブラリに含まれています。random モジュールを使うものは、シークレットには適していません。
Go
package main
import (
"crypto/rand"
"math/big"
)
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
func randomString(length int) (string, error) {
out := make([]byte, length)
max := big.NewInt(int64(len(alphabet)))
for i := range out {
// rand.Int is unbiased; it rejects internally.
n, err := rand.Int(rand.Reader, max)
if err != nil {
return "", err
}
out[i] = alphabet[n.Int64()]
}
return string(out), nil
} crypto/rand を使い、math/rand は使わないでください。Go 1.20 以降、math/rand のグローバル生成器には自動でランダムなシードが設定されますが、予測可能性は何も改善されません。
Rust
// rand = "0.9"
use rand::Rng;
use rand::distr::{Alphanumeric, SampleString};
fn random_string(length: usize) -> String {
// rand::rng() is a thread-local ChaCha12 CSPRNG, seeded from the
// operating system and reseeded periodically.
// Alphanumeric samples uniformly over A-Z a-z 0-9.
Alphanumeric.sample_string(&mut rand::rng(), length)
}
// With an arbitrary alphabet, random_range rejection-samples:
fn random_from(alphabet: &[u8], length: usize) -> String {
let mut rng = rand::rng();
(0..length)
.map(|_| alphabet[rng.random_range(0..alphabet.len())] as char)
.collect()
} rand 0.8 ではパスが異なります。rand::distr の代わりに rand::distributions、SampleString の代わりに DistString、random_range の代わりに gen_range、rand::rng() の代わりに rand::thread_rng() を使います。
PHP 7+
<?php
function randomString(int $length): string {
$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$n = strlen($alphabet);
$out = '';
for ($i = 0; $i < $length; $i++) {
// random_int() is unbiased and cryptographically secure.
// rand() and mt_rand() are neither.
$out .= $alphabet[random_int(0, $n - 1)];
}
return $out;
}
echo randomString(24); Java 17+
import java.security.SecureRandom;
public final class RandomString {
private static final String ALPHABET =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
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++) {
// nextInt(bound) rejects internally, so it is unbiased.
sb.append(ALPHABET.charAt(RANDOM.nextInt(ALPHABET.length())));
}
return sb.toString();
}
} java.util.Random や Math.random() ではなく SecureRandom を使ってください。前者2つはどちらも 48 ビットの線形合同法による生成器です。
C# / .NET 6+
using System.Security.Cryptography;
public static class RandomStringGenerator
{
private const string Alphabet =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
public static string Generate(int length)
{
// GetString was added in .NET 8 and is unbiased.
return RandomNumberGenerator.GetString(Alphabet, length);
}
// On .NET 6 and 7, GetInt32 is the unbiased primitive:
public static string GenerateLegacy(int length)
{
var chars = new char[length];
for (int i = 0; i < length; i++)
chars[i] = Alphabet[RandomNumberGenerator.GetInt32(Alphabet.Length)];
return new string(chars);
}
} C++11 以降
#include <random>
#include <string>
std::string random_string(std::size_t length) {
static const std::string alphabet =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
// uniform_int_distribution is specified to give every value in the range
// equal probability, so there is no modulo bias to remove by hand.
std::random_device rd;
std::uniform_int_distribution<std::size_t> pick(0, alphabet.size() - 1);
std::string out;
out.reserve(length);
for (std::size_t i = 0; i < length; ++i) {
out += alphabet[pick(rd)];
}
return out;
} std::random_device は libstdc++、libc++、MSVC では OS の乱数源を読みますが、標準規格は決定的な実装も認めており、GCC 9.2 より前の MinGW ビルドは実際にそうでした。保証が必要な場合は libsodium の randombytes_uniform() を使ってください。シークレットに std::rand() や std::mt19937 は決して使わないでください。
PowerShell 7
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
# GetInt32 draws from the OS CSPRNG and rejection samples internally.
-join (1..24 | ForEach-Object {
$chars[[System.Security.Cryptography.RandomNumberGenerator]::GetInt32($chars.Length)]
}) Windows PowerShell 5.1 は GetInt32 のない .NET Framework 上で動作します。5.1 では Get-Random -Maximum $chars.Length で1文字ずつ選んでください。-SetSeed を指定しない限り、システムの CSPRNG が使われます。同じ文字を繰り返さない Get-Random -Count は避けてください。
Shell
# 24 alphanumeric characters from the kernel CSPRNG.
LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24; echo
# Base64, URL-safe, from 32 bytes of entropy.
openssl rand -base64 32 | tr '+/' '-_' | tr -d '=' tr は集合に含まれないバイトを集合内に折り返さずに捨てるため、このパイプラインに偏りはありません。`head -c 24` を `tr` の前に置くと、生の 24 バイトのうち英数字だけが残り、24 文字ではなく、より短く長さも一定しない文字列になります。
トークン、パスワード、一括生成、各言語でよくある間違いを扱った詳しいガイド(英語)です。すべてのコード例は実際の実行環境で動作を確認しています。
長さの選び方
長さは文字セットと組み合わせて初めて意味を持ちます。数字だけの 20 文字はおよそ 66 ビット、英字と数字 62 種類から選んだ 20 文字は 119 ビットです。下の表は、目標の強度に達するのに必要な文字数です。ツールには、選択中の設定での正確な値が表示されます。
| 文字セット | ビット/文字 | 64 ビット | 112 ビット | 128 ビット |
|---|---|---|---|---|
| 数字のみ (10) | 3.3219 | 20 | 34 | 39 |
| 小文字 (26) | 4.7004 | 14 | 24 | 28 |
| 16進数 (16) | 4.0000 | 16 | 28 | 32 |
| 英字と数字 (62) | 5.9542 | 11 | 19 | 22 |
| 紛らわしい文字を除外 (49) | 5.6147 | 12 | 20 | 23 |
| 安全な記号付き (74) | 6.2095 | 11 | 19 | 21 |
紛らわしい文字を除外すると、1文字あたり 0.3395 ビット、つまり 5.70% 減ります。17 文字ごとに1文字増やせば取り戻せるので、人が読み上げたり打ち直したりする文字列では、たいてい除外する価値があります。
よくある質問
ランダム文字列生成ツールとは何ですか?
ランダム文字列生成ツールは、英字、数字、記号などの文字セットから各文字を偶然に選んで文字列を作るツールです。優れたツールは暗号論的に安全な乱数源を使い、すべての文字にまったく同じ確率を与えるため、結果を予測することも再現することもできません。
ランダム文字列は何に使われますか?
ランダム文字列は、API キー、セッショントークン、パスワード再設定やメールアドレス確認のリンク、CSRF トークン、パスワード、暗号化や署名のシークレット、データベースやファイルの識別子、クーポンや招待のコード、そして特定の長さの入力をアプリケーションがどう扱うかを確かめるテストデータとして使われます。
オンラインのランダム文字列生成ツールを使っても安全ですか?
文字列がブラウザー内で生成されてどこにも送信されず、ツールが安全な乱数源を使っていれば安全です。このサイトはご自身で確認できます。ブラウザーの開発者ツールでネットワークタブを開いて「生成」を押しても、リクエストは1件も表示されません。サーバーで値を作るツールは値をあなたに送る必要があるため、途中で記録される可能性があります。
このランダム文字列生成ツールは無料で使えますか?
はい。無料で、アカウントは不要、利用回数の制限も商用利用の制限もありません。ブラウザー上でオンラインで動作し、ページを読み込んだ後はオフラインでも動き続けます。
記号入りのランダム文字列はどうやって生成しますか?
!#$% のボタンをオンにします。! # $ % * + - = ? @ ^ _ の 12 個の記号が加わります。これらはほぼすべてのパスワードポリシーで使え、シェルコマンドや URL を壊すこともありません。別の記号の組み合わせを使いたい場合は、「その他のオプション」にあるカスタム文字セットの欄に、使いたい文字をそのまま入力してください。
長いランダム文字列はどうやって生成しますか?
スライダーの横にある数値ボックスに長さを入力します。スライダーは 128 までですが、ボックスには 4,096 文字までの任意の長さを入力できます。エントロピーの表示は入力に合わせて更新されるので、用途に十分な長さになったかが分かります。
英数字のランダム文字列はどうやって生成しますか?
A-Z、a-z、0-9 のボタンをオンに、記号のボタンをオフにしたままにします。これが初期設定です。62 文字の文字セットになり、1文字あたり約 5.95 ビットなので、24 文字の文字列はおよそ 143 ビットになります。英字だけにするには 0-9 を、数字だけにするには英字のボタンを2つともオフにします。
複数のランダム文字列を一度に生成できますか?
はい。「その他のオプション」を開き、最大 10,000 までの個数を指定します。結果は1行に1つ、カンマ区切り、JSON 配列、引用符付きリスト、.env 形式の代入で表示でき、コピーやファイルとしてのダウンロードもできます。重複を含めたくない場合は「すべての結果を互いに異なるものにする」にチェックを入れてください。
ランダム文字列は一意ですか?
保証はありませんが、十分に長い文字列なら実用上は一意です。重複の起こりやすさは誕生日問題に従います。英字と数字 24 文字にあたる約 143 ビットなら、重複が起こりそうになるまでにおよそ 2^71 個の文字列を生成する必要があります。短い文字列は事情が異なり、6 文字のコードはずっと早く重複するので、短い場合はデータベース側で一意性を確認してください。
安全なランダム文字列生成ツールの条件は何ですか?
ブラウザーの crypto.getRandomValues() のような暗号論的に安全な乱数源と、乱数から文字への偏りのない変換です。Math.random() を使ったツールは予測可能で、棄却サンプリングなしに剰余演算を使うツールは一部の文字を出やすくしてしまいます。このツールはどちらも行っておらず、検定結果を公開しています。
Python でランダム文字列を生成するには?
secrets モジュールを使います: "".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(24))。secrets.choice は暗号論的に安全で、偏りがありません。random.choice はメルセンヌ・ツイスターで、出力から予測できるため使わないでください。
Java でランダム文字列を生成するには?
java.security.SecureRandom を1つ作り、1文字ごとに nextInt(alphabet.length()) を呼んで、alphabet.charAt() を StringBuilder に追加します。上限付きの nextInt には偏りがありません。java.util.Random や Math.random() は、どちらも予測可能な 48 ビットの生成器なので使わないでください。
JavaScript でランダム文字列を生成するには?
crypto.getRandomValues() で Uint32Array を埋め、文字セットのサイズの最大の倍数以上の値を捨て、残りの値で文字セットを参照します。最新のすべてのブラウザーと Node.js 19 以降で動作します。完全な関数はこのページのコード例にあります。この用途に Math.random() は安全ではありません。
C++ でランダム文字列を生成するには?
std::random_device に対して std::uniform_int_distribution を使い、文字セットを参照します。この分布は仕様上偏りがありません。std::random_device は主要なコンパイラーでは OS の乱数源を読みますが、標準規格はそれを保証していないため、重要な場合は libsodium の randombytes_uniform() を使ってください。std::rand() は避けてください。
PHP でランダム文字列を生成するには?
1文字ごとに random_int(0, strlen($alphabet) - 1) を呼び、その位置の文字を追加します。random_int は暗号論的に安全で偏りがなく、PHP 7 から標準で使えます。秘密にすべき値に rand()、mt_rand()、str_shuffle() は使わないでください。
C# でランダム文字列を生成するには?
.NET 8 以降では、RandomNumberGenerator.GetString(alphabet, length) を呼べば、1行で安全かつ偏りなく生成できます。.NET 6 と 7 では、1文字ごとに RandomNumberGenerator.GetInt32(alphabet.Length) を呼びます。System.Random はシークレットには適していません。
PowerShell でランダム文字列を生成するには?
PowerShell 7.4 以降では [System.Security.Cryptography.RandomNumberGenerator]::GetString($chars, 24) を呼びます。そのメソッドがない Windows PowerShell 5.1 では、1文字ごとに $chars[(Get-Random -Maximum $chars.Length)] を追加します。Get-Random は、-SetSeed を指定しない限りシステムの暗号論的乱数生成器を使います。同じ文字を繰り返さない Get-Random -Count は避けてください。
Node.js でランダム文字列を生成するには?
16進数や URL セーフな文字列には、crypto.randomBytes(16).toString("hex") か crypto.randomBytes(18).toString("base64url") を使います。カスタム文字セットの場合は、安全で偏りのない crypto.randomInt(alphabet.length) で1文字ずつ選びます。Math.random() でシークレットを作らないでください。
Linux や Bash でランダム文字列を生成するには?
英字と数字 24 文字なら LC_ALL=C tr -dc "A-Za-z0-9" < /dev/urandom | head -c 24、32 文字の16進数の文字列なら openssl rand -hex 16 を実行します。どちらもカーネルの乱数源を読みます。$RANDOM は暗号論的でない生成器による 15 ビットの値なので避けてください。
Go でランダム文字列を生成するには?
crypto/rand を使います。Go 1.24 以降では、rand.Text() が 128 ビット以上の乱数を持つ 26 文字の Base32 文字列を返します。独自の文字セットには、rand.Int(rand.Reader, big.NewInt(int64(len(alphabet)))) で1文字ずつ選びます。シークレットに math/rand は決して使わないでください。
Excel でランダム文字列を生成するには?
Excel 365 では =TEXTJOIN("",TRUE,CHAR(RANDARRAY(10,1,65,90,TRUE))) でランダムな大文字 10 文字が得られ、シートが再計算されるたびに変わります。Excel の乱数関数は暗号論的に安全ではないので、テストデータにだけ使い、パスワードや鍵は安全なツールで生成してください。
生成したものがサーバーに送信されることはありますか?
いいえ。生成は Web Crypto API を使ってすべてブラウザー内で行われます。送信先となるバックエンドは存在せず、ご自身で確認できます。ブラウザーの開発者ツールを開いてネットワークタブに切り替え、「生成」を押してください。何も表示されません。
Math.random() を使う場合と何が違うのですか?
Math.random() は暗号論的に安全ではありません。V8 は 128 ビットの非暗号論的な生成器である xorshift128+ で実装しており、JavaScript の仕様も出力が予測不能であることを求めていません。いくつかの出力を観察すれば内部状態を復元し、過去と未来のすべての値を再現できることが、公開された研究で示されています。このツールは、OS の CSPRNG から乱数を得る crypto.getRandomValues() を使っています。
モジュロバイアスとは何ですか? このツールにはありますか?
乱数を剰余演算で小さくすると、結果が文字セットの先頭側に偏ります。1バイトを 62 文字に割り当てると 256 = 4x62 + 8 となり、最初の 8 文字が残りより 1.25 倍出やすくなります。このツールは棄却サンプリングでこれを取り除いています。最後の不完全な周期に入った値は、折り返して使うのではなく捨てています。
すべての文字種を必須にすると、なぜエントロピーの値が下がるのですか?
下がるのが正しいからです。数字を1文字以上必須にすると、数字を含まない文字列がすべて除外されるため、可能な出力が減り、本当のエントロピーは 長さ x log2(文字セットのサイズ) より低くなります。多くのツールは高いほうの数値を表示し続けますが、このツールは有効な文字列を包除原理で数えて本当の値を表示し、制約なしの値を括弧内に示すので、コストが分かります。
ランダム文字列の長さはどれくらい必要ですか?
何を守るかによります。回数制限のあるエンドポイントに対してオンラインで推測するしかない値なら、64 ビットで十分です。盗まれてオフラインで攻撃されうるシークレットには、112 ビット以上を目安にしてください。英数字 19 文字で 113 ビットになります。パスワードについては、NIST SP 800-63B が最低 15 文字を求め、文字種の組み合わせルールを明確に推奨していません。
パスワード、API キー、セッショントークンに使えますか?
はい。乱数源は OS があらゆるアプリケーションに提供しているものと同じで、文字への変換にも偏りがありません。ただし、値がこのページを離れた後まで守ることはできないので、結果は他のシークレットと同じように扱ってください。
速度
32 文字の文字列 10,000 件の生成にかかる時間は 17 ms です。大量の生成は分割して行い、その合間にメインスレッドを解放するため、ページは操作可能なままで、途中でキャンセルもできます。現在 Google の検索結果1ページ目に表示されているツールのうち3つは、個数の上限がまったくなく、タブが固まってしまいます。