Java Cryptography Architecture e Java Cryptography Extension

Introdução
   Este Artigo trata exclusivamente de fornecer ao leitor uma visão geral dessas duas APIs, apresentando de forma rápida a sua arquitetura e funcionamento, também serão apresentados pequenos trechos de código demonstrando os principais serviços criptográficos existentes.

JCA / JCE
  
    As funcionalidades básicas relacionadas a criptografia em Java estão disponiveis na Java Cryptography Extension (JCE) e na sua irmã Java Cryptography Extension (JCE),  a diferença entre elas está em questões históricas relacionadas exportação de algoritimos criptográficos, principalmente patentes desses algorítimos, contudo, pode-se dizer que com a  JCA você obtem serviços como: MessageDigest,  Security, KeyFactory, KeyPair, SecureRandom, and Provider classes. Já a JCE  estende a JCA  adicionando serviços, como: Cipher, CipherIn/OutputStream, KeyGenerator, SecretKeyFactory, SealedObject, KeyAgreement and Mac classes.

Arquitetura baseada em provedor de serviços criptográficos
   As classes e interfaces que compoem a JCA/JCE foram criadas com intuito de serem extremamente extensiveis, em outras palavras, forma criadas para permitir que sejam adicionadas implementações de diferentes fornecedores, daí o porque de se dizer que a arquitetura JCA/JCE é “provider-based”.
   Olhando a figura1, logo abaixo, dá pra perceber que o código da aplicação fica escondido da implementação especifica do provedor, acessando apenas classes e interfaces da JCA/JCE.

Figura 1. Visão geral da arquitetura baseada em provedor.

Principais funcionalidades da JCA/JCE

  • Cipher – cifra.
  • CipherInputStream/CipherOutputStream/SealedObject – Abstrações de alto nível sobre objectos de cifra.
  • SecureRandom – gerador de números aleatórios seguro.
  • KeyGenerator/KeyPairGenerator – geradores de chaves.
  • KeyFactory – conversão de formatos para chaves.
  • KeyAgreement – acordo de chaves.
  • AlgorithmParameterGenerator – gerador de parâmetros (a serem passados a outros objectos, como cifras…).
  • MessageDigest/MAC — funções de hash criptográficas, MACs.
  • Signature — assinaturas digitais.
  • X509Certificate — certificados X509.


Providers Existentes


      Segue uma lista de alguns providers disponíveis :

Instalando um provider

      A instalação de um provider pode ser feita de duas formas, estaticamente ou dinamicamente, para esse exemplo estou utilizando o Bouncy Castle provider, vejamos então essas duas formas:


Instalação dinamica

  • Realize o import
     import org.bouncycastle.jce.provider.BouncyCastleProvider; 
  • Adicione a seguinte linha de código no seu programa, antes de usar qualquer função criptográfica.
     Security.addProvider(new BouncyCastleProvider()); 
 

Instalação estática

  • Para instalar estaticamente você precisará adicionar uma entrada ao arquivo  java.security   qual está localizado em $JAVA_HOME/jre/lib/security/java.security.
  • Procure or uma lista de linhas parecidas com security.provider.X, onde X é algum número ao final da ultima linha adicione:

       security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider, onde N é o ultimo número da lista.
 

Exemplo de código

      No exemplo abaixo, estou o utilizando o algorítimo DES ( Chave Simétrica ) para encriptar e decriptar a frase: “Tomar café faz muito bem a saúde”.


package com.blogsport.thecodingoflife.bc.padding;

import java.security.*;
import javax.crypto.*;

public class PrivateExample {
  
   public static void main (String[] args) throws Exception {
       //
       // Check args and get plaintext
       byte[] plainText = “Tomar café faz muito bem a saúde“.getBytes(“UTF8”);
       //
       // Get a DES private key
       System.out.println( “\nStart generating DES key” );
       KeyGenerator keyGen = KeyGenerator.getInstance(“DES”);
      
       // If you do not initialize the KeyGenerator, each provider supply a default initialization.
       keyGen.init(56);
       Key key = keyGen.generateKey();
       System.out.println( “Finish generating DES key” );
       //
       // Creates the DES Cipher object (specifying the algorithm, mode, and padding).
       Cipher cipher = Cipher.getInstance(“DES/ECB/PKCS5Padding”);
       // Print the provider information      
       System.out.println( “\n” + cipher.getProvider().getInfo() );
       //
       System.out.println( “\nStart encryption” );
       // Initializes the Cipher object.
       cipher.init(Cipher.ENCRYPT_MODE, key);
       // Encrypt the plaintext using the public key
       byte[] cipherText = cipher.doFinal(plainText);
       System.out.println( “Finish encryption: ” );
       System.out.println( new String(cipherText, “UTF8”) );
       //
       System.out.println( “\nStart decryption” );
       // Initializes the Cipher object.
       cipher.init(Cipher.DECRYPT_MODE, key);
       // Decrypt the ciphertext using the same key
       byte[] newPlainText = cipher.doFinal(cipherText);
       System.out.println( “Finish decryption: ” );
       System.out.println( new String(newPlainText, “UTF8”) );
   }
}

Saída



Start generating DES key
Finish generating DES key

SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)

Start encryption
Finish encryption:
??_6f??<@
?shO? n?^5?”??? ??#* ?Ht?? )

Start decryption
Finish decryption:
Tomar café faz muito bem a saúde

Conclusao

    Em vista dos argumentos apresentados, pode-se dizer que a plataforma Java fornece os subsidios necessários para se trabalhar com criptografia. Através das APIs JCA e JCE e a escolha de um bom provedor de serviços criptográficos o desenvolvedor consegue alcançar uma gama enorme de opções na hora de implementar uma solução que envolva criptografia.

Referencias

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s