Microsoftパスワード強度アルゴリズム(パート1)

パスワード強度評価アルゴリズムに関する情報を検索しましたが、 Microsoft Password Checkerへのリンクを含むHabréのトピックを見つけました。 判明したように、耐久性テストは小さなJSスクリプトを使用して行われるため、検証アルゴリズムを詳細に文書化することが望まれていました。 誰かがこれまたはその結論がなされている理由を明らかにする必要があるかもしれませんし、一部はアルゴリズムを改善する必要があるかもしれません。



ハブレに関する議論の痕跡に続いて、主要なポイントを収集します。

  1. 検証はpasswdcheck.jsとして実装されます
  2. 実験では、テストでは耐久性を大幅に低下させる最も単純なことを考慮していないことが示されています。
  3. キャッチーで複雑なパスワードを作成するためのマイクロソフトの推奨事項
だから



コードの分析により、1つではなく、2つのパスワード強度アナライザー全体が含まれていることがわかりました。現在のアナライザーは非常に単純化され、古いアナライザーはさらに深いものです。



現在のアナライザーから始めましょう。現在のアナライザーに従って動作します。 2番目の部分は、古いものの分析です。

以下に、JSでこのアルゴリズムのソースコードを示します(テキストにあった余分なデバッグコメントは削除しました)。



 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を参照



All Articles