PHP-Einfach.de
  • PHP Tutorial
  • MySQL Tutorial
  • Für Fortgeschrittene
  • Webhosting
  • Forum

Codeschnipsel

Passwort Hash API für >= PHP 5.1.2

Zurück zur Übersicht
Eine API zum sicheren Abspeichern von Passwörtern.

Moin zusammen!

Ich hatte ein wenig Langweile und hab mir gedacht, ich schreibe einfach mal zwei kleine Funktionen, die an die neue Passwort-API von PHP 5.5 angelehnt ist (deswegen auch die umgedrehten Funktionsnamen).

Es ging mir darum, dass sehr sehr viele Hoster zwar 5.1.2 oder ein wenig höher unterstützen, aber selten 5.3.7 und höher, was aber erforderlich ist, um die neue Passwort-API bzw. die Übergangsfunktionen für 5.3.7+ nutzen zu können.

Hier sind die zwei Funktionen:
<?php

function hash_password($password, $algo = 'sha256', $rounds = 20)
{

    if( 
function_exists('openssl_random_pseudo_bytes') )
    {
        
$salt = bin2hex(openssl_random_pseudo_bytes(6));
    }
    else
    {
        
$salt = substr(str_shuffle(sha1(mt_rand(0,9999).microtime(true).mt_rand(0,9999))), mt_rand(0,12), 12);
    }

    
$hash = $password;

    for(
$i=0; $i < $rounds; $i++)
    {
        
$hash = hash($algo, $salt.$hash);
    }

    return 
$algo.'$'.$rounds.'$'.$salt.'$'.$hash;
}

function 
verify_password($password, $hash)
{
    
$options = explode('$', $hash);

    if(
count($options) != 4)
    {
        return 
false;
    }

    
$password_hash = $password;

    for(
$i=0; $i < $options[1]; $i++)
    {
        
$password_hash = hash($options[0], $options[2].$password_hash);
    }

    return (
$options[3] === $password_hash);
}


In diesem Fall habe ich standardmäßig mal den Algorithmus sha251 ausgewählt und die Runden auf 20 gesetzt. Beides kann man ganz leicht über das abändern der Standardwerten der Parameter der hash_password Funktion einstellen.
Das ist sogar dann noch möglich, wenn es bereits Passwörter gibt, die mit dieser Funktion gehasht wurden, da die nötigen Informationen im endgültigen String/Hash enthalten sind.
So kann man z.B. mit der Zeit die Rundenanzahl (rounds) ein wenig nach oben schrauben oder einen sichereren Algorithmus zum Hashen wählen.

Die Verwendung ist recht einfach:
<?php

// Hash erstellen (Wenn Benutzer angelegt oder Passwort geändert wird)
$hash = hash_password($passwort_im_klartext);

// Passwort mit Hash aus der Datenbank vergleichen (z.B. beim Login)
if( verify_password($passwort_im_klartext, $hash_aus_datenbank) )
{
    echo 
"Passwort stimmt!";
}
else
{
    echo 
"Passwort ist falsch!";
}


In der Standardeinstellung wird der Algorithmus sha256 verwendet. Zusammen mit den anderen Informationen liefert die Funktion hash_password also einen String mit 87 Zeichen zurück.
Dieser String ist wie folgt aufgebaut:
algorithmus$rundenanzahl$salt$hash


Vielleicht hilft es ja dem ein oder anderen dabei die Passwörter seiner Nutzer sicherer in der Datenbank zu speichern. Sicherer als MD5 oder SHA1 ist es auf jeden Fall und verwendet einen zufälligen Salt für jeden Hash, was diesen nochmals deutlich sicherer und die Implementierung eines Salts deutlich vereinfacht.
Zusätzlich wird für das Generieren des Salts wenn möglich ein kryptographischer Zufallszahlengenerator verwendet. Ist dies nicht möglich, wird ein Fallback mit mt_rand verwendet.

Verwendet man jedoch PHP 5.3.7 oder höher, sollte man sich folgendes Skript genauer anschauen https://github.com/ircmaxell/password_compat
bzw. die native Password API, wenn man PHP 5.5 oder höher verwendet http://php.net/manual/de/ref.password.php

Kommentare

Autor DingsDaBums

Zurück zur Übersicht
Autor: Nils Reimers
Zurück: URLs im Text identifizieren

Für Fortgeschrittene

  • Objektorientierte Programmierung
  • PHP Sicherheit
  • Script-Beispiele
  • Codeschnipsel
  • Stellenmarkt
Mit freundlicher Unterstützung von:
  • Punkt191 Werbeagentur
  • CasinoAndy Finland
  • Casinoohnelizenz.info
  • Cryptocasinomaster.com
  • CasinoHEX.at
  • inkedin.com

Hoster – Geringste Ausfallzeit

  1. webgo Ø 1 Min.
  2. Linevast Ø 2 Min.
  3. netcup Ø 3 Min.
  4. All-Inkl.com Ø 6 Min.
  5. checkdomain Ø 8 Min.
  6. dogado Ø 17 Min.
  7. bplaced Ø 17 Min.
  8. Contabo Ø 25 Min.
  9. Hetzner Ø 49 Min.
  10. ONE.com Ø 65 Min.
» Mehr erfahren

Impressum | Datenschutz | Auf PHP-Einfach.de werben

© PHP-Einfach.de 2003 - 2023

Cookie-Zustimmung verwalten
Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Anbieter verwalten Lese mehr über diese Zwecke
Einstellungen ansehen
{title} {title} {title}