ハブレに関する議論の痕跡に続いて、主要なポイントを収集します。
- 検証はpasswdcheck.jsとして実装されます 。
- 実験では、テストでは耐久性を大幅に低下させる最も単純なことを考慮していないことが示されています。
- キャッチーで複雑なパスワードを作成するためのマイクロソフトの推奨事項 。
コードの分析により、1つではなく、2つのパスワード強度アナライザー全体が含まれていることがわかりました。現在のアナライザーは非常に単純化され、古いアナライザーはさらに深いものです。
現在のアナライザーから始めましょう。現在のアナライザーに従って動作します。 2番目の部分は、古いものの分析です。
- パスワード強度レベルは、範囲[0; 4]計算された「ビット抵抗」 ビットに応じて
- ビット ≥128-4
- 128 < ビット ≥64-3
- 64 < ビット ≥56-2
- ビット <56-1
- 空のパスワード-0
- 「ビット抵抗」を評価するには、式を使用します
どこでbits = log(charset)*(length/log(2))
- ビット -ビット抵抗
- log-自然対数
- length-パスワードの長さ
- charset-以下の各タイプのセットの合計サイズ(行に存在する場合):
- 小さい英字[ abcdefghijklmnopqrstuvwxyz ];
- 大文字の英字[ABCDEFGHIJKLMNOPQRSTUVWXYZ] ;
- 特殊文字[〜 `!@#$%^&*()-_ + ="] ;
- 番号[1234567890] ;
- 他のキャラクター
var alpha = "abcdefghijklmnopqrstuvwxyz"; var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var upper_punct = "~`!@#$%^&*()-_+="; var digits = "1234567890"; var totalChars = 0x7f - 0x20; var alphaChars = alpha.length; var upperChars = upper.length; var upper_punctChars = upper_punct.length; var digitChars = digits.length; var otherChars = totalChars - (alphaChars + upperChars + upper_punctChars + digitChars); function GEId(sID) { return document.getElementById(sID); } function calculateBits(passWord) { if (passWord.length < 0) { return 0; } var fAlpha = false; var fUpper = false; var fUpperPunct = false; var fDigit = false; var fOther = false; var charset = 0; for (var i = 0; i < passWord.length; i++) { var char = passWord.charAt(i); if (alpha.indexOf(char) != -1) fAlpha = true; else if (upper.indexOf(char) != -1) fUpper = true; else if (digits.indexOf(char) != -1) fDigit = true; else if (upper_punct.indexOf(char) != -1) fUpperPunct = true; else fOther = true; } if (fAlpha) charset += alphaChars; if (fUpper) charset += upperChars; if (fDigit) charset += digitChars; if (fUpperPunct) charset += upper_punctChars; if (fOther) charset += otherChars; var bits = Math.log(charset) * (passWord.length / Math.log(2)); return Math.floor(bits); } function DispPwdStrength(iN, sHL) { if (iN > 4) { iN = 4; } for (var i = 0; i < 5; i++) { var sHCR = "pwdChkCon0"; if (i <= iN) { sHCR = sHL; } if (i > 0) { GEId("idSM" + i).className = sHCR; } GEId("idSMT" + i).style.display = ((i == iN) ? "inline" : "none"); } } function EvalPwdStrength(oF, sP) { var bits = calculateBits(sP); if (bits >= 128) { DispPwdStrength(4, 'pwdChkCon4'); } else if (bits < 128 && bits >= 64) { DispPwdStrength(3, 'pwdChkCon3'); } else if (bits<64 && bits>=56) { DispPwdStrength(2, 'pwdChkCon2'); } else if (bits<56) { DispPwdStrength(1, 'pwdChkCon1'); } else { DispPwdStrength(0, 'pwdChkCon0'); } }
結論 : 些細なことは良いことを意味しません。 このアルゴリズムは、パスワードの強度の多くの側面を完全に無視します-たとえば、辞書攻撃や文字の繰り返し
続き、 パート2を参照