2011-11-29 13 views
10

tengo un servicio web y uno de los parámetros que nuestros clientes necesitan usar es una clave personalizada. Esta clave es un hash de SHA1Pregunta de búsqueda hash inversa

eg: 
bce700635afccfd8690836f37e4b4e9cf46d9c08 

entonces cuando el cliente llame a nuestro servicio web que tengo que comprobar algunas cosas:

  • es un cliente activo
  • es el cliente puede enviar a través de servicio web y servicio

ahora mi problema es el siguiente:

tengo una consulta:

$sql = "SELECT permission, is_active FROM clients WHERE sha1(concat(id,key)) = '" . mysql_real_escape_string($key) . "'"; 

¿Estoy haciendo lo correcto? o hay una mejor manera? gracias

+0

¿Está básicamente utilizando la clave como un identificador de sesión? Si es así, podría considerar usar sesiones de PHP. Muy fácil y seguro. http://php.net/manual/en/features.sessions.php –

+0

@JonathanM no, la clave es un sha1 de la identificación del cliente + clave aleatoria (almacenamos localmente en la tabla) y se lo damos al cliente. así que cuando llamamos a nuestro sitio, necesita usarlo, por ejemplo: http://ws.domain.com/bce700635afccfd8690836f37e4b4e9cf46d9c08/ Y el nombre de usuario y la contraseña de POST y otras variables; –

+0

@ErinTucker: si hay una clave aleatoria incluida en el hash, ¿cómo es que su consulta solo tiene 'sha1 (id)'? – ruakh

Respuesta

10

Este método es caro, ya que, cada vez que se ejecuta esta consulta, MySQL tendrá que examinar cada registro individual en clients y calcular el hash SHA-1 de su id y key. (Estoy asumiendo aquí que clients tiene más de un par de filas, o al menos, que desea utilizar un enfoque que apoya el caso en que clients tiene más de un par de filas.)

Por qué no hacer agrega un nuevo campo llamado (decir) id_key_sha1? Puede usar un trigger para mantener el campo poblado y agregarle un index. Este enfoque debería realizar mucho mejor.

Editado para agregar: Usted menciona que el cliente, además de pasar este hash SHA-1, también tiene que enviar un nombre de usuario y contraseña? No sé cómo se ve la estructura de su mesa, pero supongo que tendría más sentido encontrar primero el registro del cliente basado en el nombre de usuario y luego comparar el hash SHA-1 para ese registro específico, en lugar de intentarlo para encontrar el registro por el hash SHA-1.

+0

lo siento, olvidé algo ... actualicé mi pregunta –

+0

@ErinTucker: actualicé mi respuesta en consecuencia. – ruakh

+0

gracias por su respuesta, me gusta esa idea –

0

No debe aplicar la función en su columna LHS donde filtrar en mysql,
esto no hace posible que mysql haga uso del índice para comparar.

Un ejemplo permitirá hacer uso en el índice: -

where key = SHA1(CONCAT(id, :key)) 

// where the :key = user submitted api key 
// and in this case mysql able to fetch the matched rows via index 
Cuestiones relacionadas