Ajuda - Segurança de dados em J2ME <-> WebService

5 respostas
G

Eu tenho uma aplicação cliente em J2ME que acessa dados em um WebService JAX-WS com GlassFish v2. A aplicação J2ME tanto recebe quanto envia dados para o WebService. O WebService foi implementado através do NetBeans.

O que eu precisaria agora é uma forma de segurança nesse tráfego de dados do J2ME para o WebService e do WebService para o J2ME, só que como não tenho grandes conhecimentos dessa área, eu preciso de sugestões.

Já ouvi falar de Criptografia DES, BouncyCastle, mas não sei se realmente é esse o objetivo deles.

Se sim, exemplos de Criptografia DES eu já consegui, só não consegui encontrar exemplos de BouncyCastle.

Obrigado!

5 Respostas

Fernando_Generoso_da

Da uma olhada na parte de Security:

http://cds-esd.sun.com/ESD3/JSCDL/midp/2.0-fr/midp-2_0-fr-spec.pdf?AuthParam=1250786792_677089fb76a7bc76f3c675fe1a54f86d&TicketId=nod1A1gUTnd%2FkeQtkUCcV52ecA%3D%3D&GroupName=CDS&FilePath=/ESD3/JSCDL/midp/2.0-fr/midp-2_0-fr-spec.pdf&File=midp-2_0-fr-spec.pdf

Fernando

G

Opa!

Acho q esse link está off =/

Fernando_Generoso_da

vai em:

www.jcp.org

e procura pela jsr 118, baixa a especificação e dá uma olhada na parte de Security.

Fernando

G

Obrigado pela dica!

Uma coisa que estava tentando e deu alguns problemas foi o seguinte:

  1. Parte do WebService:

O WebService foi criado da seguinte forma através do NetBeans:

  • Novo Projeto - JavaWeb - AplicaçãoWeb
  • Botao direito no projeto - novo - Serviço web
  1. Parte do Cliente J2ME
  • Novo Projeto - JavaME - Aplicativo Móvel
  • Botao direito no projeto - novo - Cliente de serviço Web JavaME
  • Indico o caminho do WSDL, e então são gerados os STUBS para ter acesso aos métodos do webservice;

Até aí tudo bem, funcinou perfeitamente, mas, se no WebService, eu faço o seguinte:

  • Botao direito no serviço (do projeto do WebService) - Editar Atributos do Serviço Web
  • Marcar “Serviço Seguro” e “Usar padrões de desenvolvimento”
  • Limpar, Construir, implantar;

Ou seja, se eu ponho como serviço seguro, eu não consigo acessar através do J2ME esse webservice da mesma maneira que estava tentando antes.
Já me disseram para editar a “Qualidade de Serviço” do cliente J2Me, mas nesse tipo de projeto eu não consegui fazer isso, da erro de “marshall”

O que pode ser? Eu simplesmente tento acessar os métodos através do Stub, o que sem serviço seguro funciona…

Obrigado!

Hugo009

Olá Pessoal sou novo no guj
e aproveitando o tópico do guitarro17 eu tenho um projeto parecido com dele e gostaria que alguem me ajudasse tirando algumas dúvidas.

explicando meu projeto:

nesse meu projeto eu tenho duas parte:
Clinte - J2Me.
Servidor - J2SE.

na parte cliente eu tenho que montar uma midlet com um campo de entrada de dados e um menu com opção de criptografar os dados digitados.
e então ao criptografar ele me gera um list com os dados criptografados.
Detalhe: estou usando criptografia AES para gerar um par de chaves e preciso de uma chave pública para que ao criptografar os dados, ele envia até um servidor J2SE via bluetooth e descriptografa a mensagem com a chave privada RSA. a minha dúvida é simples, nessa primeira parte cliente eu só preciso criptografar e enviar a mensagem.

montei duas classes para isso:

Classe Principal (Midlet)

package Principal;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import AES.Encryption;
import java.security.NoSuchAlgorithmException;

import java.security.spec.EncodedKeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class Principal extends MIDlet implements CommandListener {

 private Display display;
    private Form frmPrincipal; // criação
    private TextField tf_entrada, tf_senha;
    private Command  cm_criptografa, cm_descriptografa, cm_sair, cm_enviar, cm_voltar;
    private List lista;
   

    protected void startApp() throws MIDletStateChangeException {
        display = Display.getDisplay(this);
        cm_criptografa = new Command("Criptografa", Command.ITEM, 1);
        cm_descriptografa = new Command("Descriptografa", Command.ITEM, 2);
        cm_sair = new Command("Sair", Command.EXIT, 1);
        cm_enviar = new Command("Enviar Dados", Command.ITEM, 3);
        cm_voltar = new Command("Voltar", Command.BACK, 1);
       

        lista = new List("Texto Descriptografado", List.TEXT_WRAP_DEFAULT);
        lista.addCommand(cm_voltar);
        lista.addCommand(cm_enviar);
        lista.setCommandListener(this);

        frmPrincipal = new Form("Criptografia RSA");
        frmPrincipal.addCommand(cm_criptografa);
        frmPrincipal.addCommand(cm_descriptografa);
        frmPrincipal.addCommand(cm_sair);
        frmPrincipal.setCommandListener(this);

        tf_entrada = new TextField("Entrada:", null, 150, TextField.ANY);
        tf_senha = new TextField("Senha:", null, 150, TextField.ANY);

        frmPrincipal.append(tf_senha);
        frmPrincipal.append(tf_entrada);

        display.setCurrent(frmPrincipal);
    }

 public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }


    public void commandAction(Command c, Displayable d)
    {
      if ( c == cm_sair)
      {
          destroyApp(true);
          notifyDestroyed();
      }

      if (c == cm_criptografa)
      {
            try {
                Conversor();
            } catch (NoSuchAlgorithmException ex) {
                ex.printStackTrace();
            } catch (InvalidKeyException ex) {
                ex.printStackTrace();
            } catch (IllegalBlockSizeException ex) {
                ex.printStackTrace();
            } catch (BadPaddingException ex) {
                ex.printStackTrace();
            } catch (NoSuchPaddingException ex) {
                ex.printStackTrace();
            }
       display.setCurrent(lista);
      
        
              
      }
        
    }

    public void Conversor() throws NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchPaddingException{
    // CONVERTER O TEXTO EM BYTES
        byte texto[] = tf_entrada.getString().getBytes();
   // CRIAR UM OBJETO AES PASSANDO A SEQUENCIA DE BYTES DO TEXTO DIGITADO
        Encryption encryption = new Encryption();

   // PEGANDO O RESULTADO AES GERADO

        byte[]enc = encryption.encode(texto.toString().getBytes(),null);

        // CONVERTENDO O CONJUNTO DE BYTES E APLICANDO NO OBJETO LISTA
      lista.append(encryption.fromHex(enc),null);

    }


     
}

e a classe Encryption

package AES;

   import java.math.BigInteger;
   import java.security.InvalidKeyException;
   import java.security.MessageDigest;
   import java.security.NoSuchAlgorithmException;

   import javax.crypto.BadPaddingException;
   import javax.crypto.Cipher;
   import javax.crypto.IllegalBlockSizeException;
   import javax.crypto.KeyGenerator;
   import javax.crypto.NoSuchPaddingException;
   import javax.crypto.SecretKey;
   import javax.crypto.spec.SecretKeySpec;



   public class Encryption {
    private byte[] key;

       public Encryption (){
       }


 /** Gera uma chave criptografica de 256 bits aleatória
* @return byte[] key
*/
       
    public byte[] key() throws NoSuchAlgorithmException {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(256);
        SecretKey key = keyGen.generateKey();
        return key.getEncoded();
    }

    /**
* Encripta uma mensagem usando AES para uma dada chave
* @param byte[] input deve estar em um tamanho multiplo de 16 (nullPadString)
* @param byte[] key
* @return
*/
    public byte[] encode(byte[] input, byte[] key) throws NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchPaddingException {
        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(input);
        return encrypted;
    }

    /**
* Retorna o valor original de uma mensagem criptgrafada em AES
* @param byte[] input
* @param byte[] key
* @return
*/
    public byte[] decode(byte[] input, byte[] key) throws NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchPaddingException {
        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] decrypted = cipher.doFinal(input);
        return decrypted;
    }

    /**
* Converte uma mensagem criptografada para uma string de sua representação hexadecimal.
* @param byte[] hex
* @return String str
*/
    public String fromHex(byte[] hex) {
        StringBuffer sb = new StringBuffer();
        for (int i=0; i < hex.length; i++) {
            sb.append( Integer.toString( ( hex[i] & 0xff ) + 0x100, 16).substring( 1 ) );
        }
        return sb.toString();
    }

   



    /**
* Converte uma representação hexadecimal para seus bytes hexadecimal (valor encriptado)
* @param String s
* @return byte[] data
*/
    public byte[] toHex(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                                 + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }

    /**
* Corrige o tamanho de uma String para multiplo de 16
* @param String original
* @return String final
*/
    public String nullPadString(String original) {
         StringBuffer output = new StringBuffer(original);
         int remain = output.length() % 16;
         if (remain != 0) {
             remain = 16 - remain;
             for (int i = 0; i < remain; i++)
                 output.append((char) 0);
         }
         return output.toString();

     }



     
  }

ao tentar rodar o projeto ele me gerar alguns erros:

Encryption.java:43: cannot find symbol
symbol  : constructor SecretKeySpec(byte[],java.lang.String)
location: class javax.crypto.spec.SecretKeySpec
        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Encryption.java:46: doFinal(byte[],int,int,byte[],int) in javax.crypto.Cipher cannot be applied to (byte[])
        byte[] encrypted = cipher.doFinal(input);

estou tentando gerar um par de chaves para criptografar.
alguém sabe o motivo do erro?

Criado 20 de agosto de 2009
Ultima resposta 29 de dez. de 2009
Respostas 5
Participantes 3