Seguridad en contraseñas

Estoy realizando una web.
Mi duda es como garantizar la seguridad de la contraseña del usuario, me explico, en el formulario de login, el usuario indica su contraseña, dicha contraseña ha de "viajar" hasta el servidor para ser validada, ¿cómo encripto yo esa contraseña de manera segura de manera que no la puedan interceptar por el camino?
Si la envío tal cual, es muy fácil de capturarla y si la encripto mediante javascript editando el fichero pueden saberla también ¿no?, así pues, ¿cómo lo puedo hacer?

Respuesta

Casi te diría, deja que el usuario que autentique con facebook o google usando Oauth2+openid, hay que estudiarlo, y eso. Pero esa parte la aseguras.

Tienes que cifrar con TSL para que sea confidencial.. uf esto es muy largo de explicar, no sé si te he aclarado o complicado

2 respuestas más de otros expertos

Respuesta
1

Un tutorial que encontré por internet...

¿
<?php
Include('config.php');//Incluimos la conexion a la base de datos.
if (($_POST['user']== '') or ($_POST['passwd']== '') or ($_POST['passwd2']== '')){
echo "Te faltaron rellenar campos";
}else{
if($_POST['passwd'] != $_POST['passwd2']){
echo "Las contrasenas no coinciden";
}else{
$user = stripslashes($_POST["user"]);
$user = strip_tags($user);
// Quitamos las etiquetas html y lo relacionado a el usuario.
$pass = stripslashes($_POST["passwd"]);
$pass = strip_tags($pass);
// Quitamos las etiquetas html y lo relacionado a el password.
/* _____________________________________ */
// Comenzamos con la encriptacion a el estilo de Xt3mP.
$pass_encriptada1 = md5 ($pass); //Encriptacion nivel 1
$pass_encriptada2 = crc32($pass_encriptada1); //Encriptacion nivel 1
$pass_encriptada3 = crypt($pass_encriptada2, "xtemp"); //Encriptacion nivel 2
$pass_encriptada4 = sha1("xtemp".$pass_encriptada3); //Encriptacion nivel 3
// Aqui será demasiado dificil poder llegar a la password verdadera ya que por ejemplo, podrian desencriptar el md5 pero aún faltaria demasiado.
$usuarios = mysql_query("SELECT usuarios FROM cuentas WHERE usuarios='$user' ");
// Seleccionamos el campo usuarios de la tabla cuentas en donde el usuario es el que escriben en el campo user
if($usuarios2 = mysql_fetch_array($usuarios))
{
echo 'El usuario '.$user.' ya esta registrado';
mysql_free_result($usuarios);
// Liberamos la memoria
}else{
mysql_query("INSERT INTO cuentas (usuarios,pass) values ('$user','$pass')");
//Insertamos los valores de el user y pass en los campos usuarios y pass de la tabla cuentas
echo "El usuario '.$user.' ha sido registrado con éxito.';
//Decimos que el usuario ha sido registrado, etc.
}
}
}
?>

La encriptación que realiza...

Encriptación MD5: 0fcf520c7c5f6a56b69244eeb9bfb98d
Encriptación MD5/crc32: -521765068
Encriptación MD5/crc32/Semilla: xtOtXrnGfYSMM
Encriptación MD5/crc32/Semilla/sha1: fa097e6b9dd4149f78b3e8c9917ff9eb38995da8

Gracias!!!

Vaya currada!!! (aunque sea encontrado en internet).

Más que la parte de la encriptación, que te lo agradezco, mis dudas vienen a la hora de transmitir la información desde el local (html/javascript) al servidor (php), no había caído en el tema de enviarlo mediante POST, pero mi duda sigue siendo la que era, enviando la contraseña mediante un form (POST) ¿no hay peligro que la puedan capturar? ya que dicha contraseña se envía sin ningún tipo de encriptación no sé si me explico ...

Gracias, de nuevo.

Hombre, donde se suele encriptar es cuando las almacenas en la cookie o en la propia base de datos, te podría buscar un código para encriptarla desde javascript antes de enviarla. Lo que harías es poner el input donde el usuario pone la contraseña y al lado otro oculto <input type="hidden" name="encryptpass"> donde desde javascript introduzcas la contraseña y luego desde javascript también una vez introducida la contraseña encriptada envíes el form.

document.form1.submit();

Para que antes de que se envíe ejecute la función en javascript debes poner

<form method="post" action"lo que sea" onSubmit="return encriptar()">

Igual estoy algo equivocado, pero almacenándola en la cookie (que no lo hago) estamos en lo mismo ¿no?, incluso te diría que es mejor encriptar desde local (en javascript), mi razonamiento, es que si tienes la máquina "bien segura", con antivirus, con firewall, sin troyanos y demás, lo que hagas ahí está protegido, por lo que si encriptas la contraseña y la envías ya encriptada, lo que ocurra en el "exterior", o sea en la transmisión mediante POST,GET o manipulación en php, ya no lo controlas, pero como está encriptada tanto da ¿no?.

Otra cuestión sobre lo mismo: La información de los usuarios / clientes, en la base de datos ¿como se suele almacenar? ¿encriptada o sin encriptar?, es curiosidad ...

Se suele almacenar sin encriptar.

Otra cosa, cuando creas el $_SESSION o una $_COOKIE si es con los datos de inicio deberías almacenarlos encriptados para que no puedan acceder, aunque tengas la maquina protegida al máximo.

Al encriptarla por javascript podrían acceder muy fácilmente al código que encripta la clave y podrían saber desencriptarla.

Normalmente, por POST, los datos viajan seguros por el servidor. Pero también se pueden hackear. Piensa que se meten en cuentas bancarias...

Si, y bastante, nunca había hecho una web en la que me importara la seguridad, y ahora estoy haciendo una que si ... que por cierto, con estas consultas que te he hecho, me he dado cuenta de una cosa que estaba haciendo mal, enviaba la información al servidor mediante un IFRAME, y claro me acabo de acordar y de darme cuenta que sería mejor mediante un FORM y mediante POST, ya que mediante el IFRAME se envía mediante un GET ... ¿es correcto lo que digo?

Efectivamente, si lo envías mediante iframe cualquiera que visite la web puede acceder a la url del iframe y por lo tanto ver las variables pasadas por GET.

Cuando te refieres a que puede acceder a la url del iframe ¿a que te refieres? ... porque en ningún sitio se puede ver la dirección del iframe, bueno, puede saber que va a un php, el cómo se llama y puede saber si edita el código fuente, el nombre de los parámetros, pero no el valor que transportan esos parámetros, no sé. ...

Si pasas los valores por GET si se puede saber a donde va el iframe

Al pasar los valores por GET estas mandándole en el iframe lo siguiente

<iframe src="url.php?valor1=elvalor&valor2=elvalor"

En cualquier página, si usas google chrome o firefox, pinchas con el botón derecho sobre el iframe y luego pincha en la opción Inspeccionar elemento

Esta opción te permite ver el html de la web, por lo tanto el código del iframe con la ruta en el src del iframe.

Si.

Bueno, cierro la pregunta, aunque quizá tenga que volver a ella ... tendré que seguir investigando con lo que tú me has dicho, mas algo que "invente" yo ... en fin .. Gracias.

Respuesta
1

Te recomiendo que utilices md5, es una de las maneras mas segurar para contraseñas :), lo que tienes que hacer es guardar en tu base de datos la contraseña encriptada con md5, entonces al momento de que el usuario ingrese su contraseña en el login, tu tiene que pescar esos valores y encriptarlos y compararlos con los de la base de datos.

Saludos y suerte! :D

@JuanGarciaR

Gracias, si, eso haré ... pero una cosa ... la encriptación se realiza en php ¿no?, por lo que en principio la contraseña, que se ingresa en local ha de viajar hasta el servidor sin encriptar ... eso si pasándose mediante POST, ... ¿es eso seguro?

Por lo general, todos los datos enviados por POST, son mas seguro obviamente que mandarlos por GET, pero si mandas los datos por POST y lo encriptas con md5 no deberías tener problemas, y si, la encriptación se hacer con php, pero no deberías tener problemas con inyecciones sql, si es tu preocupación, ya que cuando los datos lleguen al archivo php que valida al usuario encriptaras esa contraseña, para luego hacer la comparacion ;)

Bueno, lo que me preocupa es que el primer envío de todos se hace sin protección, sin encriptar, luego llegas al php, lo encriptas y lo almacenas en bbdd...

En lo siguiente: el usuario pone su contraseña, la envía sin encriptar (vía POST), llega al php, la encripta y la compara con la que hay en bbdd, si ok sigue, si no, adiós.

Me refiero es que tanto en un caso como en otro, el primer paso siempre es sin encriptar ... por mucho POST que envíes ...

¿No te parece a ti que la seguridad "flojea" por ahí bastante?

No, siempre se usa así amigo mio, por lo menos yo no he tenido problemas al usarlo así.

Si, se utilizará así, pero es como si estás en un sitio de guerra, y te dicen al salir de casa: "mira, tienes que recorrer 100 metros a pecho descubierto, y cuando llegues te darán todo el equipo: chaleco antibalas, traje de camuflaje ... " ... si, si, todo muy bonito pero ¿y esos 100 metros? ...

Pues eso.

Gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas