PMG2426 1/Einführung/Tim
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hashfunktionen: Grundlagen und Anwendungen</title>
<style>
body {
line-height: 1.6;
margin: 20px;
padding: 0;
color: #333;
background-color: #fff;
}
.section {
margin-bottom: 30px;
}
.card {
background-color: #f9f9f9;
padding: 15px;
border-radius: 8px;
margin-bottom: 15px;
}
table {
width: 100%;
border-collapse: collapse;
margin: 15px 0;
}
th, td {
padding: 8px;
text-align: left;
border-bottom: 1px solid #ddd;
}
th {
background-color: #f2f2f2;
}
.highlight {
background-color: #fffde7;
padding: 15px;
margin: 15px 0;
}
</style>
</head>
<body>
<h1>Hashfunktionen</h1>
<p>Grundlagen, Anwendungen und kryptografische Sicherheit</p>
<div class="section">
<h2>Was sind Hashfunktionen?</h2>
<p>
Hashfunktionen sind mathematische Algorithmen, die eine Eingabe beliebiger Länge (Daten, Texte, Dateien) in einen Ausgabewert fester Länge umwandeln.
Dieser Ausgabewert wird als <strong>Hashwert</strong>, <strong>Hash</strong>, <strong>Digest</strong> oder <strong>Fingerabdruck</strong> bezeichnet.
</p>
<p>
Die Grundidee einer Hashfunktion besteht darin, dass selbst kleine Änderungen an der Eingabe zu einem völlig anderen Hashwert führen.
Dies macht Hashfunktionen besonders nützlich für kryptografische Anwendungen, Datenintegritätsprüfungen und effiziente Datenstrukturen.
</p>
<div class="highlight">
<h3>Wichtig zu wissen:</h3>
<p>
Hashfunktionen sind <strong>Einwegfunktionen</strong>. Das bedeutet, es ist praktisch unmöglich, aus einem Hashwert die ursprüngliche Eingabe zu rekonstruieren.
Diese Eigenschaft ist entscheidend für ihre Sicherheitsanwendungen.
</p>
</div>
</div>
<div class="section">
<h2>Eigenschaften von Hashfunktionen</h2>
<p>Gute kryptografische Hashfunktionen sollten folgende Eigenschaften aufweisen:</p>
<div class="card">
<h3>Deterministisch</h3>
<p>Dieselbe Eingabe erzeugt immer denselben Hashwert. Dies ist eine grundlegende Anforderung für die Konsistenz.</p>
</div>
<div class="card">
<h3>Kollisionsresistenz</h3>
<p>Es sollte rechnerisch unmöglich sein, zwei unterschiedliche Eingaben zu finden, die den gleichen Hashwert erzeugen.</p>
</div>
<div class="card">
<h3>Lawineneneffekt</h3>
<p>Eine kleine Änderung der Eingabe führt zu einer großen Änderung des resultierenden Hashwerts (etwa 50% der Bits ändern sich).</p>
</div>
<div class="card">
<h3>Vorbildresistenz</h3>
<p>Bei gegebenem Hashwert sollte es unmöglich sein, eine Eingabe zu finden, die diesen Hashwert erzeugt.</p>
</div>
<div class="card">
<h3>Zweites Urbild-Resistenz</h3>
<p>Bei gegebener Eingabe ist es unmöglich, eine andere Eingabe zu finden, die denselben Hashwert erzeugt.</p>
</div>
<div class="card">
<h3>Schnelle Berechnung</h3>
<p>Die Hashfunktion sollte effizient sein und den Hashwert schnell berechnen können.</p>
</div>
</div>
<div class="section">
<h2>Wichtige Hash-Algorithmen</h2>
<table>
<thead>
<tr>
<th>Algorithmus</th>
<th>Ausgabelänge</th>
<th>Entwickelt</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>MD5</td>
<td>128 Bit</td>
<td>1991</td>
<td>Unsicher, nicht mehr für Sicherheitsanwendungen empfohlen</td>
</tr>
<tr>
<td>SHA-1</td>
<td>160 Bit</td>
<td>1995</td>
<td>Veraltet, Kollisionen gefunden</td>
</tr>
<tr>
<td>SHA-256</td>
<td>256 Bit</td>
<td>2001</td>
<td>Sicher, weit verbreitet</td>
</tr>
<tr>
<td>SHA-3</td>
<td>224-512 Bit</td>
<td>2015</td>
<td>Sicher, neuerer Standard</td>
</tr>
<tr>
<td>BLAKE2</td>
<td>bis zu 512 Bit</td>
<td>2012</td>
<td>Sicher und sehr schnell</td>
</tr>
<tr>
<td>Argon2</td>
<td>variabel</td>
<td>2015</td>
<td>Spezifisch für Passwortspeicherung optimiert</td>
</tr>
</tbody>
</table>
</div>
<div class="section">
<h2>Anwendungsbereiche von Hashfunktionen</h2>
<div class="card">
<h3>Passwortspeicherung</h3>
<p>
Statt Passwörter im Klartext zu speichern, werden nur deren Hashwerte gespeichert.
Bei der Anmeldung wird der Hash des eingegebenen Passworts mit dem gespeicherten Hash verglichen.
</p>
</div>
<div class="card">
<h3>Datenintegrität</h3>
<p>
Überprüfung, ob Daten während der Übertragung oder Speicherung unverändert geblieben sind,
indem Hashwerte vor und nach der Übertragung verglichen werden.
</p>
</div>
<div class="card">
<h3>Digitale Signaturen</h3>
<p>
Hashwerte werden in Verbindung mit asymmetrischer Kryptografie verwendet,
um die Authentizität und Integrität von Nachrichten zu garantieren.
</p>
</div>
<div class="card">
<h3>Blockchain & Kryptowährungen</h3>
<p>
Hashfunktionen sind ein zentraler Bestandteil der Blockchain-Technologie und dem Mining-Prozess
bei Kryptowährungen wie Bitcoin (SHA-256).
</p>
</div>
<div class="card">
<h3>Datenstrukturen</h3>
<p>
Hashtabellen und HashMaps verwenden Hashfunktionen, um Daten effizient zu speichern und abzurufen,
was schnelle Suchoperationen ermöglicht.
</p>
</div>
<div class="card">
<h3>Deduplizierung</h3>
<p>
Identifizieren und Entfernen doppelter Daten durch Vergleich von Hashwerten,
besonders nützlich bei Backup-Systemen und Datenspeicherung.
</p>
</div>
</div>
<div class="section">
<h2>Sicherheitsaspekte von Hashfunktionen</h2>
<p>
Die Sicherheit von Hashfunktionen wird ständig überprüft und verbessert. Im Laufe der Zeit wurden mehrere Angriffe entwickelt:
</p>
<div class="card">
<h3>Brute-Force-Angriffe</h3>
<p>
Systematisches Ausprobieren aller möglichen Eingaben, um einen bestimmten Hash zu erzeugen.
Die Widerstandskraft gegen solche Angriffe hängt von der Ausgabelänge der Hashfunktion ab.
</p>
</div>
<div class="card">
<h3>Rainbow Tables</h3>
<p>
Vorberechnete Tabellen mit Hashwerten und zugehörigen Eingaben.
Diese können durch Salting (Hinzufügen zufälliger Daten) unwirksam gemacht werden.
</p>
</div>
<div class="card">
<h3>Kollisionsangriffe</h3>
<p>
Suche nach zwei verschiedenen Eingaben, die denselben Hashwert erzeugen.
MD5 und SHA-1 sind anfällig für solche Angriffe und sollten nicht mehr verwendet werden.
</p>
</div>
<div class="highlight">
<h3>Bewährte Praktiken:</h3>
<ul>
<li>Verwenden Sie moderne Hashfunktionen wie SHA-256, SHA-3 oder BLAKE2.</li>
<li>Fügen Sie bei der Passwortspeicherung immer ein Salt hinzu.</li>
<li>Verwenden Sie spezialisierte Passwort-Hashing-Funktionen wie Argon2, bcrypt oder PBKDF2.</li>
<li>Halten Sie Ihre kryptografischen Bibliotheken aktuell.</li>
</ul>
</div>
</div>
</body>
</html>