Criptografía Java: creación de firma
Las firmas digitales nos permiten verificar el autor, fecha y hora de las firmas, autenticar el contenido del mensaje. También incluye la función de autenticación para capacidades adicionales.
Ventajas de la firma digital
En este apartado conoceremos los diferentes motivos que exigen el uso de la firma digital. Hay varias razones para implementar firmas digitales en las comunicaciones:
Autenticación
Las firmas digitales ayudan a autenticar las fuentes de los mensajes. Por ejemplo, si la sucursal de un banco envía un mensaje a la oficina central, solicitando un cambio en el saldo de una cuenta. Si la oficina central no pudo autenticar que el mensaje se envía desde una fuente autorizada, actuar de acuerdo con dicha solicitud podría ser un grave error.
Integridad
Una vez que se firma el mensaje, cualquier cambio en el mensaje invalidaría la firma.
No repudio
Por esta propiedad, cualquier entidad que haya firmado alguna información no podrá en un momento posterior negar haberla firmado.
Creando la firma digital
Aprendamos ahora a crear una firma digital. Puede crear una firma digital utilizando Java siguiendo los pasos que se indican a continuación.
Paso 1: crear un objeto KeyPairGenerator
los KeyPairGenerator la clase proporciona getInstance() método que acepta una variable String que representa el algoritmo de generación de claves requerido y devuelve un objeto KeyPairGenerator que genera claves.
Crear KeyPairGenerator objeto usando el getInstance() método como se muestra a continuación.
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
Paso 2: inicializar el objeto KeyPairGenerator
los KeyPairGenerator la clase proporciona un método llamado initialize()este método se utiliza para inicializar el generador de pares de claves. Este método acepta un valor entero que representa el tamaño de la clave.
Inicialice el objeto KeyPairGenerator creado en el paso anterior usando el initialize() método como se muestra a continuación.
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
Paso 3: Genere el KeyPairGenerator
Puede generar el KeyPair utilizando el generateKeyPair()método. Genere el par de claves usando elgenerateKeyPair() método como se muestra a continuación.
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
Paso 4: Obtenga la clave privada del par
Puede obtener la clave privada del objeto KeyPair generado utilizando el getPrivate() método.
Obtenga la clave privada usando el getPrivate() método como se muestra a continuación.
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
Paso 5: crea un objeto de firma
los getInstance() método del Signature La clase acepta un parámetro de cadena que representa el algoritmo de firma requerido y devuelve el objeto Signature correspondiente.
Cree un objeto de la clase Signature usando el getInstance() método.
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
Paso 6: inicializar el objeto Signature
los initSign() El método de la clase Signature acepta un PrivateKey objeto e inicializa el objeto Signature actual.
Inicialice el objeto Signature creado en el paso anterior usando el initSign() método como se muestra a continuación.
//Initialize the signature
sign.initSign(privKey);
Paso 7: agregue datos al objeto Firma
los update() El método de la clase Signature acepta una matriz de bytes que representa los datos que se van a firmar o verificar y actualiza el objeto actual con los datos proporcionados.
Actualice el objeto Signature inicializado pasando los datos a firmar al update() método en forma de matriz de bytes como se muestra a continuación.
byte[] bytes = "Hello how are you".getBytes();
//Adding data to the signature
sign.update(bytes);
Paso 8: Calcule la firma
los sign() método del Signature class devuelve los bytes de firma de los datos actualizados.
Calcule la Firma usando el sign() método como se muestra a continuación.
//Calculating the signature
byte[] signature = sign.sign();
Example
El siguiente programa Java acepta un mensaje del usuario y genera una firma digital para el mensaje dado.
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Scanner;
public class CreatingDigitalSignature {
public static void main(String args[]) throws Exception {
//Accepting text from user
Scanner sc = new Scanner(System.in);
System.out.println("Enter some text");
String msg = sc.nextLine();
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
//Initializing the key pair generator
keyPairGen.initialize(2048);
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
//Initialize the signature
sign.initSign(privKey);
byte[] bytes = "msg".getBytes();
//Adding data to the signature
sign.update(bytes);
//Calculating the signature
byte[] signature = sign.sign();
//Printing the signature
System.out.println("Digital signature for given text: "+new String(signature, "UTF8"));
}
}
Output
El programa anterior genera la siguiente salida:
Enter some text
Hi how are you
Digital signature for given text: [email protected]???-?.???? /yGL?i??a!?