パスワード生成
仮パスワードの発行など、パスワード生成をシステム内で行う必要がある。
何らかの外部システムに対するパスワード生成が必要となる。
単純に考えれば乱数を使って適当に文字を選び出すだけだが、実際の利用を考えると望ましいパスワードとして一定のルールを課す必要がある。
外部システムではパスワードの形式を制限していることがある。
現代におけるパスワードは最低12文字程度のランダム文字列が最も適切。
記号などよりも長さが重要。
複数の単語の組み合わせ(foo-bar-baz のようなもの)は、覚えやすいが、単語数のn乗まで組み合わせ数が下がってしまう。(アタックされやすい)
文字種の指定
記号必須な場所がある。
文字種の出現数の指定
同じ文字が何度も出現しすぎない。
別種の文字が含まれるようにする。
区別の付かない(付きにくい)文字の除外
自動システムでは余り問題にならないが、人間が入力するときには問題となる。
0(ゼロ),O(大文字オー),o(小文字オー)
1(いち),I(大文字アイ),l(小文字エル),|(縦線)
8(はち),B(大文字ビー)
9(きゅう),Q(大文字キュー),q(小文字キュー) (発音)
\ (U+005c) (バックスラッシュ, 円記号) (日本ではフォントが安定しない。文字化けすることがある。)
,(カンマ),.(ピリオド)
;(セミコロン),:(コロン)
'(シングルクォーテーション),\`(ダブルクォーテーション)
説明困難な文字の除外
人が言葉で説明するときに、正しく説明できないことがある。
記号の正式な読み方を意外とみんな知らない。
実際に作る場合には以下のようなものになるはず。速度は気にしない。文字として使うのはASCII範囲のみとする。
code:pseudo.js
function randomSelectOneChar(chars:string, generateRandomInt) {
const n = generateRandomInt(0, chars.length);
return chars.charAt(n);
}
function generatePassword(charsList:string[], len:number, generateRandomInt) {
// charsList からそれぞれ1文字抽出(特定の文字種の混在が必須な場合がある)
const a1 = charsList.map((chars) => {
randomSelectOneChar(chars, generateRandomInt);
});
// すべてを合成した文字列から残りの文字を抽出
const joinedChars = charsList.join("");
const a2 = randomSelectOneChar(joinedChars, generateRandomInt);
const a = a1.concat(a2);
// シャッフル
const r = shuffle(a, generateRandomInt);
return r.join("");
}
関連