Friday, December 07, 2012

Conexão para HSQLDB embutido aplicações desktop (jar)

O HSQLDB é uma ótima opção para projetos demonstração e POCs (prova de conceitos). Na YaW nós desenvolvimento algumas aplicações seguindo o modelo client server (Desktop), utilizando o HSQLDB como banco de dados. Em algumas dessas apps o HSQLDB é distribuído junto com as classes Java,  embutido no arquivo JAR.

O detalhe dessa estratégia é utilizar a protocolo res para criar a conexão com HSQLDB. Com ele os arquivos do banco de dados são carregados como recursos da aplicação da mesma forma que classes Java.

public static Connection openConnection() {
  Connection conn = null;
  try {
    Class.forName("org.hsqldb.jdbcDriver");

    String bd = "meuDB";
    //url da conexao
    String url = "jdbc:hsqldb:file:/"+db;
    String user = "sa";
    String password = "";

    conn = DriverManager.getConnection(url, user, password);
    return conn;
  } catch (ClassNotFoundException e) {
    String errorMsg = "Driver nao encontrado";
    throw new RuntimeException(errorMsg, e);
  } catch (SQLException e) {
    String errorMsg = "Erro ao obter a conexao";
    throw new RuntimeException(errorMsg, e);
  }
}


Os arquivos para o meuDB, devem ser armazenados no diretório META-INF do jar (pelo menos meuDB.log, meuDB.properties, meuDB.script).

Uma caracteristica muito importante desse protocolo, é que a conexão será criada como somente leitura (read-only). As manipulações (insert/update/delete) ocorrem somente em memória.

Outra referencia é o tópico sobre protocolos de conexão na documentação do HSQLDB.

@edermag

Tuesday, December 04, 2012

Assinar um arquivo jar com jarsigner

Um assinatura digital é uma sequência de bits calculados a partir de algumas informações e de uma chave privada (certificado). Um arquivo "assinado" garante autenticidade, uma garantia a quem for utilizar. Caso o arquivo seja modificado a assinatura passa a não ter valor.

Em alguns casos é necessário assinar arquivos jar (Java ARchive), por exemplo ao distribuir uma aplicação Swing via Java Web Start que utiliza I/O (saiba mais sobre as restrições impostas pela JVM). No kit de desenvolvimento Java (JDK), o jarsigner é o programa responsável por gerar e verificar assinaturas em um arquivo jar.

O jarsigner utiliza informações da chave e certificado digital para gerar a assinatura. Um exemplo:

$ jarsigner -keystore /home/yaw -storepass mykeypass 
  -keypass mykeypass aplicacaoSegura.jar mykey

Detalhes do comando:
  • -keystore: o local (path) da chave;
  • -storepass e -keypass: a senha pra acessar e a senha da chave;
  • aplicaoSegura.jar: o nome do arquivo jar;
  • mykey: o alias da chave;
O jarsigner também é útil para verificar se um arquivo já possui alguma assinatura. Veja:

$ jarsigner -verify aplicacaoSegura.jar

Também é possível assinar um jar pelo ANT, veja um exemplo de target para isso:

<target name="pack-and-sign">
  <echo message="Assinando o jar aplicaoSegura.jar"></echo>

  <signjar alias="mykey" jar="aplicaoSegura.jar" 
    keypass="mykeypass" keystore="/home/yaw" storepass="mykeypass">
  </signjar>
</target>


Na página do jarsigner é possível obter maiores detalhes sobre o programa. Em outro post descrevo como gerar chaves com o keytool, outra ferramenta do JDK.

@edermag

Monday, December 03, 2012

Gerando chaves pública e privada com keytool

O keytool é um programa fornecido junto com kit de desenvolvimento (SDK) Java. É uma ferramenta para segurança, com ela é possível gerar certificados self-signed (assinado e certificado pela mesma entidade).

O comando a seguir gera o par de chaves pública e privada:
$ keytool -genkeypair 
  -dname 'cn=yaw, ou=tecnologia, o=YaW Tecnologia, l=SBC, s=SP, c=BR'
  -alias mykey -keystore /home/yaw -storepass mykeypass -validity 180

Na opção -dname indicamos as propriedades referentes a organização:
  • cn: nome comum;
  • ou: unidade/setor da organização
  • o: nome da organização;
  • l: localização;
  • s: estado;
  • c: país;

A opção -alias determina o identificador, enquanto -keystore o local aonde a chave será amarzenada. Já -storepass determina uma senha para proteção da chave. Por fim a opção -validity indica o período de validade do certificado, no exemplo 180 dias.

Há algum tempo fiz um post usando o keytool para importar certificado na JVM. Na página do keytool é possível obter mais informações.

@edermag