2012-07-16 19 views
10

Mi objetivo es tener una sal única para cada usuario en lugar de solo usar Configure::read('Security.salt') para cada usuario.CakePHP 2: anula el método de "contraseña" de AuthComponent

Sé que CakePHP 2.x ya no tiene contraseñas hash automáticamente. Esto me permite realizar la validación del modelo en contraseñas, lo cual es muy bueno. Sin embargo, no veo una manera de que pueda anular el método de "contraseña" de AuthComponent. Así que, aunque puedo controlar cómo se codifican las contraseñas antes de que se guarden en la base de datos, no puedo controlar cómo se codifican las contraseñas cuando se realiza el inicio de sesión real. Del libro de cocina:

No es necesario para cifrar las contraseñas antes de llamar $this->Auth->login().

¿Qué puedo hacer para que $this->Auth->login() usan un método personalizado de hash de la clave?

Gracias.

ACTUALIZACIÓN: Terminé yendo con la respuesta del Dr. Hannibal Lecter (creando un objeto de autenticación personalizado). He aquí cómo hacerlo:

Código antiguo:

$this->Auth->authenticate = array('Form' => array('fields' => array('username' => 'email'))); 

nuevo código (modificar "Formulario" en "Usuario"):

$this->Auth->authenticate = array('Custom' => array('fields' => array('username' => 'email'))); 

Crear "app/Controlador/Componente/autenticación/CustomAuthenticate.php "y hacer que se vea como esto:

<?php 
App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class CustomAuthenticate extends FormAuthenticate { 
} 

Copiar la "_findUser" y "" métodos de" _password lib/torta/controlador/Com ponent/Auth/BaseAuthenticate.php "y pégalos en la clase" CustomAuthenticate ". A continuación, realice los siguientes dos modificaciones al método "_findUser":

  1. Poner esta línea desde el "$ condiciones" matriz: $model . '.' . $fields['password'] => $this->_password($password),

  2. Cambio if (empty($result) || empty($result[$model])) { a if (empty($result) || empty($result[$model]) || $result[$model][$fields['password']] != $this->_password($password, $result[$model]['id'])) {

luego hacer las siguientes dos modificaciones al método "_password":

  1. Crear el parámetro "$ id" cambiando protected function _password($password) { a protected function _password($password, $id) {

  2. actualizar el valor de la sal cambiando return Security::hash($password, null, true); a return Security::hash($password, null, Configure::read('Security.salt') . $id);

Por último, actualizar todas las apariciones de AuthComponent::password utilizar Security::hash con la misma lógica que encima.

Respuesta

4

Probablemente pueda crear un custom auth object y cifrar la contraseña como desee. Eche un vistazo al existing auth objects para tener una idea general de cómo funcionan.

+0

¡Eso funcionó! Actualicé mi pregunta con el código correspondiente. ¡Gracias! – Nick

1

¿Ha considerado no usar la llamada Auth-> login() pero usando el código de la implementación actual en su modelo? (http://api20.cakephp.org/view_source/auth-component#line-506) Puede volver a escribir esto para satisfacer sus necesidades.

+0

No estoy seguro de cómo voy a hacer eso y no parece una manera muy amigable para desarrolladores de hacer esto. Tener una sal única para cada usuario definitivamente no es un objetivo inusual. ¿Tienes algún código de ejemplo? De cualquier manera, le agradezco su tiempo – Nick

1

Para cualquiera que desee obtener más información sobre por qué la salazón de cada contraseña es la forma correcta de contraseñas hash (con ejemplos de código), visite aquí: http://crackstation.net/hashing-security.htm.

Quizás una ligera mejora en el código publicado aquí es seguir el consejo del artículo que acabo de vincular y generar una "nueva sal aleatoria" ... "cada vez que un usuario crea una cuenta o cambia su contraseña "

La implementación publicada aquí utiliza una combinación de la sal estática codificada de Auth original más la ID de usuario como sal, lo que significa que se reutiliza la misma sal para cada usuario siempre que cambie su contraseña. Por lo tanto, si desea seguir las recomendaciones de esta guía hash, debe generar una nueva sal aleatoria cada vez que el usuario cree/cambie su contraseña, y debe almacenar esa sal única en la tabla de usuarios junto con la contraseña hash.

Usted puede usar su generador de sal al azar:

define("PBKDF2_SALT_BYTES", 24); 
$salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM)); 

y por convención, se almacenan en la tabla de usuarios en un nuevo campo denominado 'sal'. Como el código ya le proporciona la identificación del usuario, siempre puede almacenar/buscar la sal según sea necesario.

También se menciona en el artículo una sección sobre "Funciones de Hash Lenta" utilizando una técnica conocida como "estiramiento de teclas" y cómo implementarlo usando un algoritmo estándar como PBKDF2 o bcrypt. Se proporcionan ejemplos de código PHP que se pueden copiar y pegar en su implementación personalizada de autenticación para mayor seguridad.

CakePHP desarrollador Marcos Historia ha publicado una entrada de blog sobre cómo implement bcrypt in CakePHP's Auth

En la sección de comentarios, Mark Historia comentado que CakePHP 2.3 tendrá algunas nuevas características incorporadas para generar hashes Bcrypt.

0

Atleast in cake 2.3 ya se usa una sal única, aunque la sal en el valor de configuración sea siempre la misma. No estoy seguro si esto también es cierto para versiones anteriores.

También podría cambiar la sal en su función beforeSave() en el modelo de Usuario utilizando Configurar :: escribir ("Security.salt", $ superAwesomeUserSpecificSalt);

Cuestiones relacionadas