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?

È stato utile?

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:

  1. 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.
  2. 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 metodo authenticate(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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top