Sé que hay pocas razones para seguir usando ENCRYPT()
hoy en día, ya que bcrypt
es casi omnipresente y MySQL proporciona mejores hashes como SHA1
.
Pero mientras incursionaba con ENCRYPT()
en MySQL 5.6.12 (OpenSuSE 13.1, x64), noté una anomalía en su salida que al principio atribuí a que se agotaba el grupo de entropía ( podría han sido), y luego posiblemente a la sal que se filtró entre las conexiones.
Tras la verificación, resultó no ser el caso.
Más bien, la sal se deriva de la marca de tiempo de UNIX . Por lo tanto, dos llamadas a ENCRYPT()
en el mismo segundo producirán sales idénticas, y la sal se repite exactamente cada hora, 12 minutos, 16 segundos.
while(true); do \
echo "SELECT NOW(),ENCRYPT('test');" \
| mysql test | grep -v ENCRYPT; \
done | uniq -c
54 2014-05-14 00:13:16 w5kVzeZkJCcqM
148 2014-05-14 00:13:17 x5/h3KfsBkEYk
150 2014-05-14 00:13:18 y5thvRDxwJgM6
145 2014-05-14 00:13:19 z5RL9IZ0..XH6
141 2014-05-14 00:13:20 .6asQOJRqB1i2
130 2014-05-14 00:13:21 /6J1nHNWbi6Ac
124 2014-05-14 00:13:22 06NT9j.EegRJs
Por supuesto que puedo suministrar mi propia sal y obtenerla de una fuente aleatoria - TO_BASE64(CONCAT(CHAR(RAND()*256),CHAR(RAND()*256)))
o algo así, que debería obtener el mismo rango de caracteres que la sal original en sus primeros dos bytes, por lo que ENCRYPT()
's batir una sal de sus propias necesidades sólo será un esfuerzo de última hora.
Y no se espera que la sal sea secreta , por lo que ser conocido de antemano quizás no sea un problema demasiado grande.
Aun así, usar time()
para la salazón no me parece una muy buena opción ( esta respuesta también confirma esto).
¿Me estoy perdiendo algo obvio? ¿Es tal vez este comportamiento configurable de alguna manera (aparte de la recompilación)? ¿Es una característica conocida (no pude encontrar ninguna referencia en Google o MySQL KB)?