mirror of
https://github.com/php/doc-es.git
synced 2026-03-23 23:12:09 +01:00
199 lines
7.9 KiB
XML
199 lines
7.9 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: f012b2761819e0ab25ff8cf4bac6655cfbc6fcff Maintainer: PhilDaiguille Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
<chapter xml:id="faq.passwords" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<title>Hash de contraseñas seguro</title>
|
|
<titleabbrev>Hash de Contraseñas</titleabbrev>
|
|
|
|
<para>
|
|
Esta sección explica las razones que justifican el uso de funciones hash
|
|
para proteger las contraseñas. También se explica cómo hacerlo de un modo efectivo.
|
|
</para>
|
|
|
|
<qandaset>
|
|
<qandaentry xml:id="faq.passwords.hashing">
|
|
<question>
|
|
<para>
|
|
¿Por qué debo usar hash en las contraseñas de los usuarios de mi aplicación?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
El hash de contraseñas es una de las consideraciones de seguridad más elementales
|
|
que se deben llevar a la práctica al diseñar una aplicación que acepte contraseñas
|
|
de los usuarios. Sin hashing, cualquier contraseña que se almacene en la
|
|
base de datos de la aplicación podrá ser robada si la base de datos se ve comprometida, con
|
|
lo que inmediatamente no sólo estaría comprometida la aplicación, sino también
|
|
las cuentas de otros servicios de nuestros usuarios, siempre y cuando no utilicen
|
|
contraseñas distintas.
|
|
</para>
|
|
<para>
|
|
Si aplicamos un algoritmo hash a las contraseñas antes de almacenarlas
|
|
en la base de datos, dificultamos al atacante el determinar la contraseña
|
|
original, pese a que en un futuro podrá comparar el hash resultante con
|
|
la contraseña original.
|
|
</para>
|
|
<para>
|
|
Sin embargo, es importante tener en cuenta que el hecho de aplicar hash a las contraseñas sólo
|
|
protege de que se vean comprometidas las contraseñas almacenadas, pero no las protege
|
|
necesariamente de ser interceptadas por un código malicioso inyectado en la
|
|
propia aplicación.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
<qandaentry xml:id="faq.passwords.fasthash">
|
|
<question>
|
|
<para>
|
|
¿Por qué las funciones hash más comunes como <function>md5</function> y
|
|
<function>sha1</function> no son adecuadas para las contraseñas?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Los algoritmos hash como MD5, SHA1 o SHA256 están diseñados para
|
|
ser muy rápidos y eficientes. Con las técnicas y equipos modernos,
|
|
es algo trivial extraer por fuerza bruta la salida de estos algoritmos,
|
|
para determinar los datos de entrada originales.
|
|
</para>
|
|
<para>
|
|
Dada la velocidad con que los ordenadores actuales pueden "invertir" estos algoritmos
|
|
hash, muchos profesionales de la seguridad recomiendan encarecidamente no
|
|
utilizarlas como funciones hash para contraseñas.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
<qandaentry xml:id="faq.passwords.bestpractice">
|
|
<question>
|
|
<para>
|
|
¿Qué hash debo aplicar a mis contraseñas, si las funciones hash más comunes
|
|
no son adecuadas?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Al aplicar un algoritmo hash, los dos factores más importantes son
|
|
el coste computacional y la sal. Cuanto más cueste aplicar un algoritmo
|
|
hash, más costará analizar su salida por fuerza bruta.
|
|
</para>
|
|
<para>
|
|
PHP proporciona una
|
|
<link linkend="book.password">API de hash de contraseñas nativa</link> que
|
|
maneja cuidadosamente <link linkend="function.password-hash">el empleo de hash</link>
|
|
y la <link linkend="function.password-verify">verificación de contraseñas</link>
|
|
de una manera segura.
|
|
</para>
|
|
<para>
|
|
Otra opción es la función <function>crypt</function>, la cual tiene
|
|
soporte para varios algoritmos hash. Al emplear
|
|
esta función, se garantiza que el algoritmo que se seleccione esté
|
|
disponible, debido a que PHP contiene implementaciones nativas de cada algoritomo
|
|
soportado, en caso de que el sistema no tenga soporte para uno o más de estos algoritmos.
|
|
</para>
|
|
<para>
|
|
El algoritmo recomendado para el empleo de contraseñas con hash es Blowfish, que
|
|
es también el predeterminado de la API de hash de contraseñas, que, aunque
|
|
es significativamente más caro computacionalmente que MD5 o SHA1, sigue
|
|
siendo escalable.
|
|
</para>
|
|
<para>
|
|
Observar que si se emplea <function>crypt</function> para verificar una
|
|
contraseña, será necesario tomar precauciones para evitar ataques de temporización
|
|
utilizando una comparación de string de tiempo constantes. Ni los
|
|
<link linkend="language.operators.comparison">operadores == y ===</link> de PHP
|
|
ni <function>strcmp</function> llevan a cabo una comparación de string de tiempo
|
|
constante. Debido a que <function>password_verify</function> hará esto de forma
|
|
automática, se recomienda el empleo de la
|
|
<link linkend="book.password">API de hash de contraseñas nativa</link>
|
|
siempre que sea posible.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
<qandaentry xml:id="faq.passwords.salt">
|
|
<question>
|
|
<para>
|
|
¿Qué es una sal (salt)?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Una sal criptográfica es un dato que se utiliza durante el proceso de hash
|
|
para eliminar la posibilidad de que el resultado pueda buscarse a partir de
|
|
una lista de pares precalculados de hash y sus entradas originales, conocidas
|
|
como tablas rainbow.
|
|
</para>
|
|
<para>
|
|
Es decir, una sal es un pequeño dato añadido que hace que los hash
|
|
sean significantemente más difíciles de crackear. Existe un gran número de
|
|
servicios online que ofrecen grandes listas de códigos hash precalculados,
|
|
junto con sus datos de entrada originales. El uso de una sal hace muy difícil o
|
|
imposible encontrar el hash resultante en cualquiera de estas listas.
|
|
</para>
|
|
<para>
|
|
<function>password_hash</function> creará una sal aleatoria si no se
|
|
proporciona una, siendo esta generalmente la estrategia más sencilla y
|
|
segura.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
<qandaentry xml:id="faq.password.storing-salts">
|
|
<question>
|
|
<para>
|
|
¿Cómo almaceno mis sales?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Al utilizar <function>password_hash</function> o
|
|
<function>crypt</function>, el valor devuelto incluye la sal como parte
|
|
del hash generado. Este valor debería almacenarse tal cual en la
|
|
base de datos, ya que incluye información sobre la función hash que se
|
|
empleó y así proporcionarla directamente a
|
|
<function>password_verify</function> o <function>crypt</function> al
|
|
verificar contraseñas.
|
|
</para>
|
|
<para>
|
|
El siguiente diagrama muestra el formato de un valor devuelto por
|
|
<function>crypt</function> o <function>password_hash</function>. Como se
|
|
puede observar, son autocontenidos, con toda la información del
|
|
algoritmo y la sal requerida para futuras verificaciones de contraseñas.
|
|
</para>
|
|
<para>
|
|
<mediaobject>
|
|
<alt>
|
|
Los componentes del valor devuelto por password_hash y crypt: en
|
|
orden, el algoritmo elegido, las opciones del algoritmo, la sal utilizada,
|
|
y la contraseña con hash.
|
|
</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
|
|
-->
|