パスワード生成

パスワードジェネレーターです。長さと文字の種類を選ぶだけで、推測されにくいランダムなパスワードを自動生成できます。値はこのブラウザの中でだけ作り、どこにも送りません。強さはビット数と計算の式で見せます。登録は要りません。

文 ゆめさく公開 更新

作ったパスワード

ブラウザの中で作っています。

強さの目安とても強い102.6 ビット

1 秒に 1 兆回試せる相手が、すべての並びを試し切るのにかかる時間は 約 2,413 億年です。

計算のしかた

式は 長さ × log2(使える文字の数) です。いまの指定では 16 × log2(86) = 102.8 になります。「文字の種類を必ず含める」や「同じ文字を使わない」を入れると、作れる並びが少し減るので、並びの数を数え直した 102.6 ビットを表示しています。

この数は、値をこの道具のように乱数で作ったときだけ成り立ちます。自分で考えた並びには当てはまりません。

長さ
使う文字の種類

サイトが受け付けない記号は消してください。英数字と空白は無視します。

条件
個数

使い方

  1. 長さを決めます。迷ったら初期値の 16 文字のままで足ります。サービスに上限があるときは、その長さに合わせます。
  2. 使う文字の種類と条件を選びます。サイトが受け付けない記号があれば、「使う記号」の欄から消します。
  3. 「コピーする」を押して、パスワードマネージャーか、サイトの入力欄へ貼ります。値は記録されないので、貼る前にこの頁を閉じないでください。
  4. まとめて必要なときは個数を増やし、「全部コピーする」か「テキストで保存する」を使います。

このパスワード生成のしくみ

このパスワードジェネレーターは、ランダムなパスワードを自動生成する道具です。作る方法は、次の 4 つの決まりで守っています。

作った値は、いま開いているブラウザの中だけで作ります。値をサーバーへ送ることも、保存することも、アクセス計測に載せることもしません。ページを閉じれば値は消えます。

通信が出ないことの確かめ方

ブラウザの開発者ツールで Network の画面を開き、「もう一度作る」を押してください。押しても通信の行が増えないことが分かります。サイト全体のアクセス計測の通信が別に出ることはありますが、作った値は含まれません。

乱数は crypto.getRandomValues から取る

乱数にはブラウザが持つ crypto.getRandomValues を使い、Math.random は使いません。MDN Web Docsは、Math.random は暗号論的に安全な乱数を返さず、セキュリティに関わることには Crypto.getRandomValues() を使うよう書いています。

余りの偏りを出さない

乱数を文字の数で割った余りで文字を選ぶと、割り切れない分だけ、前のほうの文字が出やすくなります。たとえば 0 から 255 の値を 94 で割った余りで選ぶと、68 通りは 3 回ずつ、残りの 26 通りは 2 回ずつ当たるので、前の 68 文字が 1.5 倍出やすくなります。この道具は 32 ビットの値を引き、割り切れない端の値は捨てて引き直すので、どの文字も同じ確率で出ます。

文字の種類を必ず含める作り方

「選んだ種類を 1 文字ずつは必ず含める」は、作った並びが条件を満たさなければ捨てて、最初から作り直しています。作ったあとで一部の文字を差し替える方法だと、並びごとの出やすさがそろわなくなります。捨てて作り直す方法なら、条件を満たす並びのどれもが同じ確率で出るので、強さを数え上げで正確に出せます。

強さの目安とビット数の見方

強さは、同じ指定で作れる並びの数を、2 を底とする対数にしたビット数で出しています。1 ビット増えるごとに、当てずっぽうで当たる確率は半分になります。

文字の種類と長さが決まっているときの式は、次のとおりです。

強さ (ビット) = 長さ × log2(使える文字の数)

たとえば英小文字だけ 8 文字なら 8 × log2(26) で約 37.6 ビットです。英大小文字と数字と記号の 86 文字で 16 文字なら 16 × log2(86) で約 102.8 ビットになります。「必ず含める」や「同じ文字を使わない」を入れると作れる並びが少し減るので、道具が出す値は、その分を数え直した 102.6 ビットです。

この数が成り立つのは、乱数で作った並びだけです。人が考えた並び、単語や誕生日を混ぜた並び、よく使われる並びには当てはまりません。文字数が同じでも、そうした並びは式の値よりはるかに簡単に当てられます。

長さと文字の種類ごとの強さ
指定使える文字の数強さ (ビット)目安すべてを試し切る時間
4 桁の数字 (暗証番号)1013.3弱い1 秒未満
数字だけ 8 文字1026.6弱い1 秒未満
英小文字だけ 8 文字2637.6弱い1 秒未満
英数字 8 文字6247.2ふつう約 3 分
英数字と記号 8 文字8650.4ふつう約 24 分
英小文字だけ 12 文字2656.4ふつう約 1 日
英数字と記号 12 文字8676.7強い約 3,798 年
英数字 16 文字6295.2強い約 14 億年
英数字と記号 16 文字 (初期設定)86102.6とても強い約 2,413 億年
英数字と記号 20 文字86128.4とても強い約 1,417 京年
英数字と記号 32 文字86205.6とても強い約 10 の 42 乗年

最後の欄は、1 秒に 1 兆回 (10 の 12 乗回) 試せる相手を仮定して、すべての並びを試し切るのにかかる時間を出した値です。実際に当たるまでの平均はこの半分になります。相手の速さはパスワードの保存のされ方で大きく変わるので、あくまで目安です。目安のことば (弱い、ふつう、強い、とても強い) の区切りは 40、70、100 ビットで、規格の値ではなく、ゆめさくが置きました。

設定の選び方と、強さへの影響

基準は初期設定です。設定を 1 つだけ変えたときの強さを並べました。

設定を変えたときの強さ
変えた設定使える文字の数強さ (ビット)基準との差
初期設定 (16 文字、英数字と記号、必ず含める)86102.6基準
1 文字長くする (17 文字)86109.0+6.5
4 文字短くする (12 文字)8676.7-25.9
記号を外す6295.2-7.4
見間違えやすい文字を除く80100.8-1.7
同じ文字を 2 回使わない86100.5-2.1
必ず含める指定を外す86102.8+0.2
  • 長さを足すのがいちばん効きます。使える文字が 86 種類のとき、1 文字足すと約 6.4 ビット増えます。
  • 記号の初期値は 24 個です。OWASP の一覧の 32 個から、貼り付けで壊れやすい 8 個 (引用符、バッククォート、バックスラッシュ、山括弧、アンパサンド、縦線) を引きました。サイトが受け付けない記号があるときは、使う記号の欄から消し、外した分は長さで補います。
  • 見間違えやすい文字を除くのは、紙に書き写す、電話で伝える、画面を見て手で打つ、といった場面のためです。強さは少し下がります。
  • 同じ文字を使わない設定は、作れる並びを減らします。サイトが求めていない限り、入れないほうが強くなります。
  • 個数を増やすと、同じ設定でまとめて作れます。何個作っても、それぞれは独立に作られます。

強いパスワードの条件は、NIST の指針ではこうなっています

米国の標準化機関 NIST のデジタルアイデンティティ指針 (SP 800-⁠63B 第 4 版) は、パスワードを受け付けるサービス側に、次のことを求めています。この頁の末尾にある出典の本文を読んで確かめた内容です。

  • パスワードだけで認証するなら 15 文字以上、多要素認証の一部として使うなら 8 文字以上を、最低の長さにすること。
  • 64 文字以上の長さを受け付けることが望ましいこと。
  • 大文字や数字を混ぜることなど、文字の種類の組み合わせの規則を課さないこと。
  • 定期的な変更を求めないこと。ただし、漏えいの証拠があるときは変えさせること。
  • 新しいパスワードを、よく使われる値や漏えいした値の一覧と照合すること。

定めるべきなのは長さと推測されにくさで、文字の種類を混ぜることは長さほど効きません。強さの表のとおり、英小文字だけの 12 文字 (56.4 ビット) は、英数字と記号を混ぜた 8 文字 (50.4 ビット) より強くなります。サービスによっては、いまも記号や定期的な変更を求める画面があります。そのときは、そのサービスの決まりに合わせて指定してください。

作ったあとの置き場所

作ったパスワードは、サービスごとに別のものを使います。あるサービスから漏れた値が、別のサービスの入口で試されることがあるためです。数が増えて覚えられなくなるので、パスワードマネージャーか、ブラウザや OS の保存機能に入れて、手で打つ機会を減らします。この道具は値を記録しないので、作ったらその場で保存先へ貼ってください。

多要素認証が使えるサービスでは、あわせて有効にします。パスワードが漏れても、それだけではログインされにくくなります。

コードで作るなら

同じ作り方を自分のコードに入れたいときの例です。どちらも乱数には暗号用のものを使います。Python は標準の secrets、JavaScript は crypto.getRandomValues です。Python の公式文書は、パスワードのような秘密には random ではなく secrets を使うよう書いています。

Python の例

make_password.py

import secrets
import string

SYMBOLS = "!#$%()*+,-./:;=?@[]^_{}~"
ALPHABET = string.ascii_letters + string.digits + SYMBOLS


def make_password(length=16):
    while True:
        password = "".join(secrets.choice(ALPHABET) for _ in range(length))
        # 4 つの種類が 1 つずつ入るまで作り直す
        if (
            any(c.islower() for c in password)
            and any(c.isupper() for c in password)
            and any(c.isdigit() for c in password)
            and any(c in SYMBOLS for c in password)
        ):
            return password


print(make_password())

実行すると 16 文字が 1 行出ます。毎回違う値で、たとえば次のようになります。

出力の例

R,Nac*U+$aIf.Sy6

JavaScript の例

make-password.mjs

const ALPHABET =
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%()*+,-./:;=?@[]^_{}~";

// 0 以上 max 未満の整数。割り切れない端の値は捨てて引き直す
function randomInt(max) {
  const limit = Math.floor(2 ** 32 / max) * max;
  const buf = new Uint32Array(1);
  do {
    crypto.getRandomValues(buf);
  } while (buf[0] >= limit);
  return buf[0] % max;
}

function makePassword(length = 16) {
  return Array.from({ length }, () => ALPHABET[randomInt(ALPHABET.length)]).join("");
}

console.log(makePassword());

こちらも実行すると 16 文字が 1 行出ます。ブラウザと、crypto が使える Node.js で動きます。文字の種類を必ず含めたいときは、Python の例のように作った値を調べて、足りなければ作り直します。

コードを書いて動かす場所と、基礎から学べるコースは、下の関係する道具とレッスンに並べました。

よくある質問

パスワードジェネレーターとは何ですか

パスワードジェネレーター (パスワード生成ツール) は、長さや文字の種類を指定して、ランダムなパスワードを自動生成する道具です。人が考えると、誕生日や単語に寄って推測されやすくなります。乱数で作れば、そうした偏りが入りません。この頁の道具は、作った値をブラウザの中だけに置き、送信も保存もしません。

安全なパスワードの条件は何ですか

長いこと、乱数で作ってあること、ほかのサービスと使い回さないことの 3 つです。強さに効くのは文字の種類より長さで、英小文字だけの 12 文字 (56.4 ビット) は、英数字と記号を混ぜた 8 文字 (50.4 ビット) より強くなります。サービス側に求める最低の長さとして、NIST の指針 (SP 800-⁠63B 第 4 版) は、パスワードだけで認証するなら 15 文字以上、多要素認証の一部なら 8 文字以上を挙げています。

何文字にすればよいですか

この道具の初期値は 16 文字で、英大小文字と数字と記号を使うと約 102.6 ビットです。サービスが長さを制限していなければ、16 文字以上を目安にしてください。1 文字足すごとに約 6.4 ビット増えます。

大文字、小文字、数字、記号は混ぜたほうがよいですか

混ぜると使える文字が増えるので強くなりますが、効き方は長さより小さいです。英数字だけの 16 文字は 95.2 ビット、記号まで混ぜた 16 文字は 102.6 ビットで、差は 7.4 ビットです。NIST の指針は、サービス側が文字の種類の組み合わせを強制しないことを求めています。ただし、サービスの入力欄が混ぜることを求めているときは、その決まりに合わせてください。

作ったパスワードはどこかに送られますか

送られません。値はあなたのブラウザの中でだけ作り、サーバーへの送信も保存もしません。ブラウザの開発者ツールで Network の画面を開き、「もう一度作る」を押しても通信の行が増えないことで確かめられます。ページを閉じれば値は消えるので、作ったらすぐ保存先へ貼ってください。

Math.random では、なぜパスワードを作ってはいけないのですか

Math.random は暗号に使える乱数として作られていないためです。MDN Web Docs は、Math.random は暗号論的に安全な乱数を返さず、セキュリティに関わることには使わずに Crypto.getRandomValues() を使うよう書いています。この道具は crypto.getRandomValues だけを使っています。

同じパスワードを使い回すと、何が危険ですか

あるサービスから漏れたパスワードが、別のサービスの入口で試されるからです。NIST の指針 (SP 800-⁠63B 第 4 版) は、この攻撃を password stuffing と呼び、サービスごとに別のパスワードを使うことが防ぐ手立てとして大切だと書いています。使い回していると、最初に漏れた 1 件が手がかりになって、同じ組み合わせが通るサイトに次々と入られます。別の値にしておけば、被害は漏れたサイトだけで済みます。

パスワードは定期的に変えたほうがよいですか

NIST の指針 (SP 800-⁠63B 第 4 版) は、サービス側が定期的な変更を求めないこととし、漏えいの証拠があるときは変えさせることとしています。理由なく変え続けるより、長くて使い回していないパスワードにして、漏えいの疑いがあるときに変えるほうが筋に合います。

覚えられないときはどうすればよいですか

覚えようとせず、パスワードマネージャーか、ブラウザや OS の保存機能に入れます。この道具は作った値を記録しないので、作ったらその場で保存先へ貼ってください。保存先を守るために、そのアカウントでは多要素認証も有効にします。

記号の初期値は、どう選びましたか

初期値は 24 個です。OWASP が標準の US キーボードにある記号として挙げる 32 個 (空白を除く) から、引用符 2 個、バッククォート、バックスラッシュ、山括弧 2 個、アンパサンド、縦線の 8 個を引きました。この 8 個は、JSON、HTML、シェルの引用や設定ファイルに貼ったときに別の意味を持ちやすく、貼り付けで壊れる原因になるためです。規格の値ではなく、ゆめさくが置いた初期値です。OWASP の頁には、OS やアプリケーションが使える記号を制限することがあるとも書かれています。受け付けない記号があるサイトでは、「使う記号」の欄から消してください。

見間違えやすい文字を除くと、弱くなりますか

使える文字が減るので、少しだけ弱くなります。初期設定の 16 文字では約 1.7 ビット下がります。除くのは I、l、1、|、O、o、0 の文字です。紙に書き写す、電話で伝える、画面を見て手で打つ場面で使い、気になるなら 1 文字か 2 文字長くして補います。

「同じ文字を使わない」は入れたほうがよいですか

サービスが求めていない限り、入れないほうが強くなります。初期設定の 16 文字では約 2.1 ビット下がります。同じ文字が続かないので強く見えますが、実際には作れる並びが減るだけです。

数字だけの暗証番号も作れますか

作れます。英大文字、英小文字、記号を外し、数字だけにして長さを決めてください。4 桁の数字は 13.3 ビットしかなく、数字だけの 8 文字でも 26.6 ビットです。入力の回数に制限がある画面で使う番号には足りても、データを盗まれたあとに総当たりされる場面には向きません。

何個もまとめて作れますか

作れます。個数の欄に 1 から 1000 までの数を入れると、同じ設定で独立に作った値が並びます。全部をまとめてコピーすることも、テキストファイルで保存することもできます。

書き手と日付と出典

書き手
ゆめさく
公開日
更新日
  • NIST SP 800-63B Digital Identity Guidelines Authentication and Authenticator Management

    第 4 版 (2025 年 7 月に最終版として公開) ・ に本文を読んで確かめました

    パスワードだけで認証するなら 15 文字以上、多要素認証の一部なら 8 文字以上を最低の長さにすること。64 文字以上の長さを受け付けることが望ましいこと。文字の種類の組み合わせの規則を課さないこと。定期的な変更を求めず、漏えいの証拠があるときは変えさせること。新しいパスワードを、よく使われる値や漏えいした値の一覧と照合すること。ほかのサイトで漏れたパスワードを使う password stuffing を避けるために、サービスごとに別のパスワードを使うことが大切だと、パスワードの使い勝手の節に書かれていること。

  • OWASP Password special characters

    OWASP Foundation のコミュニティの頁 (版や公開日の表記は無し) ・ に本文を読んで確かめました

    標準的な US キーボードにある記号として、空白を含めて 33 個を表に挙げていること (空白を除くと 32 個)。OS やアプリケーションによっては、使える記号が制限されることがあると書かれていること。

  • MDN Web Docs Math.random()

    MDN Web Docs の英語版 ・ に本文を読んで確かめました

    Math.random() は暗号論的に安全な乱数を返さないので、セキュリティに関わることには使わず、Crypto.getRandomValues() を使うよう書かれていること。

  • MDN Web Docs Crypto.getRandomValues()

    MDN Web Docs の英語版 ・ に本文を読んで確かめました

    暗号論的に強い乱数を返すこと。実装は十分なエントロピーで種を与えた疑似乱数生成器で、暗号の用途に向くこと。

  • Python 3 ドキュメント secrets 秘密を扱うための安全な乱数

    Python 3 の英語版 ・ に本文を読んで確かめました

    secrets はパスワードなどの秘密を扱うのに向いた、暗号論的に強い乱数を作ること。random モジュールより secrets を使うよう書かれていること。

次の一歩

パスワードを作ったあとは、破られ方と守り方を知ると、設定の理由が分かります。自分で作れるようになりたい人は、コースで基礎から進めてください。

ツールの一覧へ戻る