## Entender la Firma y la Verificación

La plataforma JavaTM te permite firmar digitalmente tus ficheros JAR. Se firma digitalmente un fichero por la misma razón por la que se firma un documento de papel - para permitir a los lectores saber que tú has escrito el documento, o al menos que el documento tiene tu aprovación.

Por ejemplo, cuando firmas una carta, quien reconozca tu firma puede confirmar que tú has escrito la carta. De forma similar, cuando firmas un fichero digitalmente, aquel que "reconozca" tu firma digital sabe que el fichero viene de tí. El proceso de "reconocimiento" de firmas electrónicas se llama verificación.

¿Por qué es tan importante firmar y verificar los ficheros? Cuando descargas un fichero de un applet sin firmar de la web, la plataforma Java no le permite que realice operaciones sensibles a la seguridad como leer o escribir ficheros locales o ejecutar programas locales. Pero ¿qué sucede si dichas operaciones son una parte crucial de la funcionalidad del applet? y ¿qué pasa si quieres que tu applet realice una operación prohibida normalmente? Aquí es donde aparecen la firma y la verificación.

Si un applet está firmado, tú puedes determinar si viene de una fuente correcta. Una vez que tú (o tu navegador) hayas verificado que el applet viene de una fuente correcta, la plataforma puede relajar las restricciones de seguridad y permitir que el applet realice algunas operaciones que ordinariamente estarían prohibidas. En la versión 1.1 de la plataforma Java, un applet verdadero tiene la misma libertad que una aplicación local. En la versión 1.2 de la plataforma, un applet verdadero tiene las libertades especificadas en el fichero de policía.

La plataforma Java permite la firma y verificación utilizando números especiales llamados claves pública y privada. Estas claves vienen en parejas y juegan papeles complementarios.

La clave privada es el "lápiz" electrónico con el que tú firmas un fichero. Como su nombre indica, tu clave privada sólo la conoces tú, por eso nadie puede falsificar tu firma. Un fichero firmado con tu clave privada sólo puede ser verificado por la correspondiente clave pública.

Sin embargo, sólo las claves pública y privada, no son suficientes para verificar una firma. Una clave pública sólo puede verificar que un fichero firmado fue firmado por la clave privada correspondiente. Por eso aunque una clave pública puede decirte que una firma es "auténtica", no puede decirte de quien es la firma!

Por lo tanto, se requiere un elemento más para hacer el trabajo de firma y verificación. El elemento adicional es el certificado que los firmantes incluyen en un fichero JAR firmado. Un certificado es una sentencia firmada digitalmente por una autoridad en certificación que indica quien es el propietario de una firma particular. En el caso de los ficheros JAR firmados, el certificado indica a quién pertenece la clave pública contenida en el fichero JAR.

Cuando firmas un fichero JAR tu clave pública se sitúa dentro del archivo junto con un certificado asociado para facilitar el uso por cualquiera que quiera verificar tu firma.

Para sumarizar la firma digital:

- El firmante firma el fichero JAR utilizando una clave privada.
- La correspondiente clave pública se sitúa dentro del fichero JAR, junto con su certificado, para que sea posible su uso por quien quiera verificar la firma.

### El fichero de Firma

Cuando firmas un fichero JAR, se añade automáticamente un fichero de firma en el directorio META-INF del fichero JAR. Este es el mismo directorio que contiene el manifesto del fichero JAR. Los ficheros de firma tienen la extensión .SF.

Aquí tienes un ejemplo del contenido de un fichero de firma:

    Signature-Version: 1.0
    SHA1-Digest-Manifest: h1yS+K9T7DyHtZrtI+LxvgqaMYM=
    Created-By: SignatureFile JDK 1.2

    Name: test/classes/Manifest.class
    SHA1-Digest: fcav7ShIG6i86xPepmitOVo4vWY=

    Name: test/classes/SignatureFile.class
    SHA1-Digest: xrQem9snnPhLySDiZyclMlsFdtM=

    Name: test/images/manifest-concept.gif
    SHA1-Digest: kdHbE7kL9ZHLgK7akHttYV4XIa0=

    Name: test/images/manifest-schematic.gif
    SHA1-Digest: mF0D5zpk68R4oaxEqoS9Q7nhm60=

El fichero de firma contiene entradas para cada nombre de fichero el valor de resumen. La línea SHA1-Digest-Manifest contiene el resumen del fichero de manifiesto .

Los valores de resumen son representaciones codificadas del contenido de los ficheros en el momento en que fueron firmados. El resumen de un fichero cambiará sólo si cambia el propio fichero. Cuando se verifica un fichero JAR firmado, se calcula el resumen de cada fichero y se compara con el resumen almacenado en el fichero de manifiesto para asegurarse de que el contenido del fichero JAR no ha cambiado desde que se firmó.

Puedes encontrar información adicional sobre la firma de ficheros en las páginas de documentación del JDK Formato del Manifesto.

### El fichero de bloques de firmas

Además del fichero de firma, cuando se firma un fichero JAR se añade automáticamente un fichero de bloque de firma en el directorio META-INF. Al contrario que el fichero de manifiesto o el fichero de firma, los ficheros de bloques de firmas no tienen un formato leible.

El fichero de bloque de firmas contiene dos elementos esenciales para la verificación:

- La firma digital para el fichero JAR que fue generado por la clave privada del firmante.
- La clave pública del firmante, junto con su certificado, para ser utilizadas por cualquiera que quiera verificar el fichero JAR.

Los nombres de los ficheros de bloques de firmas normalmente tienen la extensión, .DSA indicando que han sido creados por el Algoritmo de Firma Digital por defecto. Sin embargo, son posibles otras extensiones si las claves están asociadas con otros algoritmos estándard.

### Documentación Relacionada

Para información adicional sobre las claves, los certificados, y autoridades de certificación, puedes ver

- Las claves del JDK 1.2 y la herramienta de Manejo de Certificado
- Certificados X.509

Para más información sobre la arquitectura de seguridad de la plataforma Java, puedes ver esta documentación relacionada:

- Especificación y Referencia sobre el API Java de Cryptografía
- Documentación sobre seguridad en el JDK 1.2

Ozito