kostenloser Webspace werbefrei: lima-city


Passwort ertellen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    h***********r

    Hallo :)

    Ich bin gerade dabei mir alle 24h automatisch ein neues Passwort für den root Benutzer und ande meiner MySQL Datenbank zu erstellen. Meine Idee sieht dabei so aus, das man aus dem Datum werte irgendwie zusammensetzt und sie dann irgendwie Hashd. Letztendlich soll nur noch die Datenbank und das Script was auf sie zu greift wissen, wie das Passwort ist.

    Das ganze könnte z.Bsp so aussehen:
    setdate();
    
    function setdate(){
    $day = date("d"); //1-31
    $month = date("m"); //1-12
    $year = date("Y"); //xxxx
    $dayofyear = date("z");//1-365
    $dayofweek = date("N");//1-7
    $dayspermonth = date("t");//28-31
    $leapyear = date("L")+1;//0+1 or 1+1 //1-2
    generatecode($day, $month, $year, $dayofyear, $dayofweek, $dayspermonth, $leapyear);
    }
    
    function generatecode($day, $month, $year, $dayofyear, $dayofweek, $dayspermonth, $leapyear){
    //Bsp wie so etwas aussehen könnte
    $coderaw = round((($day*$year/$leapyear)*($day*$year/$leapyear)+($dayofweek*$month/$dayspermonth))*(($day*$year/$leapyear)-($day*$year/$leapyear)+($dayofweek*$month/$dayspermonth)));
    //Noch ein Beispiel
    $code = sha1(md5(sha1(crc32(md5($coderaw)))));
    irgendwasmitdatenbanken($code);
    }
    
    function irgendwasmitdatenbanken($code){
    	//Was auch immer
    }

    Das Passwort der Benutzer wird dann um 23:59 erneut 'generiert', dann eine Minute gewartet, dann das neue generiert und das dann mit update mysql.user set password=password('$codeneu') where user='root' z.Bsp eingesetzt.

    Hättet ihr eine Idee wie man das ganze System noch besser machen könnte?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. horstexplorer schrieb:
    Hättet ihr eine Idee wie man das ganze System noch besser machen könnte?


    - Die hierfür gedachte Funktionen von PHP verwenden: password_hash und password_verify (die Wahrscheinlichkeit, dass eigene Funktionen besser sind, ist sehr gering)

    - Keinen bekannten Wert (Daum), sondern einen wirklich zufälligen String generieren (Datum kann man schließlich ermitteln)

    - Den "root"-User deaktivieren (ein Sicherheitsrisiko weniger, man sollte eigene Nutzer für jedes Projekt anlegen und deren Rechte auf die jeweiligen Datenbanken / Tabellen beschränken)
  4. Autor dieses Themas

    h***********r

    - Keinen bekannten Wert (Daum), sondern einen wirklich zufälligen String generieren (Datum kann man schließlich ermitteln)

    Das Problem ist, dass das Passwort von zwei unabhänigen System errechnet werden können muss. Einmal um es festzulegen, und einmal um es Herrauszufinden und für die Anwendung zu benutzen. Das ganze muss also aus Konstanten bestehen die auf die gleiche Art verrechnet werden. Und da bleibt dann eigentlich nur noch die Zeit. Zudem man das ganze ja so wirr rechnen kann, dass man es eben nicht erraten kann.

    Ggf wäre hier aber eine Verrechnung die sich selbst aus der Zeit zusammensetzt noch etwas variabler als mein Beispiel.

    - Den "root"-User deaktivieren (ein Sicherheitsrisiko weniger, man sollte eigene Nutzer für jedes Projekt anlegen und deren Rechte auf die jeweiligen Datenbanken / Tabellen beschränken)

    Das wäre natürlich auch eine Idee. Allerdings kann ich, sowie ich das sehe sowieso nur über root die Passwörter der Datenbankbenutzer verändern. Wenn das ein anderer Account könnte wäre der ja ähnlich root.


    - Die hierfür gedachte Funktionen von PHP verwenden: password_hash und password_verify (die Wahrscheinlichkeit, dass eigene Funktionen besser sind, ist sehr gering)


    Nett gemeint, aber leider nicht anzuwenden.
    Ich will ein möglichst langes Passwort haben was aus allem möglichen besteht. Deswegen Hashe ich meinen Zahlenkette mit md5 etc, da das Ergebnis bei jedem Hash gleich ist. Dieser Wert ist dann das neue "Passwort" welches mit mysql password() in die mysql tabelle eingesetzt wird. Ein anderer Hash an der stelle (z.Bsp durch password_hash) wird an der stelle nicht funktionieren.
    Würde ich das Passwort mit password_hash hashen würde mir das nicht viel bringen da es ein oneway hash ist welchen ich ohne Passwort nicht überprüfen kann, da es ja mein Passwort ist. Zudem nutzt mysql password() ggf einen anderen Algorithmus was dazu führen kann, dass ich mich selbst aussperre.

    Trotzdem danke :)

    Ich hätte noch als Idee statt mit der Zeit direkt, die jeweils n't Stelle von Pi +5 Zeichen raus zu ziehen. Das würde das ganze etwas schwieriger zu durchschauen machen.

    Beitrag zuletzt geändert: 12.11.2017 20:07:55 von horstexplorer
  5. Dieser selbst ausgedachte Algorithmus ist bestimmt interessant und eine nette Spielerei, hat aber leider entscheidende Nachteile.
    Zum einen lässt sich die wahre Sicherheit sehr schlecht abschätzen. Der Algorithmus ist schließlich geheim und du kannst als einziger beurteilen, wie sicher er sein wird. Da kann es schonmal passieren, dass du etwas übersiehst und eine Kryptoanalyse schneller zum Erfolg führt als du erwartet hättest.
    Zum zweiten lässt sich dieser Algorithmus schlecht vervielfältigen. Stell dir vor, du wärst Mitarbeiter eines IT-Unternehmens und müsstest diese Passwortänderung für insgesamt 100 Kunden implementieren. Würdest du dir 100 neue Algorithmen einfallen lassen?

    Ich empfehle daher, offene Algorithmen einzusetzen, deren Sicherheit gemäß Kerckhoffs Prinzip nur auf der Geheimhaltung eines Schlüssels beruht.

    Mein Ansatz sähe so aus:
    $key = "143105b7cdfbc1a9c055676b5ab370c2441131636b690283fd45c94564c64138";
    $date = date("d.m.Y");
    $db_password = hash_hmac("sha256", $date, $key);

    Meinen Beispielkey musst du natürlich austauschen, denn wenn er hier im Forum rumsteht, ist er logischerweise nicht sicher.

    HMAC ist dafür konzipiert, dass auch bei tausenden offengelegten Nachricht-Hash Paaren zu einer neuen Nachricht nicht der entsprechende Hash ermittelt werden kann, ohne den Key zu kennen.
    In diesem Fall bedeutet das konkret: Auch wenn jemand weiß, dass das einfache Datum zur Berechnung genutzt wird und über Jahre hinweg alle Datenbankpasswörter protokolliert hat, kann er ohne Key nicht das Passwort für den nächsten Tag errechnen.


    Und falls du diese Passwortänderung tatsächlich auch noch auf einem anderen Rechnernetz haben willst, kannst du einfach den Key austauschen anstatt einen neuen Algorithmus zu entwerfen.


    Ein entscheidendes Problem gibt es trotzdem noch: Wer den Programmcode in die Finger bekommt (und dabei ist es egal ob selbst implementiert oder meine HMAC Variante), der kann alle Passwörter, auch alle zukünftigen ermitteln. Du solltest deshalb in Erwägung ziehen, das Passwort jeden Tag auf einem deiner beiden Systeme zufällig zu erzeugen und auf eine sichere Weise auf das andere System zu übertragen.
  6. Nicht vergessen:
    1) Die Nutzertabellen mit "flush privileges;" neu laden.
    2) Ab 5.7 heißt die Spalte "authentication_string".
    3) Das beste Passwort nutzt auch nix, wenn du es im Klartext durchs Netz schickst.
    Also: Eine sichere Verbindung zum Server nutzen oder den MySQL-Server für verschlüssselte Verbindungen konfigurieren: https://dev.mysql.com/doc/refman/5.7/en/encrypted-connections.html
  7. Autor dieses Themas

    h***********r

    Dankeschön für die Tipps :)
    Ich habe mich nochmal rangesetzt um das ganze noch etwas mehr zu verpacken und sich verpacken lassen. Das ganze ist natürlich nur ein Beispiel wie man einzelne Aktionen lösen könnte :)
    <?php
    define( 'WP_DEBUG', true );
    ini_set('display_errors', 1);
    error_reporting(E_ALL);
    
    $mainkey ="123";
    setdate($mainkey);
    
    function setdate($mainkey){
    $day = date("d"); //1-31
    $month = date("m"); //1-12
    $year = date("Y"); //xxxx
    $dayofyear = date("z");//1-365
    $dayofweek = date("N");//1-7
    $dayspermonth = date("t");//28-31
    $leapyear = date("L")+1;//0+1 or 1+1 //1-2
    generatetimevalues($day, $month, $year, $dayofyear, $dayofweek, $dayspermonth, $leapyear, $mainkey);
    }
    
    function generatetimevalues($day, $month, $year, $dayofyear, $dayofweek, $dayspermonth, $leapyear, $mainkey){
    //Buntes Würfeln :D
    if($day % 2 != 0){$a=$day;} else{$a=$year;}
    if($month% 2 != 0){$b=$month;} else{$b=$dayofyear;}
    if($year% 2 != 0){$c=$year;} else{$c=$dayspermonth;}
    if($dayofyear% 2 != 0){$d=$dayofyear;} else{$d=$leapyear;}
    if($dayofweek% 2 != 0){$e=$dayofweek;} else{$e=$month;}
    if($dayspermonth% 2 != 0){$f=$dayspermonth;} else{$f=$dayofweek;}
    if($leapyear% 2 != 0){$g=$leapyear;} else{$g=$day;}
    //Einsetzen in simple Rechenaufgaben
    $ta = abs($a*$b);
    $tb = abs($a-$e);
    $tc = abs($g+$f);
    $td = abs($d/($a+$f));
    $te = abs($c*24);
    $tf = abs($g*$f*$a);
    $tg = abs($d-$e/(27-$f));
    $th = abs(($a+$b+$c)/($d-$e-$f));
    $tstr = round(abs(((($tg-$tf)*($td+$ta))+(2*$te))/($tc-$tb)));
    generatepistr($ta, $tb, $tc, $td, $te, $tf, $tg, $th, $tstr, $mainkey);
    }
    
    function generatepistr($ta, $tb, $tc, $td, $te, $tf, $tg, $th, $tstr, $mainkey){
    //Festlegen der Berechnungsgrenze von Pi
    $timevalues = array($ta, $tb, $tc, $td, $te, $tf, $tg, $th);
    $maxtimevalue = max($timevalues);
    $pilenth = $maxtimevalue+5;
    //Berechnen von Pi
    ob_implicit_flush(1);
    ob_start(NULL, 4096);
    $w = gmp_init(0);
    $k = 1;
    $n1 = gmp_init(4);
    $n2 = gmp_init(3);
    $d = gmp_init(1);
    $i = 0;
    $pi = null;
    while(true) {
       $u = gmp_div_q($n1, $d);
       $v = gmp_div_q($n2, $d);
       if(gmp_cmp($u, $v) == 0) {
          $pi = $pi."".gmp_strval($u)."";
          ++$i;
          if($i % 10 == 0) {
          }
          if($i == $pilenth) {
             break;
          }
          $u = gmp_mul($d, gmp_mul(-10, $u));
          $n1 = gmp_mul($n1, 10);
          $n1 = gmp_add($n1, $u);
          $n2 = gmp_mul($n2, 10);
          $n2 = gmp_add($n2, $u);
       } else {
          $k2 = $k << 1;
          $u = gmp_mul($n1, $k2 - 1);
          $v = gmp_add($n2, $n2);
          $w = gmp_mul($n1, $k - 1);
          $n1 = gmp_add($u, $v);
          $u = gmp_mul($n2, $k + 2);
          $n2 = gmp_add($w, $u);
          $d = gmp_mul($d, $k2 + 1);
          ++$k;
       }
    }
    //Ausgabe von Pi in $pi
    //Finden einzelner Abschnitte in pi
    $pia = substr($pi, $ta, 5);
    $pib = substr($pi, $tb, 5);
    $pic = substr($pi, $tc, 5);
    $pid = substr($pi, $td, 5);
    $pie = substr($pi, $te, 5);
    $pistr = round(abs(((($pia*$pic)/($pie-$pid))*$pib+$pic)*((round(pi())*$pie))));
    generatehash($mainkey, $tstr, $pistr);
    }
    
    function generatehash($mainkey, $tstr, $pistr){
    //Md5 oder SHA1
    if ($tstr % 2 != 0){$tstrhash = md5($tstr);} else {$tstrhash = sha1($tstr);}
    if ($pistr % 2 != 0){$pistrhash = sha1($pistr);} else {$pistrhash = md5($pistr);}
    //Zaubern mit hash_hmac("sha256", $value, $key);
    $keyla = hash_hmac("sha256", $pistrhash, $tstrhash);
    $keylb = hash_hmac("sha256", $tstrhash, $pistrhash);
    $keylc = hash_hmac("sha256", $tstr, $pistr);
    $keyld = hash_hmac("sha256", $pistr, $tstr);
    //Zusammenführen
    $keylx = "$keylc$keyla";
    $keyly = "$keylb$keyld";
    $keyz = hash_hmac("sha256", $keylx, $keyly);
    $key = hash_hmac("sha256", $keyz, $mainkey);
    ausgabe($key);
    }
    
    function ausgabe($key){
    echo $key;
    }

    Leider dauert das ganze relativ lang. Fürs Passwort generieren weniger das Problem, aber bei aufrufen in scripten ungeeignet, da es knapp 50s dauert. Evtl gebt das ganze schneller?
    Ankucken kann man es sich hier :)
    https://horstexplorer.lima-city.de/Key/

    Beitrag zuletzt geändert: 13.11.2017 19:11:21 von horstexplorer
  8. horstexplorer schrieb:
    Leider dauert das ganze relativ lang. Fürs Passwort generieren weniger das Problem, aber bei aufrufen in scripten ungeeignet, da es knapp 50s dauert. Evtl gebt das ganze schneller?
    Klar geht das schneller. Ich hab dir meinen Ansatz gepostet. Ein einzelner, richtig angewandter hash_hmac reicht aus, damit lässt sich in 86 Mikrosekunden ein neues Passwort berechnen. Machst du das Ganze komplizierter, dauert es natürlich entsprechend länger.
    Ich nehme an, dass die Berechnung von Pi bei dir sehr viel Zeit in Anspruch nimmt.
  9. Autor dieses Themas

    h***********r

    Habe das ganze Ding jetzt etwas anders zusammengebaut. Authentifizierung funktioniert IP basiert was auch in den Hash mit ein geht.
    Soweit scheint das ganze auch gut zu funktionieren. Allerdings kommunizieren die zwei Webserver intern nicht über ssl. Wie auch, gibt leider kein WAN loopback was ich nutzen könnte. Wie stelle ich das also an, dass nicht alle mitlauschen könnten.
  10. horstexplorer schrieb:
    Habe das ganze Ding jetzt etwas anders zusammengebaut. Authentifizierung funktioniert IP basiert was auch in den Hash mit ein geht.
    Soweit scheint das ganze auch gut zu funktionieren. Allerdings kommunizieren die zwei Webserver intern nicht über ssl. Wie auch, gibt leider kein WAN loopback was ich nutzen könnte. Wie stelle ich das also an, dass nicht alle mitlauschen könnten.

    Wo kommt denn jetzt der 2. Webserver her? Was hat SSL mit dem Interface zu tun?
    Was spricht dagegen beide Webserver einfach mit entsprechenden Zertifikaten auszustatten?


    Edit: Dass kein Loopback-Interface existiert kann ich mir auch nicht so wirklich vorstellen.

    Beitrag zuletzt geändert: 17.11.2017 18:16:50 von muellerlukas
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!