<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.password.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'function.password-hash.php',
    1 => 'password_hash',
    2 => 'Crea una clave de hash para una contrase&ntilde;a',
  ),
  'up' => 
  array (
    0 => 'ref.password.php',
    1 => 'Funciones de hashing de contrase&ntilde;as',
  ),
  'prev' => 
  array (
    0 => 'function.password-get-info.php',
    1 => 'password_get_info',
  ),
  'next' => 
  array (
    0 => 'function.password-needs-rehash.php',
    1 => 'password_needs_rehash',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/password/functions/password-hash.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.password-hash" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">password_hash</h1>
  <p class="verinfo">(PHP 5 &gt;= 5.5.0, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">password_hash</span> &mdash; <span class="dc-title">Crea una clave de hash para una contraseña</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.password-hash-description">
  <h3 class="title">Descripción</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>password_hash</strong></span>(<span class="methodparam"><span class="attribute"><a href="class.sensitiveparameter.php">#[\SensitiveParameter]</a> </span><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$password</code></span>, <span class="methodparam"><span class="type"><span class="type"><a href="language.types.string.php" class="type string">string</a></span>|<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>|<span class="type"><a href="language.types.null.php" class="type null">null</a></span></span> <code class="parameter">$algo</code></span>, <span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter">$options</code><span class="initializer"> = []</span></span>): <span class="type"><a href="language.types.string.php" class="type string">string</a></span></div>

  <p class="para rdfs-comment">
   La función <span class="function"><strong>password_hash()</strong></span> crea un nuevo
   hash utilizando un algoritmo de hash fuerte e irreversible.
  </p>
  <p class="simpara">
   Los siguientes algoritmos son actualmente soportados:
  </p>
  <p class="para">
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-default">PASSWORD_DEFAULT</a></code></strong> - Uso del algoritmo bcrypt (por omisión desde
      PHP 5.5.0). Tenga en cuenta que esta constante está diseñada para cambiar con el tiempo, a medida
      que se añaden algoritmos más recientes y fuertes a PHP. Por esta razón, la longitud del resultado
      de este algoritmo puede cambiar con el tiempo, por lo que se recomienda almacenar el resultado en
      una columna de la base de datos que pueda contener al menos 60 caracteres
      (255 bytes puede ser una muy buena opción).
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong> - Uso del algoritmo bcrypt
      para crear la clave de hash. Esto creará una clave de hash estándar <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span>
      utilizando el identificador <code class="literal">$2y$</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2i">PASSWORD_ARGON2I</a></code></strong> - Utiliza el algoritmo de hash Argon2i para crear el hash.
      Este algoritmo solo está disponible si PHP ha sido compilado con el soporte de Argon2
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2id">PASSWORD_ARGON2ID</a></code></strong> - Utiliza el algoritmo de hash Argon2id para crear el hash.
      Este algoritmo solo está disponible si PHP ha sido compilado con el soporte de Argon2
     </span>
    </li>
   </ul>
  </p>
  <p class="simpara">
   Opciones soportadas para <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong>:
  </p>
  <p class="para">
   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      <code class="literal">salt</code> (<span class="type"><a href="language.types.string.php" class="type string">string</a></span>) - para proporcionar manualmente un salt a utilizar durante el hash de
      la contraseña. Tenga en cuenta que esta opción evitará la generación automática.
     </p>
     <p class="para">
      Si se omite, un salt aleatorio será generado por la función <span class="function"><strong>password_hash()</strong></span>
      para cada contraseña hash. Este es el modo de funcionamiento previsto.
     </p>
     <div class="warning"><strong class="warning">Advertencia</strong>
      <p class="para">
       La opción Salt está obsoleta. Es preferible utilizar simplemente
       el salt que se genera por omisión.
       A partir de PHP 8.0.0, un salt proporcionado explícitamente es ignorado.
      </p>
     </div>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">cost</code> (<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>) - determina el costo algorítmico que debe ser utilizado.
      Ejemplos de estos valores pueden ser encontrados en la página de documentación
      de la función <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span>.
     </p>
     <p class="para">
      Si se omite, el valor por omisión <code class="literal">12</code> será utilizado. Este es un buen compromiso,
      pero debe ser ajustado según el hardware utilizado.
     </p>
    </li>
   </ul>
  </p>

  <p class="simpara">
   Opciones soportadas para <strong><code><a href="password.constants.php#constant.password-argon2i">PASSWORD_ARGON2I</a></code></strong> y <strong><code><a href="password.constants.php#constant.password-argon2id">PASSWORD_ARGON2ID</a></code></strong>:
  </p>
  <p class="para">
   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      <code class="literal">memory_cost</code> (<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>) - Memoria máxima
      (en kilobytes binarios) que puede ser utilizada para calcular el hash Argon2. Por
      omisión a <strong><code><a href="password.constants.php#constant.password-argon2-default-memory-cost">PASSWORD_ARGON2_DEFAULT_MEMORY_COST</a></code></strong>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">time_cost</code> (<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>) - Duración máxima de
      tiempo que puede tomar para calcular el hash Argon2. Por
      omisión a <strong><code><a href="password.constants.php#constant.password-argon2-default-time-cost">PASSWORD_ARGON2_DEFAULT_TIME_COST</a></code></strong>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">threads</code> (<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>) - Número de hilos a
      utilizar para calcular el hash Argon2. Por omisión a <strong><code><a href="password.constants.php#constant.password-argon2-default-threads">PASSWORD_ARGON2_DEFAULT_THREADS</a></code></strong>.
     </p>
     <div class="warning"><strong class="warning">Advertencia</strong>
      <p class="para">
       Solo disponible cuando PHP utiliza libargon2,
       y no la implementación libsodium.
      </p>
     </div>
    </li>
   </ul>
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.password-hash-parameters">
  <h3 class="title">Parámetros</h3>
  <dl>
   
    <dt><code class="parameter">password</code></dt>
    <dd>
     <p class="para">
      La contraseña del usuario.
     </p>
     <div class="caution"><strong class="caution">Precaución</strong>
      <p class="para">
       El uso de la constante <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong>
       para el algoritmo hará que el parámetro
       <code class="parameter">password</code> sea truncado a una longitud máxima de
       72 bytes.
      </p>
     </div>
    </dd>
   
   
    <dt><code class="parameter">algo</code></dt>
    <dd>
     <p class="para">
      Una <a href="password.constants.php" class="link">constante del algoritmo
de contraseña</a> que representa el algoritmo a utilizar durante el hasheo de la contraseña.
     </p>
    </dd>
   
   
    <dt><code class="parameter">options</code></dt>
    <dd>
     <p class="para">
      Un array asociativo que contiene las opciones.
 Ver también <a href="password.constants.php" class="link">las constantes del algoritmo de contraseña</a>
 para la documentación sobre las opciones soportadas para cada algoritmo.
     </p>
    </dd>
   
  </dl>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.password-hash-returnvalues">
  <h3 class="title">Valores devueltos</h3>
  <p class="para">
   Retorna la contraseña hash.
  </p>
  <p class="para">
   El algoritmo utilizado, el costo y el salt están contenidos en el hash retornado.
   También, toda la información útil para verificar este último está incluida.
   Esto permite que la función <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span> verifique el
   hash sin necesidad de almacenar por separado esta información.
  </p>
 </div>


 <div class="refsect1 changelog" id="refsect1-function.password-hash-changelog">
  <h3 class="title">Historial de cambios</h3>
  <p class="para">
   <table class="doctable informaltable">
    
     <thead>
      <tr>
       <th>Versión</th>
       <th>Descripción</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
        <td>8.4.0</td>
        <td>
         El valor por omisión de la opción <code class="literal">cost</code> del
         algoritmo <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong> ha sido aumentado de
         <code class="literal">10</code> a <code class="literal">12</code>.
        </td>
      </tr>

      <tr>
       <td>8.3.0</td>
       <td>
        <span class="function"><strong>password_hash()</strong></span> ahora asocia la excepción
        <span class="exceptionname"><a href="class.random-randomexception.php" class="exceptionname">Random\RandomException</a></span> subyacente a
        <span class="property"><a href="class.exception.php#exception.props.previous">Exception::$previous</a></span> cuando una
        <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> es lanzada debido a un fallo
        en la generación del salt.
       </td>
      </tr>

      <tr>
       <td>8.0.0</td>
       <td>
        <span class="function"><strong>password_hash()</strong></span> ya no retorna <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> en caso de fallo, una
        <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> será lanzada si el algoritmo de hash de contraseña
        no es válido, o una <span class="classname"><a href="class.error.php" class="classname">Error</a></span> si el hash de contraseña falló por una razón desconocida.
       </td>
      </tr>

      <tr>
       <td>8.0.0</td>
       <td>
        <code class="parameter">algo</code> ahora es nullable.
       </td>
      </tr>

      <tr>
       <td>7.4.0</td>
       <td>
        El parámetro <code class="parameter">algo</code> ahora espera una <span class="type"><a href="language.types.string.php" class="type string">string</a></span>, pero
        sigue aceptando un <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> para mantener la compatibilidad hacia atrás.
       </td>
      </tr>

      <tr>
       <td>7.4.0</td>
       <td>
        La extensión sodium proporciona una implementación alternativa para las
        contraseñas Argon2.
       </td>
      </tr>

      <tr>
       <td>7.3.0</td>
       <td>
        Añadido el soporte para contraseñas Argon2id utilizando <strong><code><a href="password.constants.php#constant.password-argon2id">PASSWORD_ARGON2ID</a></code></strong>.
       </td>
      </tr>

      <tr>
       <td>7.2.0</td>
       <td>
        Añadido el soporte para contraseñas Argon2i utilizando <strong><code><a href="password.constants.php#constant.password-argon2i">PASSWORD_ARGON2I</a></code></strong>.
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-function.password-hash-examples">
  <h3 class="title">Ejemplos</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Ejemplo con <span class="function"><strong>password_hash()</strong></span></strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">password_hash</span><span style="color: #007700">(</span><span style="color: #DD0000">"rasmuslerdorf"</span><span style="color: #007700">, </span><span style="color: #0000BB">PASSWORD_DEFAULT</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">$2y$12$4Umg0rCJwMswRw/l.SwHvuQV01coP0eWmGzd61QH2RvAOMANUBGC.</pre>
</div>
    </div>
   </div>
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Ejemplo #2 Ejemplo con <span class="function"><strong>password_hash()</strong></span> definiendo manualmente la opción cost</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$options </span><span style="color: #007700">= [<br />     </span><span style="color: #FF8000">// Aumenta el costo de bcrypt de 12 a 13.<br />    </span><span style="color: #DD0000">'cost' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">13</span><span style="color: #007700">,<br />];<br />echo </span><span style="color: #0000BB">password_hash</span><span style="color: #007700">(</span><span style="color: #DD0000">"rasmuslerdorf"</span><span style="color: #007700">, </span><span style="color: #0000BB">PASSWORD_BCRYPT</span><span style="color: #007700">, </span><span style="color: #0000BB">$options</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">$2y$13$xeDfQumlmdm0Sco.4qmH1OGfUUmOcuRmfae0dPJhjX1Bq0yYhqbNi</pre>
</div>
    </div>
   </div>
  </p>
  <p class="para">
   <div class="example" id="example-3">
    <p><strong>Ejemplo #3 Ejemplo con <span class="function"><strong>password_hash()</strong></span> para encontrar un buen costo (cost)</strong></p>
    <div class="example-contents"><p>
     Este código realizará un benchmark de la máquina para determinar el costo máximo
     que puede ser utilizado sin degradar la experiencia del usuario. Se recomienda
     elegir el costo más alto posible sin ralentizar otras operaciones
     que la máquina debe ejecutar. 11 es una buena base, y un valor más
     alto es preferible si la máquina es suficientemente rápida. El código de abajo
     apunta a un tiempo de estiramiento ≤ 350 milisegundos, lo cual representa un retraso adecuado
     para sistemas que manejan conexiones interactivas.
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$timeTarget </span><span style="color: #007700">= </span><span style="color: #0000BB">0.350</span><span style="color: #007700">; </span><span style="color: #FF8000">// 350 milisegundos<br /><br /></span><span style="color: #0000BB">$cost </span><span style="color: #007700">= </span><span style="color: #0000BB">11</span><span style="color: #007700">;<br />do {<br />    </span><span style="color: #0000BB">$cost</span><span style="color: #007700">++;<br />    </span><span style="color: #0000BB">$start </span><span style="color: #007700">= </span><span style="color: #0000BB">microtime</span><span style="color: #007700">(</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">password_hash</span><span style="color: #007700">(</span><span style="color: #DD0000">"test"</span><span style="color: #007700">, </span><span style="color: #0000BB">PASSWORD_BCRYPT</span><span style="color: #007700">, [</span><span style="color: #DD0000">"cost" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$cost</span><span style="color: #007700">]);<br />    </span><span style="color: #0000BB">$end </span><span style="color: #007700">= </span><span style="color: #0000BB">microtime</span><span style="color: #007700">(</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />} while ((</span><span style="color: #0000BB">$end </span><span style="color: #007700">- </span><span style="color: #0000BB">$start</span><span style="color: #007700">) &lt; </span><span style="color: #0000BB">$timeTarget</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">"Valor de 'cost' más apropiado: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$cost </span><span style="color: #007700">- </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">Valor de &#039;cost&#039; más apropiado: 13</pre>
</div>
    </div>
   </div>
  </p>

  <p class="para">
   <div class="example" id="example-4">
    <p><strong>Ejemplo #4 Ejemplo con <span class="function"><strong>password_hash()</strong></span> y Argon2i</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Argon2i hash: ' </span><span style="color: #007700">. </span><span style="color: #0000BB">password_hash</span><span style="color: #007700">(</span><span style="color: #DD0000">'rasmuslerdorf'</span><span style="color: #007700">, </span><span style="color: #0000BB">PASSWORD_ARGON2I</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">Argon2i hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0</pre>
</div>
    </div>
   </div>
  </p>
 </div>


 <div class="refsect1 notes" id="refsect1-function.password-hash-notes">
  <h3 class="title">Notas</h3>
  <div class="caution"><strong class="caution">Precaución</strong>
   <p class="para">
    Se recomienda encarecidamente no proporcionar un salt explícito para esta función.
    Un salt seguro será generado automáticamente si no se especifica ningún salt.
   </p>

   <p class="para">
    Como se mencionó anteriormente, el uso de la opción <code class="literal">salt</code> a partir de PHP 7.0.0
    generará una advertencia de deprecación. El soporte para un salt explícito fue eliminado
    a partir de PHP 8.0.0.
   </p>
  </div>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Se recomienda probar esta función en la máquina utilizada y ajustar el/los parámetro(s)
    de costo para que la ejecución de la función tome menos de 350 milisegundos para conexiones
    interactivas. El script del ejemplo anterior ayudará a elegir un costo bcrypt adecuado para la máquina dada.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    La actualización de los algoritmos soportados por esta función (o el cambio al por omisión) debe seguir las siguientes reglas:
   </span>
   <p class="para">
    <ul class="itemizedlist">
     <li class="listitem">
      <span class="simpara">
       Cada nuevo algoritmo debe formar parte del núcleo de PHP durante al menos 1 versión completa
       antes de aspirar a convertirse en el algoritmo por omisión. También, si, por ejemplo, un nuevo
       algoritmo es añadido en la versión 7.5.5, no será elegible como algoritmo por omisión hasta
       PHP 7.7 (sabiendo que 7.6 será la primera versión completa). Pero si un algoritmo diferente ha sido
       añadido en 7.6.0, también será elegible como algoritmo por omisión
       a partir de la versión 7.7.0.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       El algoritmo por omisión solo puede ser cambiado durante una versión completa (7.3.0, 8.0.0, etc...)
       y no durante una versión de revisión. La única excepción a este principio básico sería una
       emergencia, por ejemplo, al descubrir un bug crítico de seguridad
       en el algoritmo por omisión.
      </span>
     </li>
    </ul>
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.password-hash-seealso">
  <h3 class="title">Ver también</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="function"><a href="function.password-verify.php" class="function" rel="rdfs-seeAlso">password_verify()</a> - Verifica que una contrase&ntilde;a coincide con un hash</span></li>
    <li><span class="function"><a href="function.password-needs-rehash.php" class="function" rel="rdfs-seeAlso">password_needs_rehash()</a> - Verifica que el hash proporcionado cumple con el algoritmo y las opciones especificadas</span></li>
    <li><span class="function"><a href="function.crypt.php" class="function" rel="rdfs-seeAlso">crypt()</a> - Hash de un solo sentido (indescifrable)</span></li>
    <li><span class="function"><a href="function.sodium-crypto-pwhash-str.php" class="function" rel="rdfs-seeAlso">sodium_crypto_pwhash_str()</a> - Devuelve un hash codificado en ASCII</span></li>
   </ul>
  </p>
 </div>


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