função JDBCRealm digest para MySQL PASSE ()
Pergunta
Para uma aplicação interna Tomcat / Java / Struts, estamos convertendo código de autenticação de costume escrita para utilizar JDBCRealm. O banco de dados é MySQL 5.0, e as senhas são armazenadas como strings criptografadas-PASSWORD()
. Em nossa versão do MySQL, o PASSWORD()
função é um não-padrão (proprietário?) 41-byte de hash. (Eu sei agora que não deve usá-lo para nossas senhas, mas deveria, antes, usando SHA1()
ou MD5()
. Mas aqui estamos nós.)
Existe alguma maneira de usar JDBMRealm sem forçar todos os nossos usuários para re-inserir suas senhas para que possamos voltar a codificá-los? Existe uma JDBCRealm digerir que nos permitirá autenticar contra uma coluna de senha codificada em PASSWORD()
?
Solução
versões New MySQL fornecer uma função chamada OLD_PASSWORD()
essa senha digere de uma forma compatível com os 4.0 e anteriores.
O que você pode fazer, portanto, é configure JDBCRealm de tal forma a que:
- não usa qualquer tipo de digerir por si só. Isso obviamente não é ideal, mesmo em ambiente seguro e é completamente perigoso se o seu servidor de banco de dados vive do outro lado conexão não confiável. Para fazer isso, não especificando atributo
digest
. - Utiliza a função
OLD_PASSWORD()
acima para criptografar a senha antes comparando-a com a do banco de dados. Você vai ter que estender JDBCRealm, esta funcionalidade não é fornecido fora da caixa. Para Tomcat 6.0 você terá que substituir o métodoauthenticate(Connection c, String username, String credentials)
.
Você também pode usar a abordagem acima como parte da estratégia de migração: ter o substituído apoio método tanto a OLD_PASSWORD()
e digerir e força os usuários que já autenticados usando OLD_PASSWORD()
para alterar sua senha. Com o tempo você vai, em seguida, espero ser capaz de mudar para abordagem padrão digerir-based.