1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-23 23:12:09 +01:00
Files
archived-doc-es/faq/passwords.xml
2025-03-28 19:19:12 +01:00

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
-->