Foros del Web » Programando para Internet » PHP »

encriptar password y activar cuenta desde email!

Estas en el tema de encriptar password y activar cuenta desde email! en el foro de PHP en Foros del Web. Estimado Cluster y amigos de este foro Realmente admiro los conocimientos de cluster y en algún tiempo mas espero convertirme en un apoyo en este ...
  #1 (permalink)  
Antiguo 23/01/2003, 23:13
 
Fecha de Ingreso: enero-2003
Ubicación: Santiago
Mensajes: 301
Antigüedad: 14 años, 10 meses
Puntos: 1
Mensaje encriptar password y activar cuenta desde email!

Estimado Cluster y amigos de este foro
Realmente admiro los conocimientos de cluster y en algún tiempo mas espero convertirme en un apoyo en este foro que realmente es rapidisimo, antes ya lo usaba con otro nick que no lo recuerdo en este momento...

soy un usuario de nivel intermedio(uso de forms, envío de email, interacción con Mysql, manejo de sesiones , cookies y otros temas que manejo a un nivel aceptable)
Ok, tengo algunas consultas para ti (voy a ser muy claro aunque sea muy obvio):

1- confeccioné un script que permite almacenar en mi BD a todos los usuarios que deseen ingresar a un sitio restringido, cada usuario debera ingresar su login y password para poder entrar, en caso contrario ...No!(obvio), esto lo manejo con sesiones y cuando sale del sitio le hago un logout y todo me sale a la perfección..

ej: hola usuariojuanx .... y al salir chao usuario juanx

pero ya se hacer eso ahora he estado estudiando el tema de encriptar la password del usuario, por lo que he leido se puede usar md5 o algunas tecnicas con mcrypt (hay que instalar esas opciones...creo) ok ..lo hice con md5

//$clave es la variable que guarda la password en el form
$encryptar = md5($clave);
$link=Conectarse();
mysql_query("insert into datos (Nombre,Apellido,clave,login) values ('$Nombre','$Apellido','$encryptar','$login')",$li nk);

$destino = "[email protected]";
$asunt="Confirmación Registro";
$mensaje = "Usuario $Nombre $Apellido\n\n A continuación se le han asignado los sgtes datos;
mail($destino,$asunt,$mensaje,"From: [email protected]");
echo "Usuario $login bla bla;

*-lo que hace este script; se inserta el registro del usuario con la PASSWORD ENCRIPTADA en la base de datos y le envía un mensaje por email al usuario con sus datos claves(esto está ok..)

*-lo quiero hacer en este script; es que por ejemplo si el usuario ingresa como password = esaes77 me encripte esta clave y genere otro valor para que sea almacenado en la base de datos por ejemplo: ewfstdtf22323ftfyx , entonces el usuario cuando desee ingresar al sitio restringido ingrese su login y su password=esaes77 .

*- otra cosa que me gustaría saber y posteriormente hacer; algo similar a como lo hace este foro cuando un usuario se registra, osea, que sus datos sean enviado por email con sus datos login y passwrod=esaes77 para activar sus datos.


me parece que con la funcion md5 no puedo hacer esto, entonces como!(he leído lo del manual oficial de php pero necesito algunos ejemplos que me orienten en esta tarea.

espero haber sido claro y espero alguna respuesta, en realidad necesito de tu ayuda.

Cristian M.
[email protected]
__________________
Cristian...
  #2 (permalink)  
Antiguo 24/01/2003, 03:30
Avatar de BVis  
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 104
Antigüedad: 15 años
Puntos: 0
Lo que se suele emplear habitualmente, es responder por email, con una nueva contraseña temporal, generada de forma aleatoria. Dándole la posibilidad al usuario de cambiarla manualmente por otra.

Aquí explico por encima una forma sencilla de implementar encriptación de contraseñas, usando directamente las funciones que incorpora MySQL.

Al insertar el Usuario (se supone que las variables provienen de un formulario que emplea el método POST):

$sql = "INSERT INTO usuarios (varioscampos='variosvalores', password=PASSWORD('{$_POST['password']}'))";

Despues cada vez que se quiera autentificar al usuario:

$sql = "SELECT cualquier_campo FROM usuarios WHERE id={$_POST['id']} AND password=PASSWORD('{$_POST['password']}')";

Y despues mirar el resultado de mysql_num_rows(), si vale 1, entonces OK, sino ERROR.

Así empleamos una de las funciones de encriptación de passwords que usa MySQL (hay otras).

NOTA: El campo 'password' es recomendable hacerlo tipo VARCHAR de bastantes caracteres, pues las claves encriptadas suelen quedar algo...larguillas.

Todas estas funciones de encriptación de contraseñas son unidireccionales, pues usan funciones de HASH, y es imposible recuperar el valor original, si no es por un ataque de 'fuerza bruta'.

Lo cierto, es que este sistema es el clásico y más seguro, pues nadie más que el usuario conoce el valor real de la contraseña. Y en caso de olvidársele, se le enviará una temporal a la dirección email segura indicada en el momento del registro. Para comprovar la identidad del individuo se suele emplear una pregunta de tipo 'personal'.

1 Saludo
__________________
"Yo opino lo mismo que BVis, el de 'forosdelweb' " - Bill Gates

Última edición por BVis; 24/01/2003 a las 03:34
  #3 (permalink)  
Antiguo 24/01/2003, 16:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
nav2003 .. ¿te das cuenta que no soy el único en el foro que puede ayudarte?

Solo añadir q funciones de 'HASH' .. por ejemplo son tambien MD5() .. la mas conocida ..

Y .. Tanto PHP como Mysql soportan e implementan estas fuciones .. BVis está empleando la fucion password() de MYSQL (Mysql tambien soporta MD5() ) .. Pero PHP igualmente puede generarlas con las funciones de mismo nombre (coinciden la mayoria) .. Lo que no hay q confundir es cuando la funcion es Mysql o es PHP .. si va en la sentencia SQL es de suponer q es Mysql. Lo comento pues la mayoria de personas suelen hacer esos cálculos de funcones en PHP para luego insertar su resultado como valor en una consulta Mysql .. siendo mas Optimo hacerlo todo en Mysql (via la sentencia SQL correspondiente) ...

Si no te quedó claro algo .. no dudes en pregunta "al foro" y de forma genérica .. veras q siempre alguien te puede ayudar.

Un saludo,
  #4 (permalink)  
Antiguo 24/01/2003, 17:50
Avatar de BVis  
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 104
Antigüedad: 15 años
Puntos: 0
bueno Cluster, supongo que esto influía algo en su "pregunta dirigida"...

BVis
Mensajes: 67


Cluster
Mensajes: 3667


jeje.... Se ve que tienes muucho tiempo libre.

1 Saludo.
__________________
"Yo opino lo mismo que BVis, el de 'forosdelweb' " - Bill Gates
  #5 (permalink)  
Antiguo 24/01/2003, 18:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Ganas diria yo xD .. siempre tengo un buen rato o ratitos de ocio en el dia q los paso aquí en el foro.

Pero q tenga mas predispodición a responder ( o intentarlo al menos) no quiere decir que "sepa mas" como aquí y siempre se está demostrando en el foro .. Eso es bueno y por lo mismo les sugiero a todos los que responden que lo hagan pese que yo haya respondido algo .. siempre hay puntos de vista diferentes o puedo estar equivocado, eso enriquece el foro y aprendemos todos.

Un saludo,
  #6 (permalink)  
Antiguo 26/01/2003, 22:56
 
Fecha de Ingreso: enero-2003
Ubicación: Santiago
Mensajes: 301
Antigüedad: 14 años, 10 meses
Puntos: 1
gracias por sus respuestas, no esperaba menos de este foro compadre!..
Sin embargo después de leer ver códigos y pensar un poco mas las distintas opciones y lo más simple para efectuar este tema, fue usar la funcion MD5 de php y un extracto del código es el sgte:

el formulario de registro del usuario me envia a este fichero que encripta la password .

<?php
function Conex()
{
bla bla....
}
//me conecto al BD

$link=Conex();

//valido que los campos no sean vacíos
if(empty($Nombre) || empty($Apellido) || empty($clave) || empty($login)){
Header("Location:formulario.php");
exit();
}

$encript = md5($clave);
mysql_query("insert into datos (Nombre,Apellido,clave,login) values ('$Nombre','$Apellido','$encript','$login')",$link );

echo" $Nombre $Apellido<b>has sido registrado Exitosamente!...
$destino = "[email protected]";
$asunt="Confirmación Registro";
$mensaje = "Usuario $Nombre $Apellido\n\n A continuación se le han asignado los sgtes datos;
mail($destino,$asunt,$mensaje,"From: [email protected]");
echo "Usuario $login bla bla;

<p><input type=button value=\"Cerrar \" onClick=window.close(); name=button>";
?>


formulario de login y password access.php

<form action="accede.php" method=post>
NombreUsuario:
<input type=text name="nombre"><br>
Password:
<input type=password name="passwd"><br>
<input type=submit value="Entrar" name="submit">
</form>


accede.php, este fichero encripta la password ingresada desde el form y la compara con la existente.

<?php
function conectarBD() {
mysql_connect("","","");
mysql_select_db("curriculum");
}
//Verificamos campos en blanco
if(empty($nombre) || empty($passwd)){
Header("Location:access.php");
exit();
}
conectarBD();
$encript_new = md5($passwd);
$result = mysql_query("SELECT clave,login FROM datos WHERE login= '$nombre'");
$row = mysql_fetch_array($result);
if ($encript_new==$row['clave'])
{
session_start();
$login=$nombre;
session_register("login");
header("Location:pag_restringida.php");
}
else
{
header("Location:false.php");
}
?>


luego desde pag.restringida.php valido si la sesion del usuario para dejarlo entrar si no lo mando a la cres....!!

es algo muy simple pero funciona..

ahora el otro punto que tengo en conflicto es cuando el usuario es almacenado en la base datos, se le envía un mail con sus datos en forma automática(eso lo se hacer) pero estoy cabeceandome para ver como o mejor dicho que es lo que debo hacer para ACTIVAR SU REGISTRO...como dije en el mensaje anterior ese link que envía por ejemplo este sistema de foros de activación de cuenta...por ahora no sé..quizás mañana sí y con la ayuda de uds ahora ..

de todos modos saludos y de alguna forma a contribuir
__________________
Cristian...
  #7 (permalink)  
Antiguo 27/01/2003, 05:27
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Para hacer el "confirmar activación" de la cuenta usa un campo extra en tu BD tipo "flag" (estado, bandera) .. el cual en el primer instante del registro este a "No activo" ..

El proceso seria el siguiente:

*** Al registrase el usuario .. das de alta el nuevo registro con su nombre de usuario/password + el campo "flag" (estado) iniciado en "No activo" ( un simple CHAR(1) te sirve y pones algo tipo "N" o "S" o "0" .. "1" y usas un campo numerico(1) ...)

*** Le envias el mail de confirmación .. ahí solo debes especifiar el link hacia el scritp de confirmación .. el cual debe pedir El passwor minimo del usuario (un formulario) (eso si le pasas en el link del mail el nombre del usuario tipo: activar_cuenta.php?nick=fulanito ...)

** activa_cuenta.php .. chekea el usuario/password en tu BD si es correcto (existe y el "flag" activado= "no activado" ... ) ahí cambias (UPDATE) de ese flag y lo pasas a "activado" .. Si el flag está activado puedes mostrar algun mensaje de error tipo "ya activó su cuenta con anterioridad" ...

*** termina el proceso enviandole a tu formulario de "login" para q se identifique en tu sistema de forma normal ...

Observaciones:
Puedes usar un campo + extra .. en el que guardes la fecha de pre-registro/activación de la cuenta .. Al confirmar el registro via mail .. actualizas (UPDATE) el campo "flag-activado" y este nuevo con la fecha de "activación" .. Este campo "fecha de activación" te servirá para hacerte algun script de mantención de cuentas NO activadas .. borrando registros por fecha de expiración (de fecha superior a una que determines tu con respecto a la fecha actual y si el flag "activado" sigue en modo "no activado" ...)


Un saludo,

pd: Usa exit; despues de tus header("location: ....");

Última edición por Cluster; 27/01/2003 a las 05:31
  #8 (permalink)  
Antiguo 27/01/2003, 10:07
Avatar de MSDark  
Fecha de Ingreso: noviembre-2002
Ubicación: Talca VII región
Mensajes: 337
Antigüedad: 15 años, 1 mes
Puntos: 1
Hola

yo usaba la funcion base64_encode() para encriptar la clave y luego base64_decode() para desencriptarla

Y sobre lod e actigvar por mail yo lo que hacia tenia dos tablas user_activados y users donde cuando se registraba alguien se insertaba eso en la tabla users y cuando se activaba se borraba de esa tabla y se insertaban esos datos en user_activados, en algo mas engorroso pero funcionaba.

Saludos
__________________
DelirioLinux.. Software Libre y tecnología.. php también..
Saludos :arriba:
Usuario Linux #198486 y Ubuntu #12791
Gutsy Gibbon
  #9 (permalink)  
Antiguo 27/01/2003, 11:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Mensaje Original por MSDark
Hola

yo usaba la funcion base64_encode() para encriptar la clave y luego base64_decode() para desencriptarla

Y sobre lod e actigvar por mail yo lo que hacia tenia dos tablas user_activados y users donde cuando se registraba alguien se insertaba eso en la tabla users y cuando se activaba se borraba de esa tabla y se insertaban esos datos en user_activados, en algo mas engorroso pero funcionaba.

Saludos
Espero q digas "usabas" .. porque base64_xxx() no es "encriptación" .. es solo "codificación" .. pese q a ti y mucha gente le parezca "encriptado" pues no es "legible" una cadena pasada por esa funcion ...

Un saludo,
  #10 (permalink)  
Antiguo 27/01/2003, 11:37
Avatar de MSDark  
Fecha de Ingreso: noviembre-2002
Ubicación: Talca VII región
Mensajes: 337
Antigüedad: 15 años, 1 mes
Puntos: 1
bueno si USE pensando que era encriptacion por que buscando en el manual de php (ayuda de windows) la fuciones de encriptacion sale base64_xxx() como una de ellas

pero ya no!!!!!!! desde un tiempo a esta parte uso las sentencias de mysql ya que md5 no se como desencriptarla xD
__________________
DelirioLinux.. Software Libre y tecnología.. php también..
Saludos :arriba:
Usuario Linux #198486 y Ubuntu #12791
Gutsy Gibbon
  #11 (permalink)  
Antiguo 30/01/2003, 22:03
 
Fecha de Ingreso: enero-2003
Ubicación: Santiago
Mensajes: 301
Antigüedad: 14 años, 10 meses
Puntos: 1
ok, cluster ..me parece que es muy valida tu sugerencia, la voy a chequear y despues la posteo acá..gracias compadre
__________________
Cristian...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:38.