## Clases e Interfaces del API

Aquí están las clases principales del API de Seguridad del JDK 1.2.

  Clases de Control de Acceso
    Clases de Permisos
    Policy
    AccessController
    AccessControlContext
    PrivilegedAction and PrivilegedExceptionAction
    CodeSoure
    ProtectionDomain
    SecureClassLoader
  Clases de Criptografía
    Provider
    Signature
    MessageDigest
    Key Interfaces and Classes
    Clases e Interfaces de Key Specification
    Clases de Parámetros de Algoritmos
    Clases e Interfaces de Especificación de Parámetros de Algoritmos
    Clases de Certificados
    SecureRandom
  Seguridad
  SecurityManager

## Clases de Control de Acceso

### Clases de Permisos

> Las clases de permisos representan accesos a los recursos del sistema. La clase

>     java.security.Permission

> es una clase abstracta y sus subclases, representan accesos específicos.

> Los clientes pueden definir fácilmente sus propios permisos, subclasificando la clase Permission o una de sus subclases, como

>     java.security.BasicPermission

Las subclases de permisos (otras distintas de BasicPermission) generalmente pertenecen a sus propios paquetes. Así, FilePermission se encuentran en el paquete java.io.

Los tipos de permisos (clases) incluidas en el JDK 1.2 son:

- java.security.AllPermission
- java.io.FilePermission
- java.net.SocketPermission
- java.net.NetPermission
- java.security.SecurityPermission
- java.lang.RuntimePermission
- java.util.PropertyPermission
- java.awt.AWTPermission
- java.lang.reflect.ReflectPermission, y
- java.io.SerializablePermission.

Los permisos típicamente tienen un "nombre" y algunas veces una "acción". Las clases como FilePermission y SocketPermission que tienen una sintaxis de nombre más complicados que los usados por las subclases de BasicPermission directamente desde Permission en vez de desde BasicPermission. Por ejemplo, para un objeto java.io.FilePermission, el nombre del permiso es el path de un fichero (o directorio), mientras que el nombre del permiso para un BasicPermission es simplemente el nombre del permiso dado (por ejemplo, "exitVM", "setFactory", "queuePrintJob", etc).

Algunas de las clases de permisos tienen una lista de "acciones" que dice las acciones que tiene permitidas el objeto. Por ejemplo, para una objeto java.io.FilePermission la lista de acciones (como "read, write") específica las acctiones que permitidas para el fichero especifico (o para ficheros en el directorio especificados).

Otras clases de permisos son los permisos "nombrados" - aquellos que contienen un nombre pero no lista de acciones. BasicPermission se utilizan comunmente como clase base para permisos "nombrados", ya que en ellos, la cadena de acción (heredada de Permission) no se utiliza. Las subclases pueden implementar acctiones en la parte superior de BasicPermission, si se desa.

### Policía

> La policía para el entorno de aplicación Java (especificando que permisos están disponibles para el codigo de varias fuentes) esta representado por un objeto Policy. Más específicamente, está presentado por una subclase de Policy proporcionando una implementación de los métodos abstractos de la clase Policy.

> La localización de la fuente para la información de policía utilizadas por el objeto Policy se configura en la implementación de Policy. La implementación por defecto incluida con el JDK obtiene su información desde los ficheros de configuración de policía estáticos.

### AccessController

> La clase AccessController se utiliza para tres propósitos:
> - El método checkPermission decide si está permitido o denegado un acceso a un recurso crítico del sistema, basándose en la policía de seguridad activa en ese momento. Es invocado por el método checkPermission del SecurityManager .
> - Los métodos doPrivileged marcan el código como privilegiado, lo que afecta a las subsecuentes determinaciones de accesos.
> - El método getContext obtiene una "fotografía" del contexto de llamad actual para que las decisiones de control de acceso desde un contexto diferente puedan hacerso con respecto al contexto guardado.

### AccessControlContext

> Un AccessControlContext se usa para tomar las decisiones sobre accesos a recursos del siste,a basándose en el contexto que encapsula. El propósito de esta clase es para aquella situaciones donde se debería realizar un chequeo de seguridad dentro de un contexto dado que actualmente necesita hacerse desde dentro de un contexto diferente (por ejemplo, desde otro thread).

### PrivilegedAction y PrivilegedExceptionAction

> PrivilegedAction representa un cálculo a realizarse con privilegios activados. El cálculo se realiza llamando al método AccessController doPrivileged sobre el objeto PrivilegedAction.

> El interface PrivilegedAction sólo se usa para cálculos que no comprueban excepciones; los cálculos que comprueba excepciones deben usar PrivilegedExceptionAction en su lugar.

### CodeSource

> El código ejecutado siempre se considera que viene desde una "fuente de código" particular (representada por un objeto del tipo CodeSource). Un CodeSource consiste en un URL (especificando la localización de donde es originario el código) y un conjunto de certificados que contienen las claves públicas correspondientes a las claves privadas usadas para firmar el código (si el código fue firmado).

### ProtectionDomain

> Esta clase encapsula las características de un dominio, que encierra un conjunto de clases cuyos ejemplares tienen concedidos el mismo conjunto de permisos.

> Además de un conjunto de permisos, un dominio está compuesto por un CodeSource, que es un conjunto de PublicKey junto con un codebase (en el formato de una URL). Así, las clases firmadas por las mismas claves y desde la misma URL están situadas en el mismo dominio.

## SecureClassLoader

> Esta es implementación concreta de java.lang.Classloader que también maneja de carga remota de clases (por ejemplo, desde una URL o InputStream). Todos los appets y aplicaciones (excepto para las clases de sistema) son cargadas por un SecureClassLoader directamente o indirectamente.

## Clases de Criptografía

### Provider

> El término "Cryptographic Service Provider" ("proveedor" para acortar) se usa para referirse a un paquete o conjunto de paquetes que suministra una implementación concreta de un conjunto de aspectos de criptografía del API de Seguridad del JDK. La clase Provider es el interface a dicho paquete o conjunto de paquetes. Tiene métodos para acceder al nombre del proveedor, el número de versión y otras informaciones.

> Hay varios tipos de servicios que pueden ser implementados por paquetes proveedore -- puedes ver Clases Motor.

### Signature

> La clase Signature es una clase motor diseñada para proporcionar la funcionalidad de un algoritmo de firma digital como el DSA o RSA con MD5. Un algoritmo de firma toma una entrada de tamaño arbitrario y una clave privada y generan una cadena debytes relativamente corta (o de tamaño fijo), llamada firma, con las siguientes propiedades:
> - Dando la clave pública correspondiente a la clave privada usada para generar lafirma, debería se posible verificar la autenticidad e integridad de la entrada.
> - La forma y la clave pública no revelan nada sobre la clave privada.

> Un objeto Signature puede usarse para generar una firma digital para datos. También puede usarse para verificar si la firma recibida es auténtica o no.

### MessageDigest

> La clase MessageDigest es una clase motor diseñada para proporcionar la funcionalidad de seguridad criptográfica resumen de mensaje como SHA-1 o MD5. Un resumen de mensaje seguro criptográficamente toma una entrada de tamaño arbitrario (un array de bytes), y genera una salida de tamaño fijo, llamada digest. Un digest tiene las siguientes propiedades:
> - Debería ser computacionalmente infalible para encontar otra cadena de entrada que genere el mismo resumen de mensaje.
> - El resumen no revela nad sobre la entrada que fue utilizada para generarlo.

> Los resúmenes de mensajes se usan para producir un identificador de datos único y fiable. Algunas veces se les llama "huellas digitales" de los datos.

## Clases e Interfaces de Claves

### Key

> El interface Key es el interface de más alto nive para todas las claves opacas. Define la funcionaliad compartida por todos los objetos key opacos.

> Nos ofrece acceso limitado a la clave -- sólo define tres métodos : getAlgorithm, getFormat, y getEncoded.

> Las claves se obtienen generalmente a través de generadores de claves, certificados, especificaciones de claves (usando un KeyFactory), o una implementación de KeyStore para acceder a una base de datos de "keystore" usada para manejar claves.

> Es posible analizar claves codificadas, de una forma dependiente del algoritmo, usando un KeyFactory.

### PublicKey y PrivateKey

> Los interfaces PublicKey y PrivateKey (los dos decienden de Key) son interfaces sin métodos usados para seguridad e identificación de tipos para public keys y private keys.

### KeyPair

> La clase KeyPair es un simple contenedor para una pareja de claves (una clave pública y otra privada). Tiene dos métodos públicos, una para devolver la clave privada, y otro para devolver la clave pública.

### KeyPairGenerator

> La clase KeyPairGenerator es una clase motor usada para generar parejas de claves pública y pruvada.

### KeyFactory

> La clase KeyFactory es una clase motor diseñada para proporcionar conversiones entre claves criptográficas opacas (del tipo Key) y especificaciones de clave (representaciones transparentes del material clave importante).

> Las fábricas de calves son bi-direccionales, es decir, permiten construir un objeto key opcaco desde una especificación de clave dada (material clave), o recuperar el matrial clave de un objeto key en un objeto entendible.

### KeyStore

> Se puede usar una base de datos llamada "keystore" para manejar un repositorio de claves y certificados.

> La clase KeyStore es una clase motor que suministra interfaces bien definidos para acceder y modificar la información de un keystore. Es posible desde aquí tener implementaciones concretas diferentes, donde cada implementación es para un tipo de keystore particular.

> Hay una implementación interna por defecto, proporcionada por Sun Microsystems. Implementa el keystore como un fichero, utilizando un tipo de keystore propietario llamado "JKS". Protege cada clave privada con su password indiviaudl, y también protefe la integridad del propio keystore con un password (posiblemente diferente).

## Clases e Interfaces de Especificaciones de Claves

Las especificaciones de claves son representaciones transparentes del material importante que constituye una clave.

Una representación transparente de una clave significa que podemos acceder individualmente a los valores del material importante, a través de uno de los métodos "get" definidos en la especificación de la clase correspondiente.

Una clave puede especificarse de una forma específica del algoritmo, o en una forma independiente del algoritmo dle formado de codificación (como ASN-1). Por ejemplo, una clav eprivada DSA podría especificarse por sus componentes x, p, q, y g (puedes ver DSAPrivateKeySpec), o podría ser especificada usando el codificador DER (puedes ver PKCS8EncodedKeySpec).

Las clases e interfaces de especificaciones de claves aparecen en el paquete java.security.spec:

### KeySpec

> Este interface no contiene métodos ni constantes. Su único propósito es agrupar (y proporcionar un tipo seguro) para todas las especificaciones de clave. Todas las especificaciones de claves deben implementar este interface.

### DSAPrivateKeySpec

> Esta clase (que implementa el interface KeySpec) especifica un clave privada DSA con sus parámetros asociados.

### DSAPublicKeySpec

> Es clase (que implementa el interface KeySpec) especifica una clave pública DSA con sus parámetros asociados.

### RSAPrivateKeySpec

> Esta clase (que implementa el interface KeySpec) especifica una clave privada RSA.

### RSAPrivateCrtKeySpec

> Esta clase (que desciende de la clase RSAPrivateKeySpec) especifica una clave privada RSA, definida según el estándard PKCS#1,usando los valores Chinese Remainder Theorem (CRT).

### RSAPublicKeySpec

> Esta clase (que implementa el interface KeySpec) específica una clave pública RSA.

### EncodedKeySpec

> Esta clase abstracta (que implementa el interface KeySpec) representa una clave pública o privada en formato codificado.

> ### PKCS8EncodedKeySpec

> > Esta clase, que es una subclase de EncodedKeySpec, representa la codificación DER de una clave privada, de acuerdo con el formado especificado por el estándard PKCS #8.

> ### X509EncodedKeySpec

> > Esta clase, que es una subclase de EncodedKeySpec, representa la codificación DER de una clave privada, de acuerdo con el formado especificado por el estándard X.509.

## Clases de Parámetros de Algoritmo

### AlgorithmParameters

> La clase AlgorithmParameters es una clase motor que proporciona una representación opaca de parámetros de criptografía.

> Una representación opaca es aquella en la no se tiene acceso directo a los campos de parámetros; sólo podemos obtener el nombre del algoritmo asociado con el conjunto de parámetros y algún tipo de codificación para el conjunto de parámetros.

### AlgorithmParameterGenerator

> La clase AlgorithmParameterGenerator es una clase motor usada para generar un conjunto de parámetros usados con un cierto algoritmo (el algoritmo especificado cuando se creó un ejemplar AlgorithmParameterGenerator).

## Clases e Interfaces de Especificación de Parámetros de Algoritmo

Una específicación de parámetros de algoritmo es una representación transparente de un conjunto de parámetros usados con un algoritmo.

Una representación transparente de parámetros significa que podemos acceder a cada valor individual, a través de uno de los métodos "get" definidos en la clase correspondiente.

Las clases e interfaces de especificación de parámetros aparecen en el interface java.security.spec:

### AlgorithmParameterSpec

> AlgorithmParameterSpec es un interface para una especificación transparente de parámetros criptográficos. este interface no contiene métodos ni constantes. Su único propósito es agrupar (y proporciona un tipo seguro) para todas las especificaciones de parámetros. Todos las especificaciones de parámetros deben implementar este interface.

### DSAParameterSpec

> Esta clase (que implementa el interface AlgorithmParameterSpec) especifica el conjunto de parámetros usados con el algoritmo DSA.

## Clases de Certificados

### Certificate

> La clase java.security.cert.Certificate es una abstarción para los certicados que tienen diferentes formatos pero importantes usos comunes. Por ejemplo, diferentes tipos de certificados, como X.509 y PGP, comparten funcionalidades generales (como la codificación y verificación) y algunos tipos de información (como una clave pública).

### CertificateFactory

> La clase java.security.cert.CertificateFactory es una motor que define la funcionalidad de una fábrica de certificados. que se usa para generar objeto certificate y listas de revocaciones de certificados (CRL) desde sus codificaciones.

### X509Certificate

> La clase java.security.cert.X509Certificate es una clase abstracta para certificados X.509. Proporciona una forma estándard de acceder a todos los atributos de un certificado X.509.

## SecureRandom

> La clase SecureRandom es una clase motor que proporciona funcionalidad para un generador de números aleatorios.

## Security

> La clase Security maneja proveedores instalados y propiedades de seguridad. Sólo contiene métodos estáticos y nunca se ejemplariza.

## SecurityManager

> java.lang.SecurityManager es una clase que permite a las aplicaciones implementar una policía de seguridad. Permite a una aplicación determinar, antes de realizar un operación posiblemente insegura, que operacón es, y decidir si está o no pemitida su ejecución.

> La clase SecurityManager contiene muchos métodos con nombres que empiezan con la palabra check. Estos métodos son llamados por varios método de la librería de ejecución antes de aquellos métodos que realizan acciones potencialmente sensibles..

> Como en el JDK 1.2, la implementación por defecto de cada método checkXXX es para llamar al método checkPermission(java.security.Permission perm), analizando el permiso requerido para realizar la operación. El método checkPermission determian si se debe conceder o denegar el permiso especificado al llamador.

>     AccessController.checkPermission(perm);

> Si el accedos está permitodp, checkPermission retorna calladamente. Si es denegado, se lanza una SecurityException.

Ozito