Fluid Attacks logo
Contact Us
Young hacker smiling
Zero false positives

Expert intelligence + effective automation

Contact logo Contact Us
GET A DEMO

Firmar el Contenido de un Objeto

Necesidad

Firmar el contenido de un objeto mediante el uso de una firma digital.

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se dispone de un compilador estándar de Java.

Solución

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.

  1. 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á un objeto.

  2. 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 objeto.

  3. Primero hay que importar las siguientes clases. Las clases terminadas en Exception, representan excepciones que podrían ocurrir durante el proceso.

    cli.java
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.Signature;
    import java.security.SignedObject;
    import java.io.IOException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.SignatureException;
    
  4. Como segundo paso, se debe generar la clave privada y su respectiva clave pública, estas serán usadas para firmar y verificar la validez de la firma. Para hacerlo, se debe invocar el método estático getInstance de la clase KeyPairGenerator.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    class CLI {
      public static void main(String[] args) throws Exception,
        NoSuchAlgorithmException, SignatureException, InvalidKeyException,
          IOException, ClassNotFoundException {
            PublicKey publicKey = null;
            PrivateKey privateKey = null;
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
            keyGen.initialize(1024);
            KeyPair keypair = keyGen.genKeyPair();
            privateKey = keypair.getPrivate();
            publicKey = keypair.getPublic();
    
  5. 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.

    1
    2
    String data = "object signed";
    Signature signature = Signature.getInstance(privateKey.getAlgorithm());
    
  6. Para verificar la integridad y la autenticidad de la información, se debe utilizar la clave pública para crear la firma. Dicha clave pública se encuentra asociada a la clave privada con la cual se firmó el contenido de la variable data.

    1
    Signature sigs = Signature.getInstance(publicKey.getAlgorithm());
    
  7. Posteriormente se debe invocar el método verify de la clase SignedObject para identificar si la firma digital asociada al objeto firmado es correcta.

    1
    boolean b = so.verify(publicKey, sigs);
    
  8. Por último, se obtiene el contenido del objeto firmado y se imprimen los resultados.

    1
    2
    3
    4
    5
      String os = (String) so.getObject();
      System.out.println("object signed: " + os);
      System.out.println("Signature Verification: " + b);
      }
    }
    

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

CLI.java Clase CLI.


Service status - Terms of Use