<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'security.database.storage.php',
    1 => 'Modelo de almacenamiento cifrado',
    2 => 'Modelo de almacenamiento cifrado',
  ),
  'up' => 
  array (
    0 => 'security.database.php',
    1 => 'Seguridad en bases de datos',
  ),
  'prev' => 
  array (
    0 => 'security.database.connection.php',
    1 => 'Conexi&oacute;n a una base de datos',
  ),
  'next' => 
  array (
    0 => 'security.database.sql-injection.php',
    1 => 'Inyecci&oacute;n de SQL',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Modelo de almacenamiento cifrado</h2>
  <p class="simpara">
   SSL/SSH protege los datos que viajan desde el cliente al servidor: SSL/SSH
   no protege los datos persistentes almacenados en una base de datos. SSL es un
   protocolo que protege los datos mientras viajan por el cable.
  </p>
  <p class="simpara">
   Una vez que un atacante obtiene acceso directo a una base de datos (eludiendo el
   servidor web), los datos sensibles almacenados podrían ser divulgados o mal utilizados, a menos que
   la información esté protegida por la base de datos misma. Cifrar los datos
   es una buena forma de mitigar esta amenaza, pero muy pocas bases de datos ofrecen este
   tipo de cifrado de datos.
  </p>
  <p class="simpara">
   La forma más sencilla para evitar este problema es crear primero un paquete de
   cifrado propio y utilizarlo en los scripts de <abbr title="PHP: Hypertext Preprocessor">PHP</abbr>. Hay muchas
   extensiones de <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> que pueden ser de ayuda para esto, tales como <a href="book.openssl.php" class="link">OpenSSL</a> y <a href="book.sodium.php" class="link">Sodium</a>, cubriendo así una amplia variedad de algoritmos de
   cifrado. El script cifra los datos antes de insertarlos en la base de datos, y los
   descifra al obtenerlos. Véanse las referencias para ejemplos adicionales del
   funcionamiento del cifrado.
  </p>

  <div class="sect2" id="security.database.storage.hashing">
   <h3 class="title">&#039;Hashing&#039;</h3>
   <p class="simpara">
    En caso de datos que deban estar realmente ocultos, si no fuera necesaria su representación real,
    (es decir, que no sean mostrados), quizás convenga utilizar algoritmos hash.
    El ejemplo más típico del uso del hash es a la hora de almacenar el hash criptográfico de una
    contraseña en una base de datos, en lugar de almacenar la contraseña en sí.
   </p>
   <p class="simpara">
    Las funciones de <a href="ref.password.php" class="link">password</a>
    proporcionan una forma adecuada de utilizar hash con datos delicados y trabajar con estos hash.
   </p>
   <p class="simpara">
    <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> se emplea para usar un hash con una cadena dada utilizando
    el algoritmo más fuerte actualmente disponible, mientras que <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span>
    comprueba si la contraseña dada coincide con el hash almacenado en la base de datos.
   </p>
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Campo de contraseña con hash</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">// Almacenar el hash de la contraseña<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">$nombre_usuario</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">// Consultar si el usuario envió la contraseña correcta<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">$nombre_usuario</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">$contraseña</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">'Bienvenido, ' </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">'La autenticación ha fallado para ' </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 />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

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