Siła hasła. [zamknięte]

Piszę skrypt mierzący siłę hasła.
Na razie taki prototypowy, bo mam problem.
Dlaczego nie działa mi poniższy kod?

<form name="register">
<input type="text" name="password" onkeyup="javascript: inspectPassword()"/>
<span id="resultsViewer"> </span> <br/>
<input type="submit" value="OK"/>
</form>
<script type="application/javascript">
/* <![CDATA[ */
var harmCodes = new Array(
 'qw', 'qa', 'qs', 'wq', 'wa', 'ws', 'wd', 'we', 'ew', 'es', 'ed', 'ef', 'er', 're', 'rd', 'rf', 'rg', 'rt', 'tr', 'tf', 'tg', 'th', 'ty', 'yt', 'yg', 'yh', 'yj', 'yu', 'uy', 'uh',
 'uj', 'uk', 'ui', 'iu', 'ij', 'ik', 'il', 'io', 'oi', 'ok', 'ol', 'op', 'po', 'pl', 'aq', 'aw', 'as', 'ax', 'az', 'sw', 'se', 'sd', 'sc', 'sx', 'sz', 'sa', 'sq', 'de', 'dr', 'df',
 'dv', 'dc', 'dx', 'ds', 'dw', 'fr', 'ft', 'fg', 'fb', 'fv', 'fc', 'fd', 'fe', 'gt', 'gy', 'gh', 'gn', 'gb', 'gv', 'gf', 'gr', 'hy', 'hu', 'hj', 'hn', 'hb', 'hg', 'ht', 'ju', 'ji',
 'jk', 'jm', 'jn', 'jh', 'jy', 'ki', 'ko', 'kl', 'km', 'kj', 'ku', 'lo', 'lp', 'lk', 'li', 'za', 'zs', 'zx', 'xz', 'xa', 'xs', 'xd', 'xc', 'cx', 'cs', 'cd', 'cf', 'cv', 'vc', 'vd',
 'vf', 'vg', 'vb', 'bv', 'bf', 'bg', 'bh', 'bn', 'nb', 'ng', 'nh', 'nj', 'nm', 'mn', 'mh', 'mj', 'mk'
);
var arrangeLetters = new Array('abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz');
var arrangeDigits = new Array('123', '456', '789', '012', '890');
function inspectPassword() {
 var password = document.forms["register"].elements["password"].value;
 var points = 0;
 var switchKeys = 0;
 for(i=0; i<=136; i++) {
  if ((password.indexOf(harmCodes[i]) < 17) || (password.indexOf(harmCodes[i].toUpperCase()) < 17)) switchKeys++;
  if (switchKeys == 3) break;
 }
 if (switchKeys == 0) points + 2;
 if ((switchKeys > 0) && (switchKeys < 3)) points++;
 var switchLetters = 0;
 for(i=0; i<=7; i++) {
  if ((password.indexOf(arrangeLetters[i]) < 17) || (password.indexOf(arrangeLetters[i].toUpperCase()) < 17)) switchLetters++;
  if (switchLetters == 3) break;
 }
 if (switchLetters == 0) points + 2;
 if ((switchLetters > 0) && (switchLetters < 3)) points++;
 var switchDigits = 0;
 for(i=0; i<=4; i++) {
  if (password.indexOf(arrangeDigits[i]) < 17) switchDigits++;
  if (switchDigits == 3) break;
 }
 if (switchDigits == 0) points + 2;
 if ((switchDigits > 0) && (switchDigits < 3)) points++;
 if (password.length == 8) points++;
 if (password.length > 8) && (password.length < 10)) points + 2;
 if ((password.length >= 10) && (password.length <= 12)) points + 3;
 if (password.length > 12) points + 4;
 var resultsViewer = document.getElementById("resultsViewer");
 var description;
 if (points == 1 || 2) description="<span class='veryRed'>słabe</span>";
 if (points == 3 || 4) description="<span class='red'>przeciętne</span>";
 if (points == 5 || 6) description="<span class='orange'>średnie</span>";
 if (points == 7 || 8) description="<span class='green'>mocne</span>";
 if (points == 9 || 10) description="<span class='veryGreen'>bardzo mocne</span>";
 resultsViewer.innerHTML = description;
}
/* ]]> */
</script>
<style type="text/css">
/* <![CDATA[ */
span {
 font-weight: bold;
}
.veryRed {
 color: #990000;
}
.red {
 color: #ff0000;
}
.orange {
 color: #ff5000;
}
.green {
 color: #00ff00;
}
.veryGreen {
 color: #009900;
}
/* ]]> */
</style>

Tablica harmCodes przechowuje niebezpieczne powiązania między klawiszami.
Ja biorę pod uwagę, że np. qwaszx jest łatwiejsze do złamania niż xilvra.
Wystarczy spojrzeć na drogę, jaka zostaje pokonana podczas wpisywania tych haseł.
Wyrafinowane narzędzia crackerskie analizują właśnie to.
Jak na moje, skrypt powinien działać.
Ale nie działa, nie wiem czemu.

Powód zamknięcia: Udzielono odpowiedzi na pytanie, poprawna odpowiedź została zaakceptowana

  • A nie prościej tak:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Sprawdzanie hasła</title>
    <script language="javascript">
    /* <![CDATA[ */
    function haslo () {
    var silaHasla = document.getElementById('silaHasla'); 
    var pass = document.getElementById("password"); 
    if (pass.value.length > 5) {
      silaHasla.innerHTML = '<span style="color:red">Silne Hasło</span>';
     }
    }
    /* ]]> */
    </script>
    </head>
    
    <body>
    
    <form>
    <input type="text" name="password" id="password"  onkeyup="return haslo();"/>
    <input type="text" name="login" id="login"/>
    <span id="silaHasla">Siła Hasła</span>
    </form>
    </body>
    </html>
    

    Bo masz niepotrzebną ingerencję w ten formularz z loginem

  • Po pierwsze skrypt js musi być pod formularzem.

    Po drugie:

    var passwordField = form.password.value;
    

    nie istnieje, zamiast tego użyj np. :

    var passwordField = document.forms["myform"].elements["password"].value;
    

    pamiętając żeby <form> zmienić na <form name="myform">.

    I po trzecie zamiast loginField.click(scanForce()); spróbuj do elementu formularza dodać tzw. JavaScript event np. onchange="scanForce()" lub onclick="scanForce()"

    I będzie działać ;)

    Pozdrawiam

  • Ok dzięki, już mam rozwiązanie.

    <form name="loginForm">
    <input type="password" name="password" onchange="scanForce()" maxlength="16"/>
    <input type="text" name="login" id="login"/>
    <div id="passwordForce"> </div>
    </form>
    <script language="JavaScript" type="application/javascript">
    /* <![CDATA[ */
    var passwordForce = document.getElementById("passwordForce");
    var loginField = document.getElementById("login");
    function scanForce() {
     var passwordField = document.forms["loginForm"].elements["password"].value;
     if (passwordField.length < 5) passwordForce.innerHTML="<span class='red'>słabe</span>";
     if ((passwordField.length >= 6) && (passwordField.length < 10)) passwordForce.innerHTML="<span class='orange'>średnie</span>";
     if (passwordField.length >= 10) passwordForce.innerHTML="<span class='green'>mocne</span>";
    }
    /* ]]> */
    </script>
    <style type="text/css">
    /* <![CDATA[ */
    .red {
     color: #ff0000;
    }
    .orange {
     color: #ff5000;
    }
    .green {
     color: #009900;
    }
    /* ]]> */
    </style>
    

  • To nie jest takie proste! O ile miarą "siły" losowo generowanego hasła jest jego entropia, o tyle w przypadku haseł tworzonych przez użytkowników sprawa jest dużo bardziej skomplikowana i na dobrą sprawę nie do końca sprecyzowana.

    Password strength

    Random Password Strength

Zaloguj się, aby dodać swoją odpowiedź