1
0
mirror of https://github.com/php/doc-de.git synced 2026-03-23 23:02:13 +01:00
Files
archived-doc-de/faq/passwords.xml
Martin Samesch 9d48e2db6c Sync with EN
2024-10-17 22:27:02 +02:00

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
-->