Ankündigung

Einklappen
Keine Ankündigung bisher.

Passwort generieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Passwort generieren

    Hallo,

    hab hier einen Passwort-Generator geschrieben; generiert Passwoerter mit abwechselnd Vokalen/Konsonanten, so dass man sich das Passwort leichter merken kann. Zweideutige Zeichen werden ausgeschlossen:

    PHP-Code:
    <?php
            
    /**
             * create human-readable password (switched between vowels and consonants)
             * can create up to 13,000 different passwords
             * you might add uppercase characters to increase that
             *
             * @example
             * <code>
             * $strPassword = ..GeneratePassword(); // akirot5379
             * </code>
             * @param int $intCharLength amount of prefixed chars used
             * @param int $intNumberLength amount of postfixed numbers used
             * @return string random password
             */
            
    public static function GeneratePassword($intCharLength 6$intNumberLength 4) {
                
    $strVowels     "aeiou";
                
    $strConsonants "bcdfghjklmnpqrstvwxyz";
                
    $strNumbers    "23456789"// no 1 and 0, too similar with l, i and O
                
                
    $intVowels     strlen($strVowels) - 1;
                
    $intConsonants strlen($strConsonants) - 1;
                
    $intNumbers    strlen($strNumbers) - 1;
                
                
    $strPassword "";
                
    $blnVowelOrConsonant = (bool)mt_rand(01);
                for (
    $i 0$i $intCharLength; ++$i) {
                    if (
    $blnVowelOrConsonant) {
                        
    $intChar mt_rand(0$intVowels);
                        
    $strChar $strVowels[$intChar];
                    } else {
                        
    $intChar mt_rand(0$intConsonants);
                        
    $strChar $strConsonants[$intChar];
                    }
                    
    $strPassword .= $strChar;
                    
    $blnVowelOrConsonant = !$blnVowelOrConsonant;
                }
                for (
    $i 0$i $intNumberLength; ++$i) {
                    
    $strPassword .= $strNumbers[mt_rand(0$intNumbers)];
                }
                return 
    $strPassword;
            }
    ?>
    (ist eine Methode, also entweder der User-Klasse hinzufuegen oder eine Funktion draus mache [public static entfernen])

    Vielleicht brauchts jemand.
    "Mein Name ist Lohse, ich kaufe hier ein."


  • #2
    Frage zum Verständnis:

    $strChar = $strVowels{$intChar};
    scheint identisch zu sein mit
    $strChar = substr($strVowels,$intChar,1);
    Das ist mir noch nirgends begegnet.

    Gibt es dazu einen Vorlese-Service?
    PHP-Code:
    if ($var != 0) {
      
    $var 0;

    Kommentar


    • #3
      Wenn du einen String hast kannst du auf eine bestimmte Position im String mit [] zugreifen. Das ganze Funktioniert auch mit {}, laut Manual soll das aber ab PHP6 nicht mehr unterstützt werden! Also am besten [] nutzen. Hier ein Beispiel:

      PHP-Code:
      $string 'hier mein Text';
      echo 
      $string[2]; // würde e ergeben, gezählt wird von 0 an. 
      Oder im Manual zum nachlesen [man]string[/man].

      Kommentar


      • #4
        Ja. Die gültige aber deprecated Variante dazu ist ein Array-gleicher Zugriff via
        char = string[int]
        Betrachtet quasi den String als Anreihung von Charakters mit numerischem Index. Geschwungene Klammern wurden wohl als Syntaxverbesserung eingeführt.
        Vgl.

        PHP: Strings - Manual unter
        String access and modification by character

        [EDIT] Sehe gerade es ist umgedreht. {} ist deprecated für php6, obwohl einige Lehrbücher was anderes schreiben...
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Danke, ich hab das gleich oben editiert!

          Ich bin vorhin beim Erstellen eines SSL Zertifikates auf "Challenge Password" gestossen, was ich auch gleich implementiert habe. Wir hatten schoneinmal darueber gesprochen, ob es Sinn macht das Passwort vor dem Verschicken vom Client (also JavaScript) als MD5 hashen zu lassen. Das hat nur einen Vorteil, wenn es abgefangen wird, der Angreifer kennt das Klartextpasswort nicht (kann also andere Accounts des Users nicht hacken). Er kennt aber nun dessen Hashsumme, die genausogut ist um diesen Account zu hacken.

          Beispiel:
          User gibt Passwort "secret" ein und klickt auf "Login". JavaScript ersetzt den String nun durch seine MD5 Hashsumme. PHP bekommt die Hashsumme und vergleicht sie direkt mit der in der Datenbank abgelegten Hashsumme fuer den Benutzer. Somit gewinnt man nichts.

          Mit "Challenge Password" erzeugt man nun einen zufaelligen Token, den man mit dem Login-Formular ausliefert. Nun passiert das gleiche wie oben, nur verbaut man zusaetzlich noch den Token bevor MD5 ausgefuehrt wird. Nun wird ein einmaliger MD5 Hash an den Server uebertragen, der nur fuer diese Session und einen einmaligen Versuch gueltig ist. Dieser MD5 Hash wird jetzt mit dem gehashten Passwort in der Datenbank und dem Token, den der Server in der Session gespeichert haben muss verglichen. Schlaegt der Vergleich fehl, wird das Loginformular erneut aufgerufen, diesmal mit einem neuen Token. So verlaesst das richtige Passwort und seine MD5 Summe niemals den Client und ist somit sicher.

          Technisch laeuft das dann so ab:
          - Server erzeugt Token z.B. in einem Hidden-Feld und
          - rendert damit das Loginformular.
          - Der Benutzer gibt sein Passwort ein und klickt auf "Login".
          - Der Event wird mit <input type="submit" onclick /> oder <form onsubmit /> abgefangen,
          - JavaScript hasht zunaechst das Passwort (denn der Server kennt das Klartextpasswort ja nicht, nur seine Hashsumme, wenn wir davon ausgehen, dass das Passwort bei der Registrierung als MD5-Hash in der Datenbank abgelegt wird).
          - Danach wird von dieser Passwort-Hashsumme und dem Token die Hashsumme erzeugt und
          - an den Server geschickt.
          - Der Server liest aus der Session den Token aus,
          - erzeugt mit ihm und dem gehashten Passwort aus der Datenbank die MD5-Summe und
          - vergleicht es mit der ankommenden Passwort-Hashsumme des Benutzers.

          In JavaScript also etwa so:
          challengePassword.js
          Code:
          function challengePassword(strPassword, strChallengePassword) {
              var objPassword = qcodo.getControl(strPassword);
              if (objPassword.value.length > 0) {
                  var objChallengePassword = qcodo.getControl(strChallengePassword);
                  objPassword.value = (objPassword.value.md5() + objChallengePassword.value).md5();
              }
              return true;
          }
          md5.js:
          Paj's Home: Cryptography: JavaScript MD5

          In MySQL:
          Code:
          MD5(CONCAT(`password`, '$SESSION[token]')) = '$POST[password]'
          (SQL-Injection beachten, nur zur Veranschaulichung direkt eingetragen)

          Was haltet ihr davon, hab ich etwas uebersehen (technisch)? Finde das Konzept gut, habe leider noch nicht so viel Literatur darueber gefunden, weder Wiki noch sonstwo.
          "Mein Name ist Lohse, ich kaufe hier ein."

          Kommentar


          • #6
            Gar nicht dumm. Hatte bisher ne Challenge nur als Schlüssel des input-names verwendet, also
            Code:
            <input type="password" name="passw[327t4605ert74r9q85]" />
            Das hilft aber nur gegen späteren Reload/Re-Submit des Logins und Auto-Fill.
            Konsequenterweise würde ich in Deiner Lösung oben noch auf das hidden field verzichten und die Challenge direkt in den Algoritmus oder ein globales Variablen Setting schreiben. Einfach damit die Challenge wirklich nur in der Session bekannt ist.

            Was noch dringend fehlt: Ein Flag Feld, das aktiviertes Javascript signalisiert. Sonst vergleicht sich PHP tot mit doppelt gehashtem Wert und Klartext-Passwort...
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              Hallo,
              wie meinst du das, auf ein hidden-Feld verzichten?

              Deaktiviertes JavaScript spielt keine Rolle, QForms funktionieren ohne JS garnicht erst Und dort habe ich es bisher nur im Einsatz. Achso und ich benutz autocomplete="off" fuer bestimmte Elemente (Captcha z.B.), ist zwar nicht valide aber wenn man weiss was man tut find ich das in Ordnung. Eine bessere Usability hat Vorrang.
              "Mein Name ist Lohse, ich kaufe hier ein."

              Kommentar


              • #8
                Hmm und wenn einer mein Passwort schon bei der Registrierung abfängt?

                Kommentar


                • #9
                  Guter Einwand, aber zumindest wird die Anzahl der Uebertragungen auf genau 1 reduziert, im Gegensatz zu unzaehligen Malen, naemlich einmal pro Login.

                  Denke auch hier laesst sich relativ einfach ohne JavaScript eine Loesung finden. Wer kein JS aktiviert hat, sendet das Passwort im Klartext, mit preg_match("/^[a-f0-9]{32}$/", ..) ja kein Problem festzustellen in welchem Format es ankommt.
                  "Mein Name ist Lohse, ich kaufe hier ein."

                  Kommentar

                  Lädt...
                  X