<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/security.database.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'security.database.storage.php',
    1 => 'Verschl&uuml;sseltes Speichermodell',
    2 => 'Verschl&uuml;sseltes Speichermodell',
  ),
  'up' => 
  array (
    0 => 'security.database.php',
    1 => 'Datenbank-Sicherheit',
  ),
  'prev' => 
  array (
    0 => 'security.database.connection.php',
    1 => 'Mit der Datenbank verbinden',
  ),
  'next' => 
  array (
    0 => 'security.database.sql-injection.php',
    1 => 'SQL-Injection',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'security/database.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="security.database.storage" class="sect1">
    <h2 class="title">Verschlüsseltes Speichermodell</h2>
    <p class="simpara">
     SSL/SSH schützt zwar Daten, die vom Client zum Server übertragen werden,
     aber SSL/SSH schützt keine dauernd in einer Datenbank gespeicherten
     Daten. SSL ist ein &quot;auf-der-Leitung&quot;-Protokoll.
    </p>
    <p class="simpara">
     Hat ein Angreifer direkten Zugriff auf Ihre Datenbank (unter Umgehung des
     Webservers), können gespeicherte sensible Daten aufgedeckt oder
     zweckentfremdet werden, außer wenn die Informationen durch die Datenbank
     selbst geschützt sind. Die Daten zu verschlüsseln ist eine gute Methode,
     diese Gefahr zu mildern, doch bieten nur wenige Datenbanken diese Art der
     Datenverschlüsselung an.
    </p>
    <p class="simpara">
     Der einfachste Weg, dieses Problem zu umgehen ist, erst einmal Ihr
     eigenes Verschlüsselungspaket zu erstellen, und dieses dann in Ihren
     <abbr title="PHP: Hypertext Preprocessor">PHP</abbr>-Skripten zu nutzen. <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> kann
     Ihnen in diesem Fall mit seinen verschiedenen Erweiterungen helfen, wie
     z. B. <a href="book.openssl.php" class="link">OpenSSL</a> und
     <a href="book.sodium.php" class="link">Sodium</a>, welche eine große Auswahl an
     Verschlüsselungsalgorithmen abdecken. Das Skript verschlüsselt die Daten
     vor dem Speichern und entschlüsselt diese wieder beim Erhalt. Siehe die
     Verweise für weitere Beispiele, wie Verschlüsselung funktioniert.
    </p>

    <div class="sect2" id="security.database.storage.hashing">
     <h3 class="title">Hashing</h3>
     <p class="simpara">
      Im Fall von wirklich versteckten Daten, wenn deren unverschlüsselte
      Darstellung nicht nötig ist (d. h. die nicht angezeigt werden sollen),
      ist Hashing ebenfalls überlegenswert. Das bekannte Beispiel für Hashing
      ist das Speichern des kryptographischen Hashes eines Passwortes in einer
      Datenbank, anstatt des Passworts selbst.
     </p>
     <p class="simpara">
      Die <a href="ref.password.php" class="link">Passwort</a>-Funktionen bieten eine
      bequeme Möglichkeit, sensible Daten zu hashen und mit diesen Hashes zu
      arbeiten.
     </p>
     <p class="simpara">
      <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> wird verwendet, um eine gegebene
      Zeichenkette unter Verwendung des stärksten zurzeit verfügbaren
      Algorithmus zu hashen, und <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span> prüft,
      ob ein gegebenes Passwort mit dem Hash, der in der Datenbank gespeichert
      ist, übereinstimmt.
     </p>
     <div class="example" id="example-1">
      <p><strong>Beispiel #1 Hashen eines Passwortfeldes</strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// Speichern des Passwort-Hashes<br /></span><span style="color: #0000BB">$query  </span><span style="color: #007700">= </span><span style="color: #0000BB">sprintf</span><span style="color: #007700">(</span><span style="color: #DD0000">"INSERT INTO users(name,pwd) VALUES('%s','%s');"</span><span style="color: #007700">,<br />            </span><span style="color: #0000BB">pg_escape_string</span><span style="color: #007700">(</span><span style="color: #0000BB">$username</span><span style="color: #007700">),<br />            </span><span style="color: #0000BB">password_hash</span><span style="color: #007700">(</span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #0000BB">PASSWORD_DEFAULT</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">pg_query</span><span style="color: #007700">(</span><span style="color: #0000BB">$connection</span><span style="color: #007700">, </span><span style="color: #0000BB">$query</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Abfragen, ob der User das richtige Passwort übermittelt hat<br /></span><span style="color: #0000BB">$query </span><span style="color: #007700">= </span><span style="color: #0000BB">sprintf</span><span style="color: #007700">(</span><span style="color: #DD0000">"SELECT pwd FROM users WHERE name='%s';"</span><span style="color: #007700">,<br />            </span><span style="color: #0000BB">pg_escape_string</span><span style="color: #007700">(</span><span style="color: #0000BB">$username</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$row </span><span style="color: #007700">= </span><span style="color: #0000BB">pg_fetch_assoc</span><span style="color: #007700">(</span><span style="color: #0000BB">pg_query</span><span style="color: #007700">(</span><span style="color: #0000BB">$connection</span><span style="color: #007700">, </span><span style="color: #0000BB">$query</span><span style="color: #007700">));<br /><br />if (</span><span style="color: #0000BB">$row </span><span style="color: #007700">&amp;&amp; </span><span style="color: #0000BB">password_verify</span><span style="color: #007700">(</span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #0000BB">$row</span><span style="color: #007700">[</span><span style="color: #DD0000">'pwd'</span><span style="color: #007700">])) {<br />    echo </span><span style="color: #DD0000">'Willkommen, ' </span><span style="color: #007700">. </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$username</span><span style="color: #007700">) . </span><span style="color: #DD0000">'!'</span><span style="color: #007700">;<br />} else {<br />    echo </span><span style="color: #DD0000">'Authentifizierung für ' </span><span style="color: #007700">. </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$username</span><span style="color: #007700">) . </span><span style="color: #DD0000">'fehlgeschlagen.'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

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