<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'faq.passwords.php',
    1 => 'Password-Hashing',
    2 => 'Sicheres Hashing von Passw&ouml;rtern',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'FAQ',
  ),
  'prev' => 
  array (
    0 => 'faq.using.php',
    1 => 'PHP verwenden',
  ),
  'next' => 
  array (
    0 => 'faq.html.php',
    1 => 'PHP und HTML',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'faq/passwords.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.passwords" class="chapter">
  <h1 class="title">Sicheres Hashing von Passwörtern</h1>

  

  <p class="simpara">
   Dieser Absatz erklärt, warum Hash Funktionen zur sicheren
   Passwortspeicherung benutzt werden, und wie dies am effektivsten
   bewerkstelligt werden kann.
  </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.passwords.hashing">
     
      Warum sollten von Benutzern eingebene Passw&ouml;rter gehasht werden?
     
    </a></li><li><a href="#faq.passwords.fasthash">
     
      Warum sind verbreitete Hashfunktionen wie md5 und
      sha1 nicht f&uuml;r die Speicherung von Passw&ouml;rtern
      geeignet?
     
    </a></li><li><a href="#faq.passwords.bestpractice">
     
      Wie sollten Passw&ouml;rter gehasht werden, wenn die &uuml;blichen Hashfunktionen
      nicht geeignet sind?
     
    </a></li><li><a href="#faq.passwords.salt">
     
      Was ist ein Salt?
     
    </a></li><li><a href="#faq.password.storing-salts">
     
      Wie werden Salts gespeichert?
     
    </a></li></ol></div>
   <dl class="qandaentry" id="faq.passwords.hashing">
    <dt><strong>
     <p class="simpara">
      Warum sollten von Benutzern eingebene Passwörter gehasht werden?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Das Hashing von Passwörtern ist eine der grundlegendsten
      Sicherheitsüberlegungen, die beim Design aller Anwendungen oder Dienste,
      die Passwörter von Benutzern akzeptieren, angestellt werden muss. Ohne
      Hashing können im Falle eines erfolgreichen Angriffs auf den
      Datenspeicher alle gespeicherten Passwörter gestohlen und sofort
      verwendet werden, um nicht nur die Anwendung oder den Dienst zu
      kompromittieren, sondern auch die Konten von Benutzern bei anderen
      Diensten, wenn diese keine eindeutigen Passwörter verwenden.
     </p>
     <p class="simpara">
      Wenn Benutzer-Passwörter vor dem Abspeichern in der Datenbank gehasht
      werden, wird es für einen Angreifer sehr schwer, das Originalpasswort
      herauszufinden, während es gleichzeitig immer noch möglich ist, den
      resultierenden Hash mit dem Originalpasswort zu vergleichen.
     </p>
     <p class="simpara">
      Es ist jedoch wichtig zu beachten, dass das Hashing von Passwörtern nur
      davor schützt, dass sie im Datenspeicher kompromittiert werden, aber
      nicht unbedingt davor, dass sie durch bösartigen Code, der in die
      Anwendung oder den Dienst selbst eingeschleust wird, abgefangen werden
      können.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.passwords.fasthash">
    <dt><strong>
     <p class="simpara">
      Warum sind verbreitete Hashfunktionen wie <span class="function"><a href="function.md5.php" class="function">md5()</a></span> und
      <span class="function"><a href="function.sha1.php" class="function">sha1()</a></span> nicht für die Speicherung von Passwörtern
      geeignet?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Hash-Algorithmen wie MD5, SHA1 und SHA256 sind auf Geschwindigkeit und
      Effizienz optimiert. Mit modernen Techniken und leistungsstarker Hardware
      ist es aber trivial geworden, diese Hash-Algorithmen mit
      <q class="quote">Brute-Force</q>-Attacken anzugreifen.
     </p>
     <p class="simpara">
      Aufgrund der Geschwindigkeit, mit der ein moderner Computer diese
      Hash-Algorithmen <q class="quote">umkehren</q> kann, raten viele
      Sicherheitsexperten dringend davon ab, sie zum Hashing von Passwörtern zu
      verwenden.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.passwords.bestpractice">
    <dt><strong>
     <p class="simpara">
      Wie sollten Passwörter gehasht werden, wenn die üblichen Hashfunktionen
      nicht geeignet sind?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Wenn es um das Hashen von Passwörtern geht müssen zwei wichtige Dinge
      bedacht werden: Der Berechnungsaufwand und das Salt. Wenn es länger
      dauert einen Hash zu berechnen, wird ein Brute Force Angriff stark
      verzögert.
     </p>
     <p class="simpara">
      PHP bietet
      <a href="book.password.php" class="link">eine native Passworthashing-API</a> die
      sich auf eine sichere Art um das
      <a href="function.password-hash.php" class="link">Hashen</a> und
      <a href="function.password-verify.php" class="link">Verifizieren</a> von
      Passwörtern kümmert.
     </p>
     <p class="simpara">
      Der empfohlene Algorithmus für das Hashen von Passwörtern ist Blowfish,
      welcher auf als Standardalgorithmus von der Passwort Hashing API benutzt
      wird, da dieser einen signifikant höheren Berechnungsaufwand als MD5 oder
      SHA1 voraussetzt und trotzdem weiterhin skalierbar ist.
     </p>
     <p class="simpara">
      Die Funktion <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> ist auch für das Hashing von
      Passwörtern verfügbar, wird aber nur für die Interoperabilität mit
      anderen Systemen empfohlen.
      Stattdessen wird dringend empfohlen, wann immer möglich die native
      <a href="book.password.php" class="link">Passwort-Hashing-API</a> zu verwenden.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.passwords.salt">
    <dt><strong>
     <p class="simpara">
      Was ist ein Salt?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Ein kryptografisches Salt sind Daten, die während des Hashens an das
      Passwort angefügt werden um die Möglichkeit des Angriffs über
      Rainbowtables zu erschweren. Rainbowtables sind bereits vorberechnete
      Paare (Schlüssel, Hash), die benutzt werden können, um für einen
      gegebenen Hash das vorberechnete Passwort nachzuschlagen.
     </p>
     <p class="simpara">
      Vereinfacht ausgedrückt ist ein Salt ein zusätzliches Datenelement, das
      das Knacken von Hashes erheblich erschwert. Es gibt Onlinedienste bei
      denen man für einen gegebenen Hash das dazugehörige Passwort herausfinden
      kann. Die Benutzung eines Salts macht es unpraktisch bis unmöglich das
      Passwort durch die Benutzung dieser Dienste zu finden.
     </p>
     <p class="simpara">
      Die Funktion <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> generiert ein zufälliges
      Salt, sollte beim Aufruf der Funktion keines übergeben werden. Dies ist
      generell der einfachste und sicherste Ansatz.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.password.storing-salts">
    <dt><strong>
     <p class="simpara">
      Wie werden Salts gespeichert?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Die Funktionen <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> oder
      <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> geben den Salt als einen Teil des generierten
      Hashs zurück. Dieser Wert sollte unverändert abgespeichert werden, da er
      Informationen über den Hashalgorithmus enthält und direkt an die Funktion
      <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span> übergeben werden kann um ein
      Passwort zu verifzieren.
     </p>
     <div class="warning"><strong class="warning">Warnung</strong>
      <p class="simpara">
       Um Timing-Angriffe zu vermeiden, sollte immer
       <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span> verwendet werden, anstatt das
       Ergebnis erneut zu hashen und mit einem gespeicherten Hash
       zu vergleichen.
      </p>
     </div>
     <p class="simpara">
      Das folgende Diagramm zeigt das Format eines Rückgabewertes der Funktionen
      <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> oder <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span>.
      Wie zu sehen ist, enthalten die Hashes alle Informationen über den
      Algorithmus und das Salt, die für die spätere Verifikation von Passwörtern
      benötigt werden.
     </p>
     <p class="para">
      <div class="mediaobject">
       
       <div class="imageobject">
        <img src="images/2a34c7f2e658f6ae74f3869f2aa5886f-crypt-text-rendered.svg" alt="
        Die Komponenten des Rückgabewerten von password_hash und crypt in
        dieser Reihenfolge: Der verwendete Algorithmus, die Optionen des
        Algorithmus, das verwendete Salt und das gehashte Passwort.
       " width="690" height="192" />
       </div>
      </div>
     </p>
    </dd>
   </dl>
  

 </div>
<?php manual_footer($setup); ?>