Usando jasypt para validar senhar - EncryptionOperationNotPossibleException - Resolvido!

1 resposta
Tiago_Farias

Olá galera,

estou modificando o sistema de senhas de usuários aki da empresa. Como utilizamos o Acegi 1.x, precisamos integrar o jasypt com o Acegi. Daí, fiz os seguintes beans no meu securityContext.xml:

<bean id="jasyptPasswordEncryptor" class="org.jasypt.util.password.StrongPasswordEncryptor" />

<bean id="passwordEncoder" class="org.jasypt.spring.security.PasswordEncoder">
	    <property name="passwordEncryptor">
	      <ref bean="jasyptPasswordEncryptor" />
	    </property>
  	</bean>

<bean id="strongEncryptor"
    class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
    <property name="algorithm">
        <value>PBEWithMD5AndTripleDES</value>
    </property>
    <property name="password">
        <value>jasypt</value>
    </property>
  </bean>
  
  <bean id="hibernateStringEncryptor"
    class="org.jasypt.hibernate.encryptor.HibernatePBEStringEncryptor">
    <property name="registeredName">
        <value>strongHibernateStringEncryptor</value>
    </property>
    <property name="encryptor">
        <ref bean="strongEncryptor" />
    </property>
  </bean>

Se eu estivesse começando minha aplicação agora, isso funcionaria. O problema é que eu já possuo alguns usuários com senha já cadastrada no banco. Quando eu tento decriptar a senha do meu usuário existente (senha= 1 por exemplo), obtenho EncryptionOperationNotPossibleException porque é uma senha incompatível com o algoritmo de decriptação. A idéia é utilizar as classes correspondentes aos beans q criei no spring para encriptar e setar a senha existente. Fiz assim:

StandardPBEStringEncryptor strongEncryptor = new StandardPBEStringEncryptor();
		HibernatePBEStringEncryptor encryptor = new HibernatePBEStringEncryptor();
		strongEncryptor.setPassword("jasypt");
		//strongEncryptor.setAlgorithm("PBEWithMD5AndTripleDES");
		encryptor.setEncryptor(strongEncryptor);
		String str = encryptor.encrypt("1");
		System.out.println(str);
		str = encryptor.decrypt(str);
		System.out.println(str);

Desse jeito, ele me gera a senha "1" encriptada e depois mostra "1" novamente no output. OK. Funciona. Mas se eu colocar essa senha no banco manualmente, e tentar logar com a senha 1, não funciona! A MESMA exceção aparece: "EncryptionOperationNotPossibleException:Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine". Não tô muito crente q o problema seja este q ele está mencionando - JCE.

Quem tiver qualquer idéia, qualquer idéia mesmo, pode falar q já ajudar a ir pensando...

Vlw povo!

1 Resposta

Tiago_Farias

Pessoal, consegui resolver esse problema. Na verdade, era oq eu achava q não era. Existem leis regulamentando o uso de criptografia “unlimited” e tal, por isso o JCE não vem junto com o jasypt padrão. A gente tem q instalar separadamente no java_home.
Mais informações sobre a instalação: http://www.jasypt.org/dependencies.html
Sobre o problema: http://forum.springsource.org/showthread.php?t=63814

Tô com problema na validação agora, mas erro não tá dando mais! :wink:

Vlw!

Criado 19 de maio de 2009
Ultima resposta 19 de mai. de 2009
Respostas 1
Participantes 1