PHP: doppeltes Hashen von Passwörtern

  • PHP

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von 3daycliff.

    PHP: doppeltes Hashen von Passwörtern

    Hallo,

    kurz mal als Weiterführung zur Thematik in folgendem Post: Passwörter Schützen
    und auf PHP bezogen.

    ZIEL: doppeltes Hashen eines Strings per bcrypt und abgleich mit Wert (decrypt)
    SPRACHE: PHP
    PROBLEM: decrypt password_verify gibt nur ein bool zurück

    @Trade:
    angenommen man verwendet php und dort die funktion

    Quellcode

    1. password_hash
    . diese Funktion verwendet per default bcrypt. soweit so gut. um das passwort zu checken verwendet man

    Quellcode

    1. password_verify
    , wobei man den hash und das zu testende Passwort übergibt. Zurück kommt boolean

    Quellcode

    1. true/false
    .

    Nun könnte ich natürlich doppelt hashen per:

    Quellcode

    1. password_hash(password_hash($pw, PASSWORD_DEFAULT), PASSWORD_DEFAULT);



    jetzt ist mein Problem, dass ich beim password_verify ja nicht den ersten Hash herausbekomme sondern nur true/false.

    Wie kann man dann ein doppeltes Hashen incl. Abgleich beim Login verwirklichen? Jemand eine Idee?




    VG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Hallo @Acr0most,

    und aus welchen Grund möchtest Du das ganze Doppelt Hashen? Einen wirklichen Sicherheitsvorteil bekommst Du dadurch nicht... was die ganze Sache nicht wirklich verständlich für mich macht!

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Ruerte“ ()

    Das erschweren des Angriffs ist praktisch ein Einfluss auf die Sicherheit. Mehrfachiges hashen ist in jedem Fall sinvoller.

    Ich bin mir nicht sicher, aber ich glaube password_hash mit bcrypt hasht bereits mehrmals.
    Ansonsten gibt es noch PBKDF2 -> php.net/manual/de/function.hash-pbkdf2.php
    Um ehrlich zu sein: Mit dem Login und dessen Sicherheit beschäftige ich mich noch nicht lange.
    Und diese Frage entstand rein aus dem Post von Trade im oben verlinkten Thread.

    Aber wie du schon sagst, eine verlängerte Laufzeit und eine größere Angriffszeit sind meiner Meinung nach auch nicht zu vernachlässigende Vorteile.
    Ich habe mittlerweile die Idee, wenn ich ein pw doppelt hashe, den Input per Adapter 1x zu hashen und dann damit weiter zu arbeiten. aber in wiefern das etwas bringt, ist aus meiner Sicht nun auch wieder fraglich, da ich im Code einen erneuten Hash bilde, was ja auch nicht Sinn der Sache ist.


    Deshalb fände ich es cool auch andere Möglichkeiten für einen sicheren Login zu erfahren.


    VG Acr0most

    EDIT#1: @Rinecamo ich hab das komische Phänomen, dass sich bei der Funktion password_hash nur mit zusatz-parametern dazu bekomme, sich nicht bei jedem Refresh zu verändern. ist das normal?

    PBKDF2 schau ich mir mal an, danke dir :)
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    @Rinecamo gehen wir rein hypothetisch von einen ganz Simplen BruteForce aus (auf ein MD5)

    Passwort: Hallo
    Hash: d1bf93299de1b68e6d382c893bf1215f
    Hash vom Hash: 6b745f4514831ff4b93f77f58ed629e0

    würde der BruteForce nun mit der vorderen zahl anfangen 1 -> 2 -> 3 ... a -> b -> c würde der Hash vom Hash schneller herausgefunden als das Original!
    (Das ändert nix dran das dies zb. 65150009139058228497766923716720797655893503594612 ​ Kombinationen wären ^^)
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Ruerte“ ()

    PBKDF2 ist die andere Möglichkeit, die ich glaub in dem verlinkten Thread auch angesprochen habe. Doppeltes Hashen mit bcrypt nutze z. B. ich persönlich.
    Das WBB macht das bspw. auch so:
    github.com/WoltLab/WCF/blob/ma…il/PasswordUtil.class.php

    Ruerte schrieb:

    würde der Hash vom Hash schneller herausgefunden als das Original!
    Es geht darum, dass man den Hash eines Passworts nicht in den Klartext zurückbringen kann, wenn dieser abhanden kommt. Folglich erhöht da mehrmaliges Hashen mit einem Salt die Sicherheit schon sehr.
    BruteForce bringt Dir nichts, wenn Du nur den Hash an sich damit nachbildest, denn damit kannst Du Dich ja immer noch nicht anmelden bzw. das Passwort herausfinden. Das kommt auf dasselbe raus, wie wenn Du den in die Hand bekommst. Bei MD5 gibt es z. B. Rainbow Tables, wo für bestimmte Zeichenketten schon Hashes gebildet und gespeichert wurden, sodass man diese recht schnell abgleichen und auf den Klartext schließen kann. Mit einem Salt wird das dann schon schwieriger und durch mehrmaliges Hashen sowieso. Klar, möglich ist es theoretisch, aber der Zeitaufwand ist halt riesig.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    habe ich per PBKDF2 die Möglichkeit, den Blowfish-Alogrithmus zu verwenden?

    In der Liste php.net/manual/de/function.hash-algos.php finde ich nämlich nur md5, sha256, havel und so.
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Nein, Du kannst entweder PBKDF2 oder bcrypt nutzen. Das sind zwei Paar Stiefel.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Bei Verwendung von den PHP password_* solltest du darauf verzichten, selbst mehrmals zu hashen. Wenn bcrypt zum Einsatz kommt macht die Funktion das nämlich schon für dich und falls du das ändern möchtest, ist der richtige Weg, den cost-Parameter zu manipulieren. Beispiel:

    PHP-Quellcode

    1. $hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 20]);

    Wobei die Standardeinstellung vermutlich für deinen Anwendungsfall mehr als ausreichend ist.