#やりたいこと
「パスワードって昔は定期的に変えたほうがいいって言ってたよね」
「今は変えなくていいというけどほんとに大丈夫?」
をはっきりさせる。
#前提
###パスワードポリシー
- 4文字固定(短いですね。。でもここは本質ではないので!)
- 小文字と数字のみ(つまり36文字)
- アカウントロックアウトはない(攻撃者の試行回数は無制限)
###攻撃者
- 全パターンを片っ端から施行(BF:ブルートフォース)
- 一周して見つからなかったら最初から
- 見つかるまで繰り返す
###ユーザーA(パスワード変えないマン)
- 初期パスワードをランダムに生成
###ユーザーB(パスワードを定期的に変えるマン)
- 初期パスワードをランダムに生成
- 攻撃者が1000回施行するごとにパスワードをランダムに再生成
やってみよう
コードはこんな感じ
const chars = "0123456789abcdefghijklmnopqrstuvwxyz".split("");
const next = (str) => {
if(!str) return '0000';
let newStr = str;
for(let i = str.length-1; i >= 0; i--) {
const c = str[i];
if(c == chars[chars.length-1]) {
newStr = newStr.slice(0,i) + chars[0] + newStr.slice(i+1);
} else {
newStr = newStr.slice(0,i) + chars[chars.indexOf(c)+1] + newStr.slice(i+1);
return newStr;
}
}
return null;
}
const creatPass = (len) => {
const array = [];
for(let i = 0; i < len; i++){
array.push(chars[ Math.floor( Math.random() * chars.length)]);
}
return array.join("");
}
/* パスワード変えないマンの場合 */
const tryDo =() => {
const pass = creatPass(5);
let tryString = null;
let tryNum = 0;
while(true) {
tryNum++;
tryString = next(tryString);
if(tryString == pass) {
return tryNum;
}
}
}
/* パスワードが見つかるまでの試行回数の平均(N=3000)を出す */
const NUM = 1000;
let sum = 0;
for(let i = 0; i<=NUM; i++) {
const res = tryDo();
sum += res;
}
/* 結果 */
console.log(sum/NUM);
#結果
平均試行回数(N=3000) | |
---|---|
パスワードを変えない場合 | 851494.327 |
パスワードを定期的に変えた場合 | 1694579.233 |
###約二倍
#なぜ定期変更は不要なの?
- ブルートフォースによるパスワードクラックにおいて、2倍程度の試行回数であることは"十分な攻撃困難性"を保証できない
- 定期変更させるとユーザーの記憶コストが上がり以下のことが起こる可能性がある
- 安易なパスワードをつける
- 連番でパスワードをつける(Password1 → Password2 → Password3)
- 付箋等で書いたものをPCなどに張り付けている
#でも・・・
###パスワードの定期変更って、漏洩したときの対策でしょ?
一般的にはそうですが、漏洩した場合はすぐ施行される可能性があるので、数か月に1度のパスワード変更がどれぐらい効果があるのか・・・
また、現在は昔ほど生のパスワードが漏洩することは考えにくく、パスワード漏洩からの不正ログインは攻撃者にとって現実的ではない。(場合による)
###まだまだ定期変更をポリシーにしてるサービスあるよね
あります。これには
- ビジネス上の理由(顧客からの要求など。とくにBtoB)
なども理由としてはあると思います。
#結局
定期変更によりランダムな文字列を高頻度で変えればクラック成功までに試行回数を増やすことはできたが、
ほとんどの利用者はランダムな文字列にしているわけではなく、攻撃者はより効率的なアルゴリズムを用いてクラックしてきます。
例えば、辞書攻撃などは、攻撃対象の情報(名前、ペットの名前、誕生日、車の番号など)を組み込んだリストの組み合わせを行うものもあります。
また、安易な類似文字変換(o → 0, s→$ など)も行うツールもあります(John the Ripperなど)
なので、"セキュリティ強化"のためのパスワード定期変更の強制は不要だと思っています。
#一般的な対策
- 安易なパスワードをつけさせない
- DropBoxが出してるパスワード強度チェックOSS
- ハッシュ時にソルトをつける
- パスワードを使いまわすユーザーにおいては、他サービスへの被害拡大を防ぐのも重要です
- パスワードは文字種を増やすより文字数を長くする
- BFに対して数学的に安全です。
- 最近では複数の単語をハイフンつなぎで繋げたパスワードが良いとされています。
- 例:soccer-daihuku-apple など(6単語ぐらいを目安)
- 日本語の単語を入れるといいらしいが、まあ小手先の対策だと思います。複雑さより長さのほうが大切