Encriptar contraseña o datos MD5, Sha1

publicado por: Anonymous

estoy por crear un proyecto, quiero enfocarme mucho en la seguridad que este vaya a tener, y bueno estoy por desarrollar el inicio de sesión, en lo general yo utilizo el Sha-1 para encriptar las contraseñas, no sé si es lo más seguro, pero hasta ahora es robusto a diferencia de MD5.

Mi pregunta es si estoy bien con el Sha1 en cuestiones de seguridad y encriptación de datos en este caso contraseña, o hay algun otro Hash más seguro que pueda utilizar?

Como les mencionaba quiero enfocarme lo más posible a la seguridad en este sistema, si saben información extra acerca de seguridad o por experiencias, en verdad que me serviria de mucho

solución

Introducción


Siempre nos centramos en colocar seguridad en nuestro sistema, pero el problema no radica en protegerlo externamente, sino internamente.

Incluso aunque coloquemos a Chuck Norris a proteger el sistema, si nuestra Base de datos esta mal diseñada o nuestras sentencias SQL están mal estructuradas, el sistema sera inseguro.


Por eso aqui dejo unas pequeñas recomendaciones:

1) Utiliza PDO en vez de mysql / mysqli, aumentas la seguridad y evitas SQL Injections

Leer:

2) Emplea las sentencias SQL como un lenguaje de programacion (el cual es) y NO como un simple string.

3) Evita usar GET, y usa POST.


Seguridad en las contraseñas:


Una máxima de la programación que considero importante: “Desconfía SIEMPRE del usuario”, por esta razón debo evitar darles llaves (usadas en métodos de encriptacion simetricos y asimetricos), o formas de decodificar la información, un usuario normal no haría nada, pero uno con conocimientos o incluso con solo curiosidad podría hacer estragos.

Leer:
Seguridad – Diferencias Entre Cifrado Simétrico, Asimétrico Y Hashing: http://blog.capacityacademy.com/2013/08/16/seguridad-informatica-cifrado-simetrico-asimetrico-hashing/

¿Entonces que debo hacer?:


Usar un hashing:


Los hash o funciones de resumen son algoritmos que consiguen crear a
partir de una entrada (ya sea un texto, una contraseña o un archivo,
por ejemplo) una salida alfanumérica de longitud normalmente fija que
representa un resumen de toda la información que se le ha dado (es
decir, a partir de los datos de la entrada crea una cadena que solo
puede volverse a crear con esos mismos datos).

El Hashing es una función matemática que no tiene inversa y produce un
resultado de longitud fija. A diferencia de la función de cifrado que
se utiliza para garantizar la confidencialidad de la información, la
función de hashing es utilizada en seguridad para garantizar la
integridad de la información.

En PHP tenemos varios metodos, entre ellos md5() y sha1(), pero la documentacion oficial nos dice esto:

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.

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.

Es decir, las pueden revertir:

Ejemplo:

Para mas investigación:

Manual de Contraseñas en PHP: http://php.net/manual/es/faq.passwords.php


¿Ahora bien que método usar?

Sencillo, uno nativo de PHP: password_hash().


Te dejare un link de un polyfill creado para PHP 5.5 de password_hash().

Aunque ya desde PHP 5.5 se trae incluido esta libreria este polyfill tiene un demo que explica como usarlo paso a paso:

PHP 5.5-like password functions for PHP 5.3 and 5.4:

https://github.com/Antnee/phpPasswordHashingLib


¿Como usarlo?:


$hash = password_hash('contraseña', TIPO_DE_ENCRIPTACION);
$hash = password_hash('contraseña', PASSWORD_DEFAULT); //Ejemplo uso DEFAULT

Esta sera la contraseña que guardaremos en la base de datos.

Para verificar:

Obtenemos la contraseña de la BD.

$hash = "qwrqwr25q25q25q25h235h125"; // Ejemplo

Ahora guardamos en una variable el POST de la contraseña introducida para entrar al sistema:

$contraseña = $_POST["password"];

Utilizamos password_verify(), este se encargara de revisar si ese dato corresponde al hash que tenemos guardado.

$hash = "qwrqwr25q25q25q25h235h125"; // Hash en base de datos

$match = password_verify($contraseña, $hash);

PHP guardara el salt usado para verificar la valides de esa contraseña, si tenemos 100 veces el mismo dato, ejemplo “123456”, cada hash tendra diferentes valores.

Ahora bien, se recomienda que el campo de contraseña en la base de datos tengo como longitud 255 y ademas sea tipo varchar, pues el hash es una combinación de letras y números.

Si protegemos la base de datos, empleamos sentencias seguras, usamos
PDO, y hasheo de datos, el sistema estara internamente 99% seguro.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *