Ayuda Login y Autenticación

Hola, estuve viendo varios ejemplos sobre la autenticación de usuarios, pero no tengo una idea clara aún, x ejemplo quiero trabajar con una base de datos en mysql para gestionar los usuarios, y estuve viendo que usaban metodos de encriptación para la autenticación.

Si alguien tiene un ejemplo claro de como realizar esto y el ingreso de nuevos usuarios, establecido los campos salt y el password hash. Le agradecería :)

Hola,

me imagino que tienes un campo con el salt generado aleatoriamente para el usuario cuando mete el password.

Luego tendrás otro campo con el hash generado usando el pass y el salt.

Sería comprobar en el login que el hash generado con el pass que introduce el usuario más el salt de la base de datos coincide con el hash general que hay en la BD para el usuario.

Puedes usar esto:

http://php.net/manual/es/function.hash-hmac.php

Y en el sitio donde hacer la lógica del login sería en el fichero /components/UserIdentity.php




class UserIdentity extends CUserIdentity

{


        private $_id;


	/**

	 * Authenticates a user.

	 * The example implementation makes sure if the username and password

	 * are both 'demo'.

	 * In practical applications, this should be changed to authenticate

	 * against some persistent user identity storage (e.g. database).

	 * @return boolean whether authentication succeeds.

	 */

	public function authenticate()

	{

                Yii::log("[UserIdentity][authenticate] - Login para el usuario: ".$this->username, 'info');


		$criteria = new CDbCriteria;

                $criteria->condition = "LOWER(username)='".strtolower($this->username)."'";


                $user=Usuarios::model()->with('grupos')->together()->find($criteria);


		if($user===null) {

			$this->errorCode=self::ERROR_USERNAME_INVALID;


                        Yii::log("[UserIdentity][authenticate] - Login incorrecto para el usuario: ".$this->username, 'info');


                } else if(($this->password)!==$user->password) {

		//else if(md5($this->password)!==$user->password)

			$this->errorCode=self::ERROR_PASSWORD_INVALID;


                        Yii::log("[UserIdentity][authenticate] - Login incorrecto para el usuario: ".$user->username, 'info');

                } else if(($this->password)===$user->password) {

			$this->_id=$user->id_usuario;

			$this->username=$user->username;

                        $this->setState('usuario_id_usuario', $user->id_usuario);

                        $this->setState('usuario_username', $user->username);

                        $this->setState('usuario_nombre', $user->nombre);

                        $this->setState('usuario_email', $user->email);

                        $this->setState('grupo_nombre', $user->grupos->nombre);

                        $this->setState('grupo_codigo', $user->grupos->codigo);

                        Yii::log("[UserIdentity][authenticate] - ID Usuario: ".$user->id_usuario, 'info');

                        Yii::log("[UserIdentity][authenticate] - Usuario: ".$user->nombre, 'info');

                        Yii::log("[UserIdentity][authenticate] - Grupo: ".$user->grupos->nombre, 'info');

			$this->errorCode=self::ERROR_NONE;


                        Yii::log("[UserIdentity][authenticate] - Login correcto para el usuario: ".$user->username, 'info');

                        

		}

		return !$this->errorCode;

	}


        /**

	 * @return integer the ID of the user record

	 */

	public function getId()

	{

		return $this->_id;

	}

}



Estas línea son las que hay que cambiar y poner que compare el hash que tu haces con el salt de la bd y el password que envía el usuario con el hash general que ya tienes en la bd:

            } else if(($this->password)!==$user->password) {





            } else if(($this->password)===$user->password) {

Si coinciden entonces entraría en la aplicación.

Para el tema de crear nuevos usuarios, sería en tu sección de administración, habrá una vista con el formulario a rellenar por el usuario y tendrás una acción de CreateUser donde generarás el salt y el hash general y meterás todo haciendo un save() del formulario. Tendrás que cambiar el modelo y el formulario para añadir el campo salt y el campo hash general. En el form pondrás en hidden el salt y el hash.

Yo lo implementaré luego para la aplicación con la que estoy porque ahora mismo lo tengo hecho que almacene el pass en plano. Lo había dejado para el final.

Saludos.

Luisis,

la verdad no se si tienes claro el concepto de salt…

Simplemente es generar una clave aleatoria (que te hará de semilla) y junto con el password del usuario se genera un hash general, usando un método de encriptación (md5, sha1, etc…).

En la BD entonces guardas para cada usuario:

  • salt, que es la semilla para sacar el hash general.

  • hash_general, que se saca usando un método de encriptación, una semilla (que es el salt) y el pass del usuario que te vendrá cuando haga login o rellene el formulario de alta de la aplicación.

Cuando se da de alta el usuario se hace una semilla nueva, se realiza un hash general con la semilla y el pass que ha puesto el usuario y se usa una encriptación. Se guarda en BD el hash general generado y la semilla. No se guarda el pass del usuario.

De esta manera cuando el usuario intente hacer login en la bd lo que se hará para comprobar la contraseña es recoger del formulario su password, y de la bd el salt (semilla) y el hash general. Se saca el hash general usando la semilla y el pass del usuario y el resultado se compara con el hash general traido de la bd. Si son iguales entonces el pass es el correcto de cuando se dió de alta el usuario.

De esta manera no se almacenan los passwords en la bd y al usar una semilla aleatoria para cada usuario el hash generado será único o por lo menos "casi único". Podría darse el caso que con otra semilla y con otro password el hash general generado coincida con el de la bd, pero eso es muy improbable.

No se si te sirve de algo esto…

Muchas gracias Sagitta, si me sirvió de muxo, a veces la documentación no queda muy clara pero gracias al forum uno sigue aprendiendo mas. :D

Gracias!!! De verdad que no tenía ni idea de lo que pasaba cuando se encripta algo.