Hoy día y gracias a que Internet es una realidad
que beneficia a millones de personas, es posible compartir
casi cualquier tipo de información en cuestión segundos.
Pero dicha ventaja es a su vez un gran problema,
porque muchas veces la información compartida
está corrupta o posee datos maliciosos
que pueden comprometer el correcto funcionamiento
de un sistema de información.
Y es gracias a dicha problemática
que se hace necesario
contar con métodos o herramientas
que permitan verificar que la información enviada y recibida
es realmente la información que se necesita.
Entonces, el método que permite realizar tal validación
es la implementación de una firma digital.
Una firma digital no es más que un método criptográfico
que asocia una identidad a un mensaje enviado a través de la red,
es decir, es el procedimiento por el cual
se puede autenticar al emisor de un mensaje
y confirmar que dicho mensaje
no ha sido alterado desde que fue firmado.
En sí, la firma digital permite que tanto
el receptor como el emisor de un contenido
puedan identificarse mutuamente con la certeza
de que son ellos los que están interactuando,
evitando que terceras personas
intercepten dicho contenido y por tanto no pueda ser alterado.
-
Java permite proteger la integridad de la información
mediante el uso de firmas digitales.
En el caso particular de está solución se firmará
el contenido de un arreglo.
-
Para firmar un objeto es necesario
crear una clave privada y una clave pública,
las cuales serán usadas
para firmar y verificar el contenido del arreglo.
-
Lo primero que hay que haces
es importar las siguientes clases.
Las clases terminadas en Exception,
representan excepciones que podrían ocurrir durante el proceso.
cli.java
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.security.InvalidKeyException;
-
Como segundo paso, se debe generar
la clave privada y su respectiva clave pública,
estas serán usadas para firmar y verificar
la integridad del contenido.
Para hacerlo, se debe invocar
el método estático getInstance de la clase KeyPairGenerator.
class CLI {
public static void main(String[] args) throws Exception,
NoSuchAlgorithmException, SignatureException, InvalidKeyException {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
KeyGen.initialize(1024);
KeyPair keypair = keyGen.genKeyPair();
PrivateKey privateKey = keypair.getPrivate();
PublicKey publicKey = keypair.getPublic();
-
Luego, hay que invocar
el método getInstance de la clase Signature
con el fin de obtener
una referencia al objeto que representa la firma digital.
byte buffer[] = "Hello World".getBytes();
Signature signature = Signature.getInstance(privateKey.getAlgorithm());
-
Para firmar el contenido del arreglo buffer[],
es necesario invocar el método initSign de la clase Signature
con el fin de establecer la operación de firmado.
Se debe tener en cuenta
que es necesario pasarle como parámetro
la clave privada que fue generada anteriormente.
Posteriormente, se establece que parte del contenido del arreglo
va a ser firmado..
signature.initSign(privateKey);
signature.update(buffer, 0, buffer.length);
byte[] signBytes = signature.sign();
-
Para verificar la integridad de la información,
se debe utilizar la clave publica para crear la firma.
Luego se establece que parte del contenido
del arreglo debe ser verificado.
signature.initVerify(publicKey);
signature.update(buffer, 0, buffer.length);
-
El método verify de la clase Signature
se invoca para verificar
si la información no fue alterada.
boolean validBuffer = signature.verify(signBytes);
-
Por último, se imprimen los resultados.
sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
System.out.println("DSA-1024 PrivateKey = " + privateKey);
System.out.println("DSA-1024 PublicKey = " + publicKey);
System.out.println("buffer: " + new String(buffer));
System.out.println("Signature: " + encoder.encode(signBytes));
System.out.println("Verification: " + validBuffer);
}
}