Tenemos que rodar (retirar) las claves de acceso a la base de datos a menudo, pero es importante saber qué clave está utilizando cada sistema para evitar eliminar una clave en uso, lo que crea indisponibilidad. Queremos que cada sistema informe qué clave está utilizando sin exponer la clave en sí, por supuesto.
Estamos usando claves generadas aleatoriamente con 512 bits de tamaño, y planeamos hacer un hash de esas claves y hacer que los hashes estén disponibles en un medio menos seguro.
Aquí viene el dilema: ¿Debemos usar un resumen grande o pequeño?
El tamaño mínimo de resumen sería de 32 bits. Solo necesitamos comparar un puñado de claves cada vez, por lo que está bien tener 1- (1 / (2 ^ 32)) de confianza (lo que da más del 99.99999%). Además, una eventual colisión retrasa un poco el desmantelamiento de las claves en colisión, por lo que es inofensivo.
Por supuesto, si el atacante ve el hash, puede filtrar todas las claves que no producen el mismo hash, reduciendo el espacio de búsqueda a 2 ^ (512-32), o 2 ^ 480, lo que consideramos suficientemente seguro.
Sin embargo, algunos colegas sugirieron que un pequeño resumen es susceptible a las tablas del arco iris y otros ataques, por lo que deberíamos usar un resumen completo de SHA-256 o SHA-512. Eso me suena extraño, porque si nuestra clave es de 512 bits, un hash SHA-512 no generaría ninguna colisión y el atacante solo tendría que encontrar la clave que produce el mismo hash. Todo este procesamiento se puede hacer fuera de línea, sin acceso a la base de datos para probar las claves. Así que parece más peligroso que usar un resumen de 32 bits.
¿Cómo podemos resolver esto?