Autor Tema: [Función] Encriptación de contraseñas  (Leído 546 veces)

Desconectado iStocker

  • PHPer@ Fijo
  • ***
  • Mensajes: 104
  • Karma: 6
  • ~ єssєитιαʟ ~
    • Ver Perfil
[Función] Encriptación de contraseñas
« en: 06 de Noviembre de 2012, 04:07:36 am »
Hablando de exagerar, eso fue lo que hice con la siguiente función. La hice con el único propósito de ver el funcionamiento de una función de PHP (str_split) & bueno, para verla en todo su esplendor decidí crear una forma de encriptación de contraseñas, un poco exagerada...

El código ya tiene comentarios, así que explicarlo es un tanto estúpido, así que no lo haré.

Parametros
crypto (Código secreto del usuario [string], contraseña del usuario [string], nombre del usuario [string], encriptación pro [booleano])

Salida - Encriptación pro desactivada (false)
nnyZanFudBugElmahosBuriaer

Salida - Encriptación pro activada (true)
9a262c44a6acf570d80f9c75edecf2336fe3e464

Código

Código: (php) [Seleccionar]
<?php
/* Este código fue desarrollado por iStocker & liberado por el mismo autor, la creación no cuenta con derechos de autor, pero agradecería que se conservaran. Gracias por la atención a éste mensaje. [url]http://kekomundo.com/foro/index.php?action=profile;u=12804[/url] */

# Creamos las variables que la función usará, ustedes las pueden conseguir de la base de datos.
$codigo "BugsBunny";
$contra "Zanahoria23";
$nombre "Elmer Fudd";

function 
crypto($codigo$contra$nombre$pro){
# Dividimos la frase en 3 letras. Ejemplo: Abe-ced-ari-o. Las líneas medias dividen la oración, sólo usaremos las 3 primeras partes de la oración.
$codigo str_split($codigo3);
$contra str_split($contra3);
$nombre str_split($nombre3);
# Creamos una variable con las frases dividas de una manera exacta.
$crypto $codigo[2].$contra[0].$nombre[2].$codigo[0].$nombre[0].$contra[1].$codigo[1].$contra[2].$nombre[1];
# Comprobamos que la opción de encriptación "pro" esté activada (true/false). Devolvemos un valor encriptado.
return ($pro == true) ? sha1(md5(sha1($crypto))) : $crypto;
}

# Creamos una condicional para ver que todas las palabras contengan más de 9 carácteres & mostramos el resultado.
echo (strlen($codigo)>=&& strlen($contra)>=&& strlen($nombre)>=9) ? crypto($codigo$contra$nombretrue):&#39;El código, contraseña & nombre deben de ser mayores a 9 carácteres.&#39;;
?>

?>
¡FUUU!


Cita de: Mary Shaw
Menos del 10% del código tienen que ver directamente con el propósito del sistema; el resto tiene que ver con la entrada y salida, validación de datos, mantenimiento de estructuras de datos y otras labores domésticas



[/cent

Comunidad PHPeros

[Función] Encriptación de contraseñas
« en: 06 de Noviembre de 2012, 04:07:36 am »

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:[Función] Encriptación de contraseñas
« Respuesta #1 en: 06 de Noviembre de 2012, 13:34:22 pm »
Hola!

No quiero decir que esto esté mal, pero desde el punto de vista de cifrado de contraseñas es un poco... "rara".
No estás "exagerando" la seguridad del cifrado exactamente, más bien limitando, es decir, empeorándolo (con perdón).
Supongo que el problema que tu querías solucionar es que a partir del hash puedan obtener la pass en alguna base de datos de contraseñas online, pero eso también puedes arreglarlo con opciones mucho mas simples y más seguras.

Para empezar, ¿tiene un usuario que acordarse de 3 parámetros para su contraseña? ¿Nombre, contraseña y código secreto?

Después, mirando el código, concretamente esta linea:
$crypto = $codigo[2].$contra[0].$nombre[2].$codigo[0].$nombre[0].$contra[1].$codigo[1].$contra[2].$nombre[1];

Nos damos cuenta de que solo usas $loquesea[2], $loquesea[1] y $loquesea[0], es decir, que el resto de la string no importa para dar lugar al hash, por lo tanto, todas estas combinaciones darían el mismo hash.

$codigo = "BugsBunny";
$contra = "Zanahoria23";
$nombre = "Elmer Fudd";

$codigo = "BugsBunny";
$contra = "Zanahoria22Hola3";
$nombre = "Elmer FudLOLOLOd";

$codigo = "BugsBunnyHAYQUEVER";
$contra = "Zanahoria";
$nombre = "Elmer Fud<-LAL";

Y luego por último cifras con sha1, md5 y sha1 de nuevo.

No está mal y es curioso, pero aplicaciones tiene pocas.
Conseguirías lo mismo haciendo sha1, md5 y sha1 añadiendo un salt, pero tendrás menos colisiones, y por lo tanto será mejor.
Es más, conseguirías lo mismo siemplemente haciendo md5($pass."TEXTO_SECRETO_QUE_SOLO_YO_CONOZCO"); (un salt con md5)
O incluso poniendo consecutivamente el usuario y después la pass y luego cifras.

Otra solución es que tengas en cuenta que las palabras pueden ser mayores de 9 caracteres, pero tener longitud diferente, y mezclar adecuadamente esas strings.

Por último, solo decir que no es buena idea usar vuestros propios algoritmos para cifrar contraseñas y demás.
Es mucho mejor usar algoritmos ya probados que usar uno propio.

No es que yo sepa mucho de cifrados, pero he asistido a un par de cursos y he escuchado a gente que entiende de esto, y es lo que siempre recomiendan.

Saludos!
« Última modificación: 06 de Noviembre de 2012, 13:39:01 pm por CarlosRdrz »
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado iStocker

  • PHPer@ Fijo
  • ***
  • Mensajes: 104
  • Karma: 6
  • ~ єssєитιαʟ ~
    • Ver Perfil
Re:[Función] Encriptación de contraseñas
« Respuesta #2 en: 06 de Noviembre de 2012, 20:31:00 pm »
Hola!

No quiero decir que esto esté mal, pero desde el punto de vista de cifrado de contraseñas es un poco... "rara".
No estás "exagerando" la seguridad del cifrado exactamente, más bien limitando, es decir, empeorándolo (con perdón).
Supongo que el problema que tu querías solucionar es que a partir del hash puedan obtener la pass en alguna base de datos de contraseñas online, pero eso también puedes arreglarlo con opciones mucho mas simples y más seguras.

Para empezar, ¿tiene un usuario que acordarse de 3 parámetros para su contraseña? ¿Nombre, contraseña y código secreto?

Después, mirando el código, concretamente esta linea:
$crypto = $codigo[2].$contra[0].$nombre[2].$codigo[0].$nombre[0].$contra[1].$codigo[1].$contra[2].$nombre[1];

Nos damos cuenta de que solo usas $loquesea[2], $loquesea[1] y $loquesea[0], es decir, que el resto de la string no importa para dar lugar al hash, por lo tanto, todas estas combinaciones darían el mismo hash.

$codigo = "BugsBunny";
$contra = "Zanahoria23";
$nombre = "Elmer Fudd";

$codigo = "BugsBunny";
$contra = "Zanahoria22Hola3";
$nombre = "Elmer FudLOLOLOd";

$codigo = "BugsBunnyHAYQUEVER";
$contra = "Zanahoria";
$nombre = "Elmer Fud<-LAL";

Y luego por último cifras con sha1, md5 y sha1 de nuevo.

No está mal y es curioso, pero aplicaciones tiene pocas.
Conseguirías lo mismo haciendo sha1, md5 y sha1 añadiendo un salt, pero tendrás menos colisiones, y por lo tanto será mejor.
Es más, conseguirías lo mismo siemplemente haciendo md5($pass."TEXTO_SECRETO_QUE_SOLO_YO_CONOZCO"); (un salt con md5)
O incluso poniendo consecutivamente el usuario y después la pass y luego cifras.

Otra solución es que tengas en cuenta que las palabras pueden ser mayores de 9 caracteres, pero tener longitud diferente, y mezclar adecuadamente esas strings.

Por último, solo decir que no es buena idea usar vuestros propios algoritmos para cifrar contraseñas y demás.
Es mucho mejor usar algoritmos ya probados que usar uno propio.

No es que yo sepa mucho de cifrados, pero he asistido a un par de cursos y he escuchado a gente que entiende de esto, y es lo que siempre recomiendan.

Saludos!
De hecho todo éso lo pensé desde el momento que la terminé, fue por eso que la publiqué... Alguna función ha de tener, es cierto que es algo estúpido el algoritmo, pero destaco, una vez más, que sólo quería probar la función de PHP (str_split) & la única idea en mi mente fue esto.

De hecho normalmente en mis algoritmos uso una función ya establecida en PHP (crypt) que, por cierto, ya tiene la opción de encriptar a MD5, por lo tanto, más que "mi" algoritmo, sólo uso una función ya hecha por PHP, & un poco más segura que MD5 debido a que usa la misma frase a encriptar para crear el algoritmo, algo muy poco conocido, a pesar de ser una excelente función.

Agradezco mucho tu crítica, & al contrario de pedirme perdón, me alegra que me lo hayas comentado, directamente, como se debe & así poder ver mis errores. Una vez más, gracias.
¡FUUU!


Cita de: Mary Shaw
Menos del 10% del código tienen que ver directamente con el propósito del sistema; el resto tiene que ver con la entrada y salida, validación de datos, mantenimiento de estructuras de datos y otras labores domésticas



[/cent