Joven hacker sonriendo

Cero falsos positivos

Inteligencia experta + automatización eficaz

Firmar el Contenido de un Arreglo

Nuestros ethical hackers nos explican que son las firmas digitales y la importancia que estas tienen a la hora de compartir todo tipo de información en la red. Además, mediante un ejemplo en Java, nos enseñan como firmar adecuadamente el contenido de un arreglo.

Necesidad

Firmar el contenido de un arreglo 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á el contenido de un arreglo.

  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 arreglo.

  3. 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
    1
    2
    3
    4
    5
    6
    7
    8
    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;
    
  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 integridad del contenido. Para hacerlo, se debe invocar el método estático getInstance de la clase KeyPairGenerator.

    1
    2
    3
    4
    5
    6
    7
    8
    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();
    
  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
    byte buffer[] = "Hello World".getBytes();
    Signature signature = Signature.getInstance(privateKey.getAlgorithm());
    
  6. 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..

    1
    2
    3
    signature.initSign(privateKey);
    signature.update(buffer, 0, buffer.length);
    byte[] signBytes = signature.sign();
    
  7. 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.

    1
    2
    signature.initVerify(publicKey);
    signature.update(buffer, 0, buffer.length);
    
  8. El método verify de la clase Signature se invoca para verificar si la información no fue alterada.

    1
    boolean validBuffer = signature.verify(signBytes);
    
  9. Por último, se imprimen los resultados.

    1
    2
    3
    4
    5
    6
    7
    8
      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);
      }
    }
    

Descargas

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

CLI.java Clase CLI.




Haz un comentario

Estado de los servicios - Términos de Uso