martes, 30 de diciembre de 2014

Configurar Apache Ivy

Adaptar la configuración por defecto

Ivy está preconfigurado por defecto, de manera que facilita su utilización en un entorno sencillo. En este tutorial, cercano a una documentación de referencia, explicaremos la configuración por defecto y cómo poder ajustarla a nuestra necesidad. Para profundizar en dichos parámetros de configuración y lo que permiten hacer, es recomendable además leer los siguentes tutoriales: Multiple Resolvers y Dual Resolver o bien la documentación Ivy de referencia Settings Files.

Concepto

La configuración por defecto incluye 3 tipos de repositorio:
  • local: repositorio privado para el usuario.
  • shared: repositorio compartido por los miembros del equipo.
  • public: el repositorio en el que se encuentran la mayoria de los modulos, especialmente aquellos que dependen de terceros.
Tengamos en cuenta la nocion de local y shared no es importante en desarrollos de una sola persona, sin embargo es importante saber diferenciarlos. Ahora pasamos a explicar cada uno de estos repositorios con mayor detalle. Más adelante, explicaremos como configurarlos.

Local

Un repositorio local es especialmente útil cuando queremos aislar lo que realizamos del resto de cambios que suceden en el entorno. Esto implica que, cada vez que Ivy encuentra un módulo en el repositorio, éste es el que se usara aunque no esté disponible para el resto. Por ejemplo, si tenemos un módulo que tiene una dependencia con el módulo foo en la revisión de latest.integration, si dicha revisión de foo se encuentra en el repositorio local, esta es la que se utilizará para resolver la depencia, aún cuando exista una revisión más reciente en otro repositorio. Esto puede causar algún problema, pero supongamos que necesitamos implementar una nueva funcionalidad en el proyecto, y para realizarlo hemos de modificar dos modulos: añadir un método en foo y realizar una llamada desde el módulo bar. En este caso si publicamos foo en nuestro repositorio local, estaremos seguros de que dichas modificaciones seran tenidas en cuenta dentro del modulo bar, aún cuando algún otro miembro publique una nueva revision de fooen el repositorio shared (sin que dicha revision tuviese en cuenta nuestras modificaciones). Tenemos que tener cuidado de limpiar el repositorio local una vez una vez terminadas y publicadas en sharedlas modificaciones, lo que nos actualizará el repositorio local con todas las modificaciones publicadas por el equipo en shared. Tengamos en cuenta además que todos los modulos que se encuentran en local deben tener resueltas todas sus dependencias, p.ej. su descriptor de modulo y los artefactos publicados.

Shared

Como nos indica su nombre, el repositorio shared, esta concebido para compartirse entre los miembros del equipo de desarrollo. Es donde se publica todos los módulos privados del equipo y donde se encuentran modulos que no son accesibles en el repositorio public(supongamos modulos utilizados internamente, o utilidades, sun., ibm. jars, por ejemplo). Es posible que en shared encontremos modulos que sean inconsistentes para un repositorio public(descriptores de modulo incompletos, p-ej). Los modulos pueden repartirse entre el repositorio shared y el public: Por ejemplo, podemos tener un descriptor de modulo en el repositorio shared y sus artefactos en public

Public

El repositorio public, es el lugar donde se encuentra la mayoria de modulos, carecen sin embargo de la información necesaria (javadoc, etc...). Normalmente es un repositorio accesible a través de internet, aunque esto no sea un requisito.

Configuración de los repositorios

Ahora que hemos visto el funcionamiento de cada uno de los 3 repositorios, veamos como se configuran según necesitamos. Primero, existen varios repositorios usan la misma raíz en nuestro sistema de ficheros. Referenciado a través de ${ivy.default.ivy.user.dir}, esta es la ruta del directorio .ivy2 en nuestro user home. sobreescribir los settings por defecto que Ivy incluye en su jar. Si queremos modificarlas sin declarar nuestro propio fichero de configuración ivysettings.xml lo podemos hacer:
  • Establecer una property de Ant antes de cada llamada a Ivy en el fichero build.xml si utilizamos Ivy desde Ant
  • Establecer una variable de entorno en el sistema si utilizamos Ivy desde la linea de comandos
Ejemplo:

<target name="resolve">
<property name="ivy.default.ivy.user.dir" value="/path/to/ivy/user/dir"/>
<ivy:resolve />
</target>
A continuación, mostramos como sobre escribir los valores por defecto de los distintos repositorios y cuales son sus valores por defecto, para cada uno de ellos

Local

Por defecto, el repositorio local se encuentra en ${ivy.default.ivy.user.dir}/local. Esto es comunmente un buen lugar, pero es posible que deseemos modificarlos.
ivy.local.default.root
. Ejemplo:
ivy.local.default.root=/opt/ivy/repository/local
Si tenemos un directorio que deseamos usar como local, podemos configurar los parametros para ello a través de las siguientes variables:
ivy.local.default.ivy.pattern
proporciona un patron para identificar los ficheros ivy.
ivy.local.default.artifact.pattern
proporciona un patron para identificar artefactos.
Por ejemplo:

ivy.local.default.root=/opt/ivy/repository/local
ivy.local.default.ivy.pattern=[module]/[revision]/ivy.xml
ivy.local.default.artifact.pattern=[module]/[revision]/[artifact].[ext]

Shared

El repositorio shared, se encuentra en la ruta que indica ${ivy.default.ivy.user.dir}/shared. Esto es apropiado si no estamos trabajando dentro de un equipo, lo cual le quita su valor. Así que lo más común es reconfigurarlo para que sea accesible al resto del grupo.
Podemos utilizar la variable
ivy.shared.default.root
para indicar otra ruta. Además, es posible configurar como ha de ser la estructura de dicho repositorio a través de patrones, mediante las variables:
ivy.shared.default.ivy.pattern
patron para encontrar los ficheros ivy.xml
ivy.shared.default.artifact.pattern
patron para encontrar los artefactos
Por ejemplo:

ivy.shared.default.root=/opt/ivy/repository/shared
ivy.shared.default.ivy.pattern=[organisation]/[module]/[revision]/ivy.xml
ivy.shared.default.artifact.pattern=[organisation]/[module]/[revision]/[artifact].[ext]

Public

El repositorio public es el que apunta la variable maven public repository, cuando trabajamos con la configuración de compatibilidad Maven 2. Este repositorio tiene la ventaja de contener la mayoría de modulos y sus descriptores, documentación, etc... La calidad de estos metadados noes siempre la más correcta, pero sí un buen comienzo, para utilizar una herramienta como Ivy para la resolución de dependencias transitivas. Además de la facilidad de uso que ofrece, es recomendable leer Best practices para tener un buen conocimiento de ventajas e inconvenientes, a la hora de usar un repositorio public, antes de crear uno propio en un entorno de producción. En la versión 1.4 de Ivy se utilizaba ivyrep como resolver por defecto, si queremos reestablecer esta configuración, hemos de crear la property ivy.14.compatible=true en el fichero build de ant

Profundizar en Ivy

Además de las configuracion de repositorios en un sistema de ficheros local, podemos encontrarnos con un requisito, que establezca el acceso a shared en un servidor Web. O bien, modificar el uso de un repositorio public de maven 2. Todo esto puede hacerse mediante configuración. Expliquemos primero la estructura de ivysettings.xml que se encuentra dentro del jar de Ivy .
ivysettings.xml
<ivysettings>   
<settings defaultResolver="default"/>
<include url="${ivy.default.settings.dir}/ivysettings-public.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
</ivysettings>
No obtenemos mucha información, ya que la configuración se reparte entre los distintos ficheros referenciados por include. Esto nos permite modificar ciertas partes sin afectar al resto.
Por ejemplo, si deseamos declarar nuestro propio resolver, lo configurariamos de la siguiente manera:

<ivysettings>
<settings defaultResolver="default"/>
<include url="http://myserver/ivy/myivysettings-public.xml"
<include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
</ivysettings>

Solo hemos de modificar el fichero ivysettings-public.xml para añadir nuestro propio resolver. Tengamos en cuenta además que esto puede realizarse ya que conocemos donde apunta la variable ${ivy.default.settings.dir} (p-ej. la que tiene configurada por defecto en el jar). Para finalizar, hemos de modificar el fichero ivysettings que hemos referenciado, el cual se ecuentra en la dirección http://myserver/ivy/myivysettings-public.xml para declarar nuestro propio resolver publico.
Un ejemplo:

<ivysettings>
<resolvers>
<filesystem name="public">
<ivy pattern="/path/to/my/public/rep/[organisation]/[module]/ivy-[revision].xml" />
<artifact pattern="/path/to/my/public/rep/[organisation]/[module]/[artifact]-[revision].[ext]" />
</filesystem>
</resolvers>
</ivysettings>

El ultimo paso que debemos realizar para que el resto de configuracion sea tenida en cuenta es modificar los ficheros incluidos en ivysettings.xml:
ivysettings-public.xml

<ivysettings>
<resolvers>
<ibiblio name="public" m2compatible="true"/>
</resolvers>
</ivysettings>

ivysettings-shared.xml

<ivysettings>
<property name="ivy.shared.default.root" value="${ivy.default.ivy.user.dir}/shared" override="false"/>
<property name="ivy.shared.default.ivy.pattern" value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="false"/>
<property name="ivy.shared.default.artifact.pattern" value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="false"/>
<resolvers>
<filesystem name="shared">
<ivy pattern="${ivy.shared.default.root}/${ivy.shared.default.ivy.pattern}" />
<artifact pattern="${ivy.shared.default.root}/${ivy.shared.default.artifact.pattern}" />
</filesystem>
</resolvers>
</ivysettings>

ivysettings-local.xml

<ivysettings>
<property name="ivy.local.default.root" value="${ivy.default.ivy.user.dir}/local" override="false"/>
<property name="ivy.local.default.ivy.pattern" value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="false"/>
<property name="ivy.local.default.artifact.pattern" value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="false"/>
<resolvers>
<filesystem name="local">
<ivy pattern="${ivy.local.default.root}/${ivy.local.default.ivy.pattern}" />
<artifact pattern="${ivy.local.default.root}/${ivy.local.default.artifact.pattern}" />
</filesystem>
</resolvers>
</ivysettings>

ivysettings-main-chain.xml

<ivysettings>
<resolvers>
<chain name="main" dual="true">
<resolver ref="shared"/>
<resolver ref="public"/>
</chain>
</resolvers>
</ivysettings>

ivysettings-default-chain.xml

<ivysettings>
<resolvers>
<chain name="default" returnFirst="true">
<resolver ref="local"/>
<resolver ref="main"/>
</chain>
</resolvers>
</ivysettings>
Esto nos da una idea de las posibles configuraciones que permite Ivy para adaptarla a nuestras necesitades.
Buen desarrollo!

jueves, 4 de diciembre de 2014

Acceso a datos con Spring y ORM (parte 3)

 El acceso a datos a través de ORM y Spring

Hibernate

Trataremos la versión Hibernate 3 dentro de Spring, para mostrar la integración de ORM. Esta sección cubre en detalle y muestra distintas formas de implementación de DAO y configuración de transacciones. La mayoría de los patrones que utilizaremos pueden aplicarse al resto de ORMs soportados. .

1 Configuración de SessionFactory en el contenedor Spring

Para evitar que los objetos de la aplicación sean instanciados a través de resource lookups codificados en duro, es posible declarar recursos como un DataSource JDBC o SessionFactory de Hibernate como beans dentro de un contenedor Spring. Los objetos de la aplicación que necesitan acceder a dichos recursos, obtienen referencias a estas instancias predefinidas a través de referencias a beans, como muestra la declaración de DAOs de la siguiente sección.

Una parte de las declaraciones dentro de application context, nos muestra cómo configurar un DataSource JDBC y una SessionFactory de Hibernate:

<!-- -->
<beans>
    <!-- DataSource JDBC -->
    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
    </bean>
    <!--SessionFactory -->
    <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="mappingResources">
            <list>
                <value>product.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
             <value>
                hibernate.dialect=org.hibernate.dialect.HSQLDialect
            </value>
        </property>
    </bean>

</beans>

El intercambio entre Jakarta Commons DBCP BasicDataSource y un DataSource referenciado a través de JNDI (este último generalmente gestionado por un AS), se realiza a través de una simple configuración:

<beans>
    <jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myds"/>
</beans>

Es posible, tambien acceder a una SessionFactory a través de nombre JNDI con JndiObjectFactoryBean / <jee:jndi-lookup> de Spring, para recuperar la referencia. Sin embargo, esta no suele ser la forma usual fuera de un contexto de EJBs.

2 Implementación de DAOs directamente sobre la API Hibernate 3

En Hibernate 3, existe la posibilidad de trabajar con "contextual sessions", en las que el propio Hibernate gestiona una Session actual por cada transacción. Esta aproximación es similar a la sincronización que realiza el contenedor Spring sobre Session Hibernate para cada transacción. La correspondencia, se detallará a partir del siguiente código basado en la API Hibernate:

public class ProductDaoImpl implements ProductDao {

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public Collection loadProductsByCategory(String category) {
        return this.sessionFactory.getCurrentSession()
                .createQuery("from test.Product product where product.category=?")
                .setParameter(0, category)
                .list();
    }
}

Vemos que el código es semejante al que podemos encontrar en la documentación de Hibernate, salvo que incluye SessionFactory como una variable de instancia. Lo cual es recomendado, frente a la antigua referencia a la clase static HibernateUtil que encontramos en otros ejemplos. (como norma, es recomendable declarar un recurso dentro de una variable de tipo static, y trabjar con el a traves de una clase manejadora.)

El DAO declarado más arriba, nos permite aplicar la inyección de dependencias: ya que encaja perfectamente en un contenedor IoC Spring, como si hubiese sido codificado a partir de una HibernateTemplate de Spring (versiones anteriores), o bien poder ser configurado como Java plano (un uso sería para la realización de test unitarios). Para lo cual, sólo seria necesario instanciarlo y llamar al método setSessionFactory(..) con la referencia adecuada. La configuración del bean en Spring, seria la siguiente:

<beans>
<!--configuracion del DAO al que podemos intercambiar la sessionFactory de manera sencilla -->
    <bean id="myProductDao" class="product.ProductDaoImpl">
        <property name="sessionFactory" ref="mySessionFactory"/>
    </bean>

</beans>

La principal ventaja de esta declaración de DAO es que depende únicamente del API Hibernate; no necesita ninguna clase Spring. Esto es interesante desde el punto de vista del desacoplamiento y facilita el desarrollo para DAOs en puro Hibernate.

Sin embargo, la implementación del DAO lanza una HibernateException (que es unchecked, así que podemos haber obviado manejarla), esto implica que los manejadores de excepciones sólo pueden capturar excepciones de tipo Fatal...- a menos que hallamos incluido la jerarquia de excepciones de Hibernate. Capturando casos concretos, como un error de "locks", olvidamos un close(), realizamos múltiples update(),..no es posible sin entrar en la implementación de del llamador. Este asunto, puede darse en aplicaciones que se basan en un entorno Hibernate y no sea necesario un tratamiento especial de excepciones.

Afortunadamente, en la LocalSessionFactoryBean de Spring, soporta el método SessionFactory.getCurrentSession() de Hibernate, en cualquier estratégia elegida de transacciones, devolviendo la Session transaccional gestionada por Spring, incluso con HibernateTransactionManager. Claro está, el comportamiento normal de éste método sigue devolviendo la current Session asociada con la transacción JTA en curso (si hay alguna). Este comportamiento ocurre ya sea cuando usamos JtaTransactionManager, de Spring, o transacciones gestionadas por un contenedor EJB (ContainerManagedTransactions).

Para concluir: es posible implementar DAOs directamente en la API de Hibernate 3, y al mismo tiempo que las transacciones puedan ser gestionadas por el contenedor Spring.

3 Configuración declarativa de transacciones

Es recomendable usar la configuración de transacciones que ofrece Spring, esto nos permite separar entre el API de transacciones y sus invocaciones en nuestro código Java, gracias a un interceptor de transacciones AOP. El interceptor se puede configurar en el contenedor Spring ya sea a través de anotaciones o en XML. Esta posibilidad de configuración declarativa nos permite separar los servicios de negocio del código propio de la gestión de transacciones y centrarnos en la lógica de negocio, lo que aporta un valor añadido a la aplicación.

 

Para profundizar en la gestión de transacciones es recomendable ver la sección “Declarative transaction management”.

Además, la semántica que usamos en la gestión de transacciones, como "propagation", "isolation", pueden tambien configurarse sin que esto afecte a la implementación de los servicios.

Veamos el siguiente ejemplo, que muestra como configurar un interceptor AOP de transacción, a través deXML, para un servicio:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- SessionFactory, DataSource, etc. omitted -->

    <bean id="transactionManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
<!--AOP: advisor, advice, pointcut    -->
    <aop:config>
        <aop:pointcut id="productServiceMethods"
                expression="execution(* product.ProductService.(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="productServiceMethods"/>
    </aop:config>

    <tx:advice id="txAdvice" transaction-manager="myTxManager">
        <tx:attributes>
            <tx:method name="increasePrice" propagation="REQUIRED"/>
            <tx:method name="someOtherBusinessMethod" propagation="REQUIRES_NEW"/>
            <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>
<!--Business Service -->
    <bean id="myProductService" class="product.SimpleProductService">
        <property name="productDao" ref="myProductDao"/>
    </bean>

</beans>

Veamos la implementación del servico al que añadimos el aspecto:

public class ProductServiceImpl implements ProductService {

    private ProductDao productDao;

    public void setProductDao(ProductDao productDao) {
        this.productDao = productDao;
    }

    // Vemos que no hay código AOP dentro del método
    // ya que es gestionado a través de la declaración hecha en Spring
    public void increasePriceOfAllProductsInCategory(final String category) {
        List productsToChange = this.productDao.loadProductsByCategory(category);
        // ...
    }
}

Mostraremos a continuación la configuración de transacción sobre atributos en el siguiente ejemplo. Para ello, hemos de añadir la anotación @Transactional en la capa de servicio, esto indica al contenedor Spring que al encontrar esta anotación, añadir la semántica de transacción para los métodos indicados.

public class ProductServiceImpl implements ProductService {

    private ProductDao productDao;

    public void setProductDao(ProductDao productDao) {
        this.productDao = productDao;
    }
/*   */
    @Transactional
    public void increasePriceOfAllProductsInCategory(final String category) {
        List productsToChange = this.productDao.loadProductsByCategory(category);
        // ...
    }
/*   */
    @Transactional(readOnly = true)
    public List<Product> findAllProducts() {
        return this.productDao.findAllProducts();
    }

}

Como podemos ver configuración, se simplifica mucho, respecto a la configuración XML, aún aportando la mísma funcionalidad en el código de la capa de servicio. Lo único que necesitamos es incluir las entradas de la implementación de TransactionManager y "<tx:annotation-driven/>".

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- SessionFactory, DataSource, etc. omitted -->
<!-- -->
<bean id="transactionManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
<!-- -->
    <tx:annotation-driven/>

    <bean id="myProductService" class="product.SimpleProductService">
        <property name="productDao" ref="myProductDao"/>
    </bean>

</beans>

miércoles, 3 de diciembre de 2014

Java Crypto Architecture (Introducción)

Introducción a JCA (JDK 1.7)

Introducción a JCA (JDK 1.7)

Seguridad y Cifrado (JCA) es uno de las partes más importantes de la plataforma Java, contiene una arquitectura de "proveedores" y APIs para firma digital, generación de hashes en mensajes, certificados y validación de certificados, cifrados (simétricos/asimétricos, para recursos de I/O de modo bloque o de flujo), generación de claves y su almacenamiento/recuperación/distribución, generación segura de numeros aleatorios, por nombrar unos pocos. Estas APIs permiten a los desarrolladores una via de integrar seguridad en el código. JCA ha sido diseñada bajo los siguientes principios:

  • Independiente de la implementación: ADentro de una aplicación no es necesario implementar algoritmos de seguridad. En su lugar, realizaremos llamadas a servicios provenientes de la plataforma. Estos servicios contienen la implementación de seguridad de diverentes "proveedores", que son accedidos por la plataforma Java a través de una interfaz. De esta manera, una aplicación puede estar ligada de más de un "proveedor" de seguridad de manera independiente, para la puesta en marcha de la capa de seguridad.

  • Interoperatibilidad entre implementaciones: Los diferentes proveedores de seguridad que aporta JCA, pueden interoperar en la aplicación. De forma concreta, una aplicación no esta ligada a un proveedor específico, de la misma forma que un proveedor no se asocia a una aplicación específica.

  • Posibilidad de extender algoritmos de seguridad : JCA incluye una serie de "proveedores de seguridad integrados por defecto en la plataforma", los cuales incluyen un conjunto básico de implementaciones de seguridad, ofrecidos como servicios (a través de interfaces), la mayoría usados comúnmente en la actualidad. Sin embargo, algunas aplicaciones pueden depender de nuevos estándards de seguridad que no hayan sido integradas en la plataforma, aún no implementadas ó procedentes de terceros. JCA soporta la instalación de "proveedores propietarios" que ofrezcan una implementación a las interfaces.

Existen otras librerias de comunicación cifrada en el JDK. Dichas librerias hacen uso de la arquitectura de "proveedores de seguridad" que ofrece JCA. Entre estas:

Java Secure Socket Extension (JSSE) contiene las implementaciones de Socket Layer (SSL) y Transport Layer Security (TLS) . Java Generic Security Services (JGSS) implenta el mecanismo de seguridad Kerberos (para securizar por ejemplo una comunicación via SMTP), y Simple Authentication and Security Layer (SASL) . Utilizadas para para securizar el intercambio de mensajes en comunicaciones.

Ciertos aspectos de la tecnología

  • Antes del JDK 1.4, Java Comunications Encryption, se tenia en cuenta como un elemento fuera de JCA, sin embargo ahora JCE se encuentra incluido en el JDK, y utiliza la misma arquitectura que JCA, por lo que debería ser considerado como una parte de JCA. JCA que se incluye en JDK, consta de 2 componentes:

    1. Por un lado el framework que soporta los diferentes servicios que los distintos "proveedores de seguridad" implementan. Este framework consta entre otros de los siguientes paquetes: java.security, javax.crypto, javax.crypto.spec, y javax.crypto.interfaces.
    2. Por otro lado las verdaderas implementaciones de los proveedores como puede ser: Sun, SunRsaSign, SunJCE

    Al referirnos a un proveedor de seguridad específico de JCA, lo haremos de forma explícita por su nombre.


Importante: JCA facilita integrar caracteristicas de seguridad en una aplicación. Sin embargo, en este documento no hablaremos de la teoría de seguridad/criptografía mas alla una introducción básica, que aclare los conceptos de uso de la API JCA. Esto implica que no hablaremos de las fuerzas/puntos débiles de algoritmos concretos, ni de especificacion de protocolos. Para profundizar más acerca de criptografía:

Es aconsejable comprender bien lo que estamos haciendo y por qué: NO COPIAR de forma ^C/^V, código al hazar de manera que esperemos que resuelva nuestro caso de uso. Muchas aplicaciones desarrolladas, contienen importantes problemas de seguridad o rendimeinto, debido a un componente o algoritmo de cifrado elegido.