[PHP] Passwort sicher verschlüsseln

Drucken
( 1 Vote )
Hauptkategorie: Programmieren Kategorie: PHP
Erstellt am 05.12.2012 Zuletzt aktualisiert am 05.12.2012 Geschrieben von Jonny132
In PHP gibt es viele Wege Daten zu verschlüsseln bzw. einen Hash zu generieren. Je nach Anwendungszweck sind die verschiedenen Wege jedoch eher geeignet oder eben nicht. Braucht man eine möglichst schnelle Möglichkeit Daten zu hashen so reicht ein einfaches aufrufen der md5()-Funktion.

Handelt sich es jedoch um Passwörter ist (allein) diese Funktion nicht zu empfehlen, da ihre abarbeitung wie gesagt ziemlich schnell vonstadten geht und somit ein gefundenes Fressen für eine Bruteforce-Attacke wäre.

Wesentlich sicherer ist die Hashgenerierung mittels der crypt()-Funktion. Diese Funktion braucht zur Ausführung etwas länger und erschwert so eine Bruteforce-Attacke.

Generierung des Hash mittels crypt()-Funktion:
<?php
$passwort = "";
$passwortHash = "";

if(isset($_POST['passwort']))
{
  $passwort = $_POST['passwort'];
  $passwortHash = crypt($passwort);
}

?>

<form method="POST" action="">
Ihr Passwort: <input type="password" name="passwort"/>

<br />
<?php
if($passwort != "")
{
  echo 'Ihr eingegebenes Passwort war: "' . $passwort .'".<br />Daraus wurde folgender Hash erzeugt: "' . $passwortHash . '".';
}
?>
In einem Input-Feld lassen wir den Benutzer sein Passwort eingeben das gehasht werden soll.
Wie ihr seht, ist der Aufruf nicht Aufwendig.


Überprüfen des Passworts mit dem Hash:
Ihr Vergleichs-Passwort: <input type="password" name="passwortTest"/>
<br />

<?php
if(isset($_POST['passwortTest']))
{
  if (crypt($_POST['passwortTest'], $passwortHash) == $passwortHash)
  {
    echo "Die zwei Passwörter stimmen überein";
  }
  else
  {
    echo "Die zwei Passwörter stimmen NICHT überein!";
  }
}
Auch dieser Code ist nicht schwer zu erklären. Es wird wiederrum ein Hash aus dem übergebenen Passworttext generiert und mit dem bereits vorhin generierten Hash verglichen. Sind beide gleich, so stimmen die Passwörter überein.

Als zweiten Parameter der crypt()-Funktion übergeben wir ebenfalls den Hash, da je nach Hash die Funktion unterscheiden kann, welcher Verschlüsselungsalgorythmus verwendet wurde.

Hinweis: Die crypt()-Funktion ist eine sogenannte Einwegverschlüsselung. Es gibt KEINE decrypt()-Funktion!

Produktives Beispiel

Vollständiger Code: 
<html>
 <head>
  <title>PHP Passwort verschlüsseln</title>
 </head>

 <body>

<?php
$passwort = "";
$passwortHash = "";

if(isset($_POST['passwort']))
{
  $passwort = $_POST['passwort'];
  $passwortHash = crypt($passwort);
}

?>

<form method="POST" action="">
Ihr Passwort: <input type="password" name="passwort"/>

<br />
<?php
if($passwort != "")
{
  echo 'Ihr eingegebenes Passwort war: "' . $passwort .'".<br />Daraus wurde folgender Hash erzeugt: "' . $passwortHash . '".';
}
?>

<br />
<br />
Ihr Vergleichs-Passwort: <input type="password" name="passwortTest"/>
<br />

<?php
if(isset($_POST['passwortTest']))
{
  if (crypt($_POST['passwortTest'], $passwortHash) == $passwortHash)
  {
    echo "Die zwei Passwörter stimmen überein";
  }
  else
  {
    echo "Die zwei Passwörter stimmen NICHT überein!";
  }
}
?>
</br>
<input type="submit" value="Passwörter hashen und überprüfen"/>
</form>

</body>
</html>



  • Jan

    schrieb am 2012-12-17 21:11:43

    Könntet ihr auch ein Tutorial dazu machen, wie man Daten ver- und auch wieder entschlüsseln kann?

    Auf Kommentar antworten

Veröffentlichen Sie ihre Kommentare ...