[Duda] Forma mas segura de intercambio de datos php - db

Iniciado por cryp70n1c, 30 Octubre 2016, 13:55 PM

0 Miembros y 3 Visitantes están viendo este tema.

cryp70n1c



Bueno como mencioné en el título me preguntaba cual es la forma mas segura de transferir datos (nombre de usuarios, contraseñas y demás) desde la base de datos hacia el php y devuelta?

1) He leido que la mejor cifrado sería crypt y que MD5 ya sería totalmente insegura... Que opinan?
2) Usar las dos?
3) Si hay una forma mas segura cual sería?
3) Como se implementarían en este código?

P.s. Soy nuevo en php  :P

Código (php) [Seleccionar]

<?php
session_start();
try {
$base = new PDO("mysql:host=-------; dbname=--------""-------""--------");

$base->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);

$sql="SELECT * FROM usuarios WHERE email= :email AND password= :password";

$resultado=$base->prepare($sql);

$email htmlentities(addslashes($_POST["email"]));

$password MD5(htmlentities(addslashes($_POST["password"])));

$resultado->bindValue(":email",$email);

$resultado->bindValue(":password",$password);

$resultado->execute();

$numero_registros $resultado->rowCount();

if ($numero_registros != 0){
$_SESSION["username"]= $email;
header("location: perfil.php");
}else {
header("location:loginerror.php");
}
}catch (Exception $e){
die("Error: ".$e->getMessage());
}
?>


gAb1

Hola, si PHP y la base de datos los tienes en el mismo servidor no hay por qué preocuparse por el intercambio entre estos dos servicios ya que ambos se encuentran en el mismo equipo, otra cosa sería que estuviesen en distintos servidores.

Probablemente te refieras a la comunicación entre el cliente (el navegador del usuario) y el servidor. Actualmente no hay ninguna manera infalible, ya que se pueden robar los datos con una facilidad increible. Lo que hay que conseguir es que esos datos "secretos" estén cifrados de la mejor manera posible, pero desgraciadamente el que sepa va a poder saber lo que se envia.

Usa una libreria segura, como crypt o sha512 para hashear la contraseña, lo demás tambíen puedes hashearlo pero no suele hacerse.

No vale de nada hashear una contraseña en el servidor, ya que los datos ya han sido enviados en texto plano... Si, claro, para no guardarla tambien en texto plano, pero el daño ya está hecho. Aquí tienes una buena implementación en javascript de SHA.

Para protegerse de las tablas rainbow, podria saltearse el hash también en el cliente (y de nuevo en el servidor por si se roba y se usa para iniciar sesión), pero el problema sería de donde sacas el primer salt y como lo envias al servidor... Estaríamos en las mismas. Si a alguien se le ocurre como solucionar este problemilla que lo comparta.

En el cliente:
- Contraseña -> javascript -> SHA512 hash -> POST.

En el servidor:
- Generar random salt -> Saltear hash (hashear de nuevo el hash junto al salt).

Si necesias un ejemplo luego lo pongo.

bluff4value

Cita de: gAb1 en 30 Octubre 2016, 17:20 PM
Hola, si PHP y la base de datos los tienes en el mismo servidor no hay por qué preocuparse por el intercambio entre estos dos servicios ya que ambos se encuentran en el mismo equipo, otra cosa sería que estuviesen en distintos servidores.

Probablemente te refieras a la comunicación entre el cliente (el navegador del usuario) y el servidor. Actualmente no hay ninguna manera infalible, ya que se pueden robar los datos con una facilidad increible. Lo que hay que conseguir es que esos datos "secretos" estén cifrados de la mejor manera posible, pero desgraciadamente el que sepa va a poder saber lo que se envia.

Usa una libreria segura, como crypt o sha512 para hashear la contraseña, lo demás tambíen puedes hashearlo pero no suele hacerse.

No vale de nada hashear una contraseña en el servidor, ya que los datos ya han sido enviados en texto plano... Si, claro, para no guardarla tambien en texto plano, pero el daño ya está hecho. Aquí tienes una buena implementación en javascript de SHA.

Para protegerse de las tablas rainbow, podria saltearse el hash también en el cliente (y de nuevo en el servidor por si se roba y se usa para iniciar sesión), pero el problema sería de donde sacas el primer salt y como lo envias al servidor... Estaríamos en las mismas. Si a alguien se le ocurre como solucionar este problemilla que lo comparta.

En el cliente:
- Contraseña -> javascript -> SHA512 hash -> POST.

En el servidor:
- Generar random salt -> Saltear hash (hashear de nuevo el hash junto al salt).

Si necesias un ejemplo luego lo pongo.


Estoy de acuerdo en lo de usar sha512 o crypt pero en vez de general el has en el cliente mediante javascript si alguien esta en medio y te captura el hash podria conectarse a esa cuenta igualmente, para evitar esto yo creo que es mejor hacer todo sobre https de manera que ninguno de los datos ira sobre texto plano y ademas no tienes por que reazlizar el hash en el lado cliente y ademas se te cifra toda la conexion extremo a extremo por lo que me parece mejor alternativa.

Saludos

gAb1

Si, eso ya lo he dicho yo. Esta más que claro que se puede robar la información de inicio de sesión, ya sea la contraseña en texto plano o el hash y con cualquiera de los dos iniciar sesión. Pero entre que roben la contraseña en texto plano o un hash, es mucho mejor que solo sea el hash, ya que aunque existen tablas donde "pueda" (no es 100% seguro) estar la contraseña en texto plano, hay menos riesgo de que quede expuesta la contraseña del usuario y se use para entrar en otras webs/servicios online (porque como ya sabemos la mayoria solemos usar la misma  :P).

De todas maneras, a mí personalmente, no me hace ninguna gracia que mi contraseña (o cuenta bancaria, etc) se envie en texto plano, aunque sea mediante una conexión cifrada usando TLS. ¿Por que? Muy sencillo:

1º TLS ni ningún predecesor será 100% seguro, siempre habrá alguna manera de romper el cifrado o engañar al sistema y no creo que haga falta mencionar ataques conocidos que aún se siguen usando.

Solo con eso ya hay razón más que suficiente como para no mandar información sensible en texto plano.

2º (y no menos importante) Mi contraseña o cualquier otro dato sensible, deben ser secreto incluso para la empresa que ofrece el servicio. ¿Quien te asegura que esos datos que llegan al servidor, no son guardados en texto plano antes de ser hasheados/cifrados? (¿Enserio nadie habia pensado en esto antes? Debe ser que tengo una mente retorcida :P)

Lo dicho, a mi personalmente no me hace ninguna gracia.

HTTPS no es una medida infalible, es simplemente una capa más de seguridad que debe usarse como refuerzo sobra la seguridad que ya hayas implementado.

bluff4value

Sisi en ese aspecto totalmente de acuerdo contigo, solo añadia que es recomendable añadir ese protocolo de seguridad. Y añadiendo ademas a lo tuyo de enviar el hash si utilizamos algun salt para las contraseñas todavia mejor.

Saludos

[u]nsigned

Cita de: bluff4value en 30 Octubre 2016, 18:01 PM

Estoy de acuerdo en lo de usar sha512 o crypt pero en vez de general el has en el cliente mediante javascript si alguien esta en medio y te captura el hash podria conectarse a esa cuenta igualmente, para evitar esto yo creo que es mejor hacer todo sobre https de manera que ninguno de los datos ira sobre texto plano y ademas no tienes por que reazlizar el hash en el lado cliente y ademas se te cifra toda la conexion extremo a extremo por lo que me parece mejor alternativa.

Saludos

https tampoco es el santo grial de la seguridad. Por ejemplo un atacante en LAN podría hacerte un MITM con sslStrip.

Lo mas seguro hoy en dia ( en mi humilde opinión) es JSON Web Tokens (jwt), donde todo el trafico cliente<->servidor es en formato json y esta cifrado. Tiene la ventaja de no necesitar https y además es mas escalable. El dia de mañana poder conectar un app de smartphone, desktop o lo que sea a esta API(servidor). JWT será el corazon del Internet de las Cosas (IoT) que viene a ser algo como la web 3.0 donde casi todo esta conectado a internet (autos, lavadoras, casas, heladeras, la ropa, etc).

https://jwt.io/

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!