Quiero almacenar detalles de perfil encriptados dentro de una base de datos. Sin embargo, algunos detalles deben ser únicos, y dado que el algoritmo de encriptación aleatoriza la semilla para cada encriptación, es exhaustivo determinar si el valor ya está almacenado en la base de datos.¿Cómo comparar cadenas encriptadas con semillas aleatorias?
- Podría recorrer cada fila y descifrar la columna necesaria, pero eso llevaría demasiado tiempo si el número de filas es grande.
- Podría almacenar hashes de estos detalles (no cifrados)
pero eso mataría el punto de encriptación en primer lugar.
Entonces, ¿cómo puedo comparar una cadena encriptada (con semilla aleatoria) con otras guardadas en la base de datos?
Cualquier ayuda es muy apreciada. La encriptación se realiza con php (MCRYPT_RIJNDAEL_256
/NOFB
), la base de datos es MySQL.
Edición/solución: El almacenamiento del hash de datos además del valor encriptado parece ser mi mejor solución. Eso hace que la validación de columnas únicas sea lo suficientemente fácil para mí. Gracias a todos por dejar sus comentarios/respuestas.
Interesante pregunta, aunque no creo que haya una respuesta más allá de "almacenarlos sin cifrar en una columna separada" ... Pero veremos –
Usaría el hash con una sal dependiente del usuario, como su nombre de usuario De esta forma, si se conoce un campo de perfil para un usuario, no se puede deducir otro usuario que tenga el mismo valor no expresado en ese campo, ya que su hash será diferente. – halfer
@Pekka sí, veamos ... – Alasjo