mirror of
https://github.com/php/doc-de.git
synced 2026-03-23 23:02:13 +01:00
204 lines
7.8 KiB
XML
204 lines
7.8 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: f012b2761819e0ab25ff8cf4bac6655cfbc6fcff Maintainer: nobody Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
<chapter xml:id="faq.passwords" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<title>Sicheres Hashing von Passwörtern</title>
|
|
<titleabbrev>Password-Hashing</titleabbrev>
|
|
|
|
<simpara>
|
|
Dieser Absatz erklärt, warum Hash Funktionen zur sicheren
|
|
Passwortspeicherung benutzt werden, und wie dies am effektivsten
|
|
bewerkstelligt werden kann.
|
|
</simpara>
|
|
|
|
<qandaset>
|
|
<qandaentry xml:id="faq.passwords.hashing">
|
|
<question>
|
|
<simpara>
|
|
Warum sollten von Benutzern eingebene Passwörter gehasht werden?
|
|
</simpara>
|
|
</question>
|
|
<answer>
|
|
<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.
|
|
</simpara>
|
|
<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.
|
|
</simpara>
|
|
<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.
|
|
</simpara>
|
|
</answer>
|
|
</qandaentry>
|
|
<qandaentry xml:id="faq.passwords.fasthash">
|
|
<question>
|
|
<simpara>
|
|
Warum sind verbreitete Hashfunktionen wie <function>md5</function> und
|
|
<function>sha1</function> nicht für die Speicherung von Passwörtern
|
|
geeignet?
|
|
</simpara>
|
|
</question>
|
|
<answer>
|
|
<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
|
|
<quote>Brute-Force</quote>-Attacken anzugreifen.
|
|
</simpara>
|
|
<simpara>
|
|
Aufgrund der Geschwindigkeit, mit der ein moderner Computer diese
|
|
Hash-Algorithmen <quote>umkehren</quote> kann, raten viele
|
|
Sicherheitsexperten dringend davon ab, sie zum Hashing von Passwörtern zu
|
|
verwenden.
|
|
</simpara>
|
|
</answer>
|
|
</qandaentry>
|
|
<qandaentry xml:id="faq.passwords.bestpractice">
|
|
<question>
|
|
<simpara>
|
|
Wie sollten Passwörter gehasht werden, wenn die üblichen Hashfunktionen
|
|
nicht geeignet sind?
|
|
</simpara>
|
|
</question>
|
|
<answer>
|
|
<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.
|
|
</simpara>
|
|
<simpara>
|
|
PHP bietet
|
|
<link linkend="book.password">eine native Passworthashing-API</link> die
|
|
sich auf eine sichere Art um das
|
|
<link linkend="function.password-hash">Hashen</link> und
|
|
<link linkend="function.password-verify">Verifizieren</link> von
|
|
Passwörtern kümmert.
|
|
</simpara>
|
|
<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.
|
|
</simpara>
|
|
<simpara>
|
|
Die Funktion <function>crypt</function> 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
|
|
<link linkend="book.password">Passwort-Hashing-API</link> zu verwenden.
|
|
</simpara>
|
|
</answer>
|
|
</qandaentry>
|
|
<qandaentry xml:id="faq.passwords.salt">
|
|
<question>
|
|
<simpara>
|
|
Was ist ein Salt?
|
|
</simpara>
|
|
</question>
|
|
<answer>
|
|
<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.
|
|
</simpara>
|
|
<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.
|
|
</simpara>
|
|
<simpara>
|
|
Die Funktion <function>password_hash</function> generiert ein zufälliges
|
|
Salt, sollte beim Aufruf der Funktion keines übergeben werden. Dies ist
|
|
generell der einfachste und sicherste Ansatz.
|
|
</simpara>
|
|
</answer>
|
|
</qandaentry>
|
|
<qandaentry xml:id="faq.password.storing-salts">
|
|
<question>
|
|
<simpara>
|
|
Wie werden Salts gespeichert?
|
|
</simpara>
|
|
</question>
|
|
<answer>
|
|
<simpara>
|
|
Die Funktionen <function>password_hash</function> oder
|
|
<function>crypt</function> 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
|
|
<function>password_verify</function> übergeben werden kann um ein
|
|
Passwort zu verifzieren.
|
|
</simpara>
|
|
<warning>
|
|
<simpara>
|
|
Um Timing-Angriffe zu vermeiden, sollte immer
|
|
<function>password_verify</function> verwendet werden, anstatt das
|
|
Ergebnis erneut zu hashen und mit einem gespeicherten Hash
|
|
zu vergleichen.
|
|
</simpara>
|
|
</warning>
|
|
<simpara>
|
|
Das folgende Diagramm zeigt das Format eines Rückgabewertes der Funktionen
|
|
<function>crypt</function> oder <function>password_hash</function>.
|
|
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.
|
|
</simpara>
|
|
<para>
|
|
<mediaobject>
|
|
<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.
|
|
</alt>
|
|
<imageobject>
|
|
<imagedata fileref="en/faq/figures/crypt-text-rendered.svg" width="690" depth="192" format="SVG" />
|
|
</imageobject>
|
|
</mediaobject>
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
</qandaset>
|
|
|
|
</chapter>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|