Introdução ao Jasypt
*1. Visão geral *
Neste artigo, veremos a biblioteca _http://www.jasypt.org/index.html [Jasypt] _ (Java Simplified Encryption).
O Jasypt é uma biblioteca Java que permite que os desenvolvedores adicionem recursos básicos de criptografia a projetos com o mínimo de esforço e sem a necessidade de ter um conhecimento profundo sobre os detalhes da implementação dos protocolos de criptografia.
===* 2. Usando criptografia simples *
Considere que estamos construindo um aplicativo Web no qual o usuário envia dados privados de uma conta. Precisamos armazenar esses dados no banco de dados, mas seria inseguro armazenar texto sem formatação.
Uma maneira de lidar com isso é armazenar dados criptografados no banco de dados e, ao recuperar esses dados para um usuário específico, descriptografá-los.
Para executar criptografia e descriptografia usando um algoritmo muito simples, podemos usar uma classe _http://www.jasypt.org/api/jasypt/1.8/org/jasypt/util/text/BasicTextEncryptor.html [BasicTextEncryptor] _ do Jasypt biblioteca:
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
String privateData = "secret-data";
textEncryptor.setPasswordCharArray("some-random-data".toCharArray());
Em seguida, podemos usar um método _encrypt () _ para criptografar o texto sem formatação:
String myEncryptedText = textEncryptor.encrypt(privateData);
assertNotSame(privateData, myEncryptedText);
Se quisermos armazenar dados privados para determinado usuário no banco de dados, podemos armazenar um myEncryptedText sem violar nenhuma restrição de segurança. Caso desejemos descriptografar os dados novamente para um texto sem formatação, podemos usar o método _decrypt () _:
String plainText = textEncryptor.decrypt(myEncryptedText);
assertEquals(plainText, privateData);
Vemos que os dados descriptografados são iguais aos dados em texto sem formatação que foram criptografados anteriormente.
===* 3. Criptografia unidirecional *
O exemplo anterior não é uma maneira ideal de executar autenticação, é quando queremos armazenar uma senha de usuário. Idealmente, queremos criptografar a senha sem uma maneira de descriptografá-la. Quando o usuário tenta fazer login em nosso serviço, criptografamos sua senha e a comparamos com a senha criptografada armazenada no banco de dados. Dessa forma, não precisamos operar com senha de texto simples.
Podemos usar uma classe BasicPasswordEncryptor para executar a criptografia unidirecional:
String password = "secret-pass";
BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor();
String encryptedPassword = passwordEncryptor.encryptPassword(password);
Em seguida, podemos comparar uma senha já criptografada com a senha de um usuário que realiza o processo de login sem precisar descriptografar a senha que já está armazenada no banco de dados:
boolean result = passwordEncryptor.checkPassword("secret-pass", encryptedPassword);
assertTrue(result);
===* 4. Configurando o algoritmo para criptografia *
Podemos usar um algoritmo de criptografia mais forte, mas precisamos lembrar de instalar Política de jurisdição de força ilimitada da extensão de criptografia Java (JCE) Arquivos para a nossa JVM (as instruções de instalação estão incluídas no download).
No Jasypt, podemos usar criptografia forte usando uma classe StandardPBEStringEncryptor e personalizá-la usando um método _setAlgorithm () _:
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
String privateData = "secret-data";
encryptor.setPassword("some-random-passwprd");
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");
Vamos definir o algoritmo de criptografia como PBEWithMD5AndTripleDES.
Em seguida, o processo de criptografia e descriptografia se parece com o anterior, usando uma classe BasicTextEncryptor:
String encryptedText = encryptor.encrypt(privateData);
assertNotSame(privateData, encryptedText);
String plainText = encryptor.decrypt(encryptedText);
assertEquals(plainText, privateData);
===* 5. Usando descriptografia multiencadeada *
Quando estamos operando na máquina com vários núcleos, queremos lidar com o processamento de descriptografia em paralelo. Para obter um bom desempenho, podemos usar as APIs _http://www.jasypt.org/api/jasypt/1.9.0/org/jasypt/encryption/pbe/PooledPBEStringEncryptor.html [PooledPBEStringEncryptor] _ e _setPoolSize () _ para crie um pool de digestores. Cada um deles pode ser usado pelo thread diferente em paralelo:
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setPoolSize(4);
encryptor.setPassword("some-random-data");
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");
É uma boa prática definir o tamanho do pool como igual ao número de núcleos da máquina. O código para criptografia e descriptografia é o mesmo que os anteriores.
===* 6. Uso em outras estruturas *
Uma observação final rápida é que a biblioteca Jasypt pode ser integrada a muitas outras bibliotecas, incluindo, é claro, o Spring Framework.
Precisamos apenas criar uma configuração para adicionar suporte à criptografia em nosso aplicativo Spring. E se queremos armazenar dados confidenciais no banco de dados e estamos usando o Hibernate como a estrutura de acesso a dados, também podemos integrar o Jasypt a ele.
Instruções sobre essas integrações, bem como com algumas outras estruturas, podem ser encontradas na seção Guides na página inicial Jasypt.
===* 7. Conclusão*
Neste artigo, examinamos a biblioteca Jasypt que nos ajuda a criar aplicativos mais seguros usando algoritmos de criptografia já conhecidos e testados. Ele é coberto pela API simples e fácil de usar.
A implementação de todos esses exemplos e trechos de código pode ser encontrada no GitHub project - este é um projeto do Maven, portanto, deve ser fácil importar e executar como está.