Funzione JDBCRealm digest per MySQL PASSWORD ()
Domanda
Per un'applicazione interna Tomcat / Java / Struts, stiamo conversione del codice di autenticazione personalizzato-scritta di utilizzare JDBCRealm. Il database è MySQL 5.0, e le password vengono memorizzate come stringhe PASSWORD()
crittografato. Nella nostra versione di MySQL, il PASSWORD()
funzione è un non-standard (proprietario?) 41 byte hash. (Ora so che non dovremmo utilizzarlo per le nostre password, ma dovrebbe invece utilizzerò SHA1()
o MD5()
. Ma qui siamo.)
C'è un modo per utilizzare JDBMRealm senza forzare tutti i nostri utenti di reinserire le proprie password in modo che possiamo ricodificarli? C'è una JDBCRealm digest che ci permetterà di autenticare contro una colonna della password PASSWORD()
codificato?
Soluzione
Le nuove versioni di MySQL fornire una funzione chiamata OLD_PASSWORD()
che digerisce la password in un modo retro-compatibile con 4.0 e precedente.
Cosa si può fare, quindi, è quello di configure JDBCRealm in modo tale che:
- Non fa uso di alcun tipo di digest di per sé. Questo ovviamente non è l'ideale anche in ambiente sicuro, ed è a titolo definitivo pericoloso se il server di database vive attraverso la connessione non attendibile. A tale scopo, non specificare l'attributo
digest
. - Utilizza la funzione
OLD_PASSWORD()
sopra per crittografare la password prima confrontandolo con quello dal database. Si dovrà estendere JDBCRealm, questa funzionalità non è prevista fuori dalla scatola. Per Tomcat 6.0 dovrete sovrascrivere il metodoauthenticate(Connection c, String username, String credentials)
.
È inoltre possibile utilizzare il metodo di cui sopra, come parte della strategia di migrazione: avere il metodo di supporto override sia il OLD_PASSWORD()
e digerire e la forza gli utenti che hanno autenticate mediante OLD_PASSWORD()
di cambiare la loro password. Con il tempo si spera quindi in grado di passare alla approccio standard-based digest.