PHP & Passwort verschlüsseln

06/18/2014 00:06 Masterkroko1#1
Frage ist recht Simple oder auch nicht.

Da ich seit längerem was neben meiner Ausbildung Zuhause programmieren wollte ist mir nun endlich was eingefallen.

Bevor ich aber einfach Anfangen wollte ich mich wegen der Sicherheit ein bisschen schlau machen. Ich bräuchte ein Verfahren (sehr sicheres Verfahren) um erstmal die Passwörter der User zu verschlüsseln.

md5 & sha1 sollen ja seid ner Zeit nicht mehr so sicher sein.

Habt ihr vll. irgendwelche Vorschläge? (neuste PHP Version läuft)
Was wär sicher?
Eventuell sha1("wortkette2" . Sha1("wortkette" . $passwort)); ?
oder gibt es von PHP "ganz neue" Funktionen die Passwörter verschlüsseln?
(
Nicht wundern das System auf meiner Arbeit läuft auf 4.3 oder so ...
und das System was auf 5.3 läuft ist intern und dort hab ich Passwörter noch nie gebraucht.
)

Um nette & hilfreiche Antworten wäre ich Dankbar

Wenn wer nebenbei noch Ideen hat wie man ein Chat zwischen 2 Personen sicher Verschlüsseln & entschlüsseln kann könnte er es auch gerne dazuschreiben. :)
06/18/2014 00:42 マルセル#2
PHP Code:
$sSalt openssl_random_pseudo_bytes(22);
$sSalt '$2a$%13$' strtr($sSalt, array('_' => '.''~' => '/'));
$sHash crypt($form->password$sSalt); 
Zum Login nutzt du dann halt:

PHP Code:
$bPasswordIsCorrect $sHash === crypt($_REQUEST['password'], $sHash); 
Das System wird bspw. auch von Woltlab für das WBB genutzt.
06/18/2014 18:06 PixelTree#3
PHP liefert auch eine eigene Methode um Passwörter zu verschlüsseln - [Only registered and activated users can see links. Click Here To Register...]
06/19/2014 10:53 .aNNdii##4
Ich benutze sha1(hex2bin(sha1('string'), welches das Äquivalent zum mySQL PASSWORD hash ist, wobei ich den ersten sha1 Encryption auf der Clientseite via. jQuery durchführen lasse.
06/19/2014 19:09 マルコ#5
@.aNNdii:
Punkt 1, SHA1 ist schon lange nicht mehr sicher. Ein SHA1 Passwort übers netz zu schicken ist fast so, als ob du es nicht hashst. Nimm lieber SHA2 oder besser gleich SHA3. Dafür gibt es wunderschöne Libs.

Punkt 2: Ich trau dem MySQL PASSWORD Hash nicht. Ich denke, es hat Gründe, warum er nicht eingesetzt wird.


@OP: Das, was Maruseru sagt, ist eine Möglichkeit, basiert aber auf openssl. Falls du diese dependency weg haben willst, dann mach doch einfach sowas, wie
PHP Code:
/**
 * Generate a random string
 * 
 * @param integer $length
 * @param string $chars //Default: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
 * @return string random string made from $chars
 */
function randomString($length$chars 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890')
{
    
$chars_length = (strlen($chars) - 1);
    
$string $chars{rand(0$chars_length)};
    for(
$i 1$i $length$i strlen($string))
    {
        
$r $chars{rand(0$chars_length)};
        if(
$r != $string{$i 1})
        {
            
$string .= $r;
        }
    }
    
    return 
$string;
}

$salt randomString(8);

$hashedPW hash('sha512'md5($salt) . $pw); 
Ohne externe Abhängigkeiten funktioniert mein Skript in ziemlich jeder PHP Version; und sollte sicher sein. Über diese Variante haben auch schon tausende Augen geschaut, denn der Algo ist aus dem MyBB Quelltext genommen.
06/20/2014 22:55 supercracker13#6
Also md5 an sich ist nicht unsicher, nur nach einer gewissen Zeit könnte man das Passwort halt durch Bruteforce bekommen oder halt in entsprechenden Datenbank etwas schneller bekommen.

Dies würde sich aber vermeiden lassen wenn du bestimmte Pre/Post fixe benutzt.
Also zB. "passwort" = e22a63fb76874c99488435f26b117e37
Jetzt einfach nen Prefix davor abce22a63fb76874c99488435f26b117e37, hier "abc".
Dann ist es noch nicht mal mehr als md5 zu sehen (da die Länge nicht mehr stimmt) und solange der Prefix clever gewählt ist (oder sogar andere Sachen in den ursprünglichen Hash eingearbeit sind), wird das ganze um einiges sicherer.

Musst dir nur ne kreative Lösung einfallen lassen um den Hash zu verändern, das es nicht überall gleich ist.
Das wäre jetzt so meine Idee ^^
06/21/2014 00:46 マルコ#7
@supercracker13: Sicherheit aufgrund Unwissenheit ist _keine_ Sicherheit. Sicher ist, wenn jeder weiß, wie es gehasht wurde, aber es trotzdem keiner rückgängig machen kann ohne Probieren. Und MD5 ist in dem Fall einfach Mist, weil es inzwischen viele Verfahren gibt, die die Rückrechnung extrem stark beschleunigen (Rainbowtables).
Siehe zum Beispiel auch das Public Key Verfahren, das heute immer noch überall eingesetzt wird. Jeder weiß, wie es funktioniert und wo es eingesetzt wird. Aber es ist trotzdem sicher.