So che al giorno d'oggi ci sono pochi motivi per usare ancora ENCRYPT()
, ciò che con bcrypt
è quasi onnipresente e MySQL fornisce hash migliori come SHA1
.
Ma mentre si dilettava con ENCRYPT()
su MySQL 5.6.12 (OpenSuSE 13.1, x64), ho notato un'anomalia con il suo output che inizialmente attribuivo al pool di entropia esaurito (potrebbe potrebbe sono stati), e quindi probabilmente al sale trapelato tra le connessioni.
Dopo la verifica, non è stato il caso.
Piuttosto, il sale è derivato dal timestamp UNIX . Quindi due chiamate a ENCRYPT()
nello stesso secondo produrranno sali identici e il sale si ripeterà esattamente ogni ora, 12 minuti, 16 secondi.
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
Naturalmente posso fornire il mio sale e ottenerlo da una fonte casuale - TO_BASE64(CONCAT(CHAR(RAND()*256),CHAR(RAND()*256)))
o qualcosa, che dovrebbe avere lo stesso intervallo di caratteri del sale originale nei suoi primi due byte, quindi ENCRYPT()
sferzare un sale delle sue stesse esigenze è solo un ultimo sforzo.
E non ci si aspetta che il sale sia segreto , quindi essere conosciuto in anticipo non è forse un problema troppo grande.
Anche così, usare time()
per la salatura non mi sembra una buona opzione ( questa risposta conferma anche questo).
Mi manca qualcosa di ovvio? Forse questo comportamento è configurabile in qualche modo (a parte la ricompilazione)? È una caratteristica nota (non sono stato in grado di trovare alcun riferimento su Google o MySQL KB)?