パスワードは毎回 ランダムに生成されます。
気に入ったパスワードをタップするとコピーできます。
ぜひ、ツールページを「ブックマーク(お気に入り)」に登録して、必要なときに利用してください。
YouTube動画でも話しています。
1. 入力しやすいパスワードの特徴
このパスワード生成ツールでは、視覚的に区別しにくい文字は避けるように選ばれます。
また、はじめにスマホのタッチ操作で入力が面倒な文字を固めて、残りは入力しやすい数字を多めにしています。
パスワードは合計で12文字になるように、先頭から以下のルールで生成しています。
- 記号1文字(!@#$%^&*()_+)
- 英字3〜5文字(先頭だけは大文字)
- 数字4〜6文字
- 残りは英字(なくてもよい)
どの範囲が数字かわからないように各文字数には幅を持たせています。
パスワード生成部分のアルゴリズムは(JavaScript)、
const symbols = "!@#$%^&*()_+";
const letters = "abcdefghijkmnopqrstuvwxyz";
const numbers = "23456789";
let password = "";
// 記号を1つ追加
password += symbols[Math.floor(Math.random() * symbols.length)];
// 英字を3~5個追加
const lettersCount1 = Math.floor(Math.random() * 3) + 3;
let passwordLetters1 = "";
for (let j = 0; j < lettersCount1; j++) {
passwordLetters1 += letters[Math.floor(Math.random() * letters.length)];
}
password += passwordLetters1.charAt(0).toUpperCase() + passwordLetters1.slice(1);
// 数字を4~6個追加
const numbersCount = Math.floor(Math.random() * 3) + 4;
for (let j = 0; j < numbersCount; j++) {
password += numbers[Math.floor(Math.random() * numbers.length)];
}
// 残りの文字数を英字で埋める
const remainingCount = 12 - password.length;
for (let j = 0; j < remainingCount; j++) {
password += letters[Math.floor(Math.random() * letters.length)];
}
実際に使ってみると (Ccなどが似ている文字もあります。
しかし、規則をみると記号か英字か特定できます。
1-1. 純粋なエントロピーよりも使いやすさと安全性のバランスを取った
とはいえ、このパスワードは入力しやすいものの、
厳密には完全ランダムなパスワードに比べて複雑でない、
という問題点は残ります。
しかし、これは「トレードオフ」です。
スマートフォンに慣れていない方でも、パスワードを使い回さずに済むように考えたからです。
試しに、自分で両方のパスワードをトグル入力してみると、42秒 対 26秒 でした。
約6割増しのスピードで入力できました。
- タッチ操作が苦手な方だと、特に入力途中の文字種の変更が大変です。
- また、書き写したときに大文字・小文字がわからなくなってしまうことが多いです。
- しかもパスワードの入力でエラーになると、CAPTCHA認証や確認コードなどより複雑な操作が必要になり、「泥沼」状態になってしまいます。
そうすると、パスワードの入力エラーが発生しやすくなります。
文字数が多くなると、「ノーミス」で入力するのは「現実的には無理」というケースもあるのです。
このようなトラブルが続くと、いつも覚えやすい簡単なパスワードを使いまわしてしまいがちになります。
パスワードの管理において、ある程度の使いやすさも必要です。
2. パスワードの強さについて(エントロピー)
でも、このパスワード、完全にはランダムではないよね。
安全なの?
生成されるパスワードは推測が困難で、「総当たり攻撃」に対する耐性が十分にあります。
パスワードの強さを計算してみましょう。
それには、「予測の難しさ」や「ランダムさの度合い」を表す、「エントロピー」を使います。
エントロピーは、取りうるパターンの多さを対数で示します。
これが重要なのは、「総当たり攻撃」で調べ尽くすのにかかる時間に関係するからです。
エントロピーが 1 増えるごとにかかる処理時間は 2倍になります。
2-1. このパスワードのエントロピーと強度
このツールで生成されるパスワードのエントロピーを概算してみます。
計算途中で大き過ぎる値にならないように対数を使って、全体の組合せ数を計算しました。
- まず、先頭1文字は記号で固定されます。
- 残りの11文字のうちパスワードで使う数字の文字数(4文字〜6文字)で場合分けをします。
そうすると、それ以外は英字になります。 - 11文字中に数字はまとまって配置されるので、開始位置によって場合分けになります。
- あとは、英字・数字をそれぞれ決まった個数を順列に並べればパスワードは決まります。
そのまま足すことはできないので、端数の部分を2の累乗にして合計し、また対数を取り直します。
46+log_2(2^3.41 + 2^1.77 + 2^0.13) ≈ 49.92ビット
つまり、この生成ルールを知られている場合でも、完全にランダムに組み合わせた場合の約 7.9文字分のパスワードと同程度の複雑さになっていると言えます。
ただし、通常は攻撃者にこの生成ルールは知られていないはずで、その場合は75.4ビットに相当する処理時間がかかることが期待されます。
もし、心配なら2つ3つ重ねて長いパスワードにすると「セキュリティ専門家も納得」のレベルになります。
なんのためにエントロピーを計算したんやら……(笑)
3. 内部処理の説明(JavaScript)
このツールは、スマホのブラウザ内で動作します。
ページでは、JavaScriptによってパスワード生成の手順を示すだけ。
動作はスマホ本体内で完結しています。
パスワードを自動的に生成し、生成されたパスワードをクリックするとクリップボードにコピーされ、ポップアップメッセージが表示されます。
function generatePasswords() {
const symbols = "!@#$%^&*()_+";
const letters = "abcdefghijkmnopqrstuvwxyz";
const numbers = "23456789";
let passwordsList = "<ul>";
for (let i = 0; i < 10; i++) {
let password = "";
// 記号を1つ追加
password += symbols[Math.floor(Math.random() * symbols.length)];
// 英字を3~5個追加
const lettersCount1 = Math.floor(Math.random() * 3) + 3;
let passwordLetters1 = "";
for (let j = 0; j < lettersCount1; j++) {
passwordLetters1 += letters[Math.floor(Math.random() * letters.length)];
}
password += passwordLetters1.charAt(0).toUpperCase() + passwordLetters1.slice(1);
// 数字を追加(パスワードの長さが12文字に満たない場合は増やす)
let numbersCount = 12 - password.length - 2; // 英字2~3個分を予約
if (numbersCount < 1) {
numbersCount = 1;
}
for (let j = 0; j < numbersCount; j++) {
password += numbers[Math.floor(Math.random() * numbers.length)];
}
// 英字を2~3個追加
const lettersCount2 = Math.floor(Math.random() * 2) + 2;
let passwordLetters2 = "";
for (let j = 0; j < lettersCount2; j++) {
passwordLetters2 += letters[Math.floor(Math.random() * letters.length)];
}
password += passwordLetters2;
passwordsList += `<li class="password-item" onclick="copyPassword(this)">${password}</li>`;
}
passwordsList += "</ul>";
document.getElementById("passwords").innerHTML = passwordsList;
}
function copyPassword(element) {
const password = element.innerText;
navigator.clipboard.writeText(password).then(function() {
showPopup(password);
});
}
function showPopup(password) {
const popup = document.getElementById("popup");
popup.innerText = `${password} をコピーしました`;
popup.style.display = "block";
setTimeout(function() {
popup.style.display = "none";
}, 2000);
}
window.onload = function() {
generatePasswords();
};
3-1. 関数とイベントの定義
このコードは、
- ユーザーがボタンをクリックするとパスワードが自動的に生成され、
- 生成されたパスワードをクリックするとクリップボードにコピーされ、
- ポップアップメッセージが表示される、
という一連の機能を提供しています。
簡単に強力なパスワードを生成し、すぐにコピーして使用できます。