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!?