Criptografia Java - Criando assinatura

As assinaturas digitais nos permitem verificar o autor, data e hora das assinaturas, autenticar o conteúdo da mensagem. Também inclui função de autenticação para recursos adicionais.

Vantagens da assinatura digital

Nesta seção, aprenderemos sobre os diferentes motivos que exigem o uso da assinatura digital. Existem várias razões para implementar assinaturas digitais para comunicações -

Autenticação

As assinaturas digitais ajudam a autenticar as fontes das mensagens. Por exemplo, se a filial de um banco enviar uma mensagem ao escritório central, solicitando a alteração do saldo de uma conta. Se o escritório central não conseguiu autenticar que a mensagem foi enviada de uma fonte autorizada, atender a essa solicitação pode ser um erro grave.

Integridade

Assim que a mensagem for assinada, qualquer alteração na mensagem invalidará a assinatura.

Não repúdio

Por esta propriedade, qualquer entidade que tenha assinado alguma informação não pode mais tarde negar que a tenha assinado.

Criação da assinatura digital

Vamos agora aprender como criar uma assinatura digital. Você pode criar uma assinatura digital usando Java seguindo as etapas abaixo.

Etapa 1: Crie um objeto KeyPairGenerator

o KeyPairGenerator classe fornece getInstance() método que aceita uma variável String que representa o algoritmo de geração de chave necessário e retorna um objeto KeyPairGenerator que gera chaves.

Crio KeyPairGenerator objeto usando o getInstance() método conforme mostrado abaixo.

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

Etapa 2: inicializar o objeto KeyPairGenerator

o KeyPairGenerator classe fornece um método chamado initialize()este método é usado para inicializar o gerador de par de chaves. Este método aceita um valor inteiro que representa o tamanho da chave.

Inicialize o objeto KeyPairGenerator criado na etapa anterior usando o initialize() método conforme mostrado abaixo.

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

Etapa 3: gerar o KeyPairGenerator

Você pode gerar o KeyPair usando o generateKeyPair()método. Gere o par de chaves usando ogenerateKeyPair() método conforme mostrado abaixo.

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

Etapa 4: obtenha a chave privada do par

Você pode obter a chave privada do objeto KeyPair gerado usando o getPrivate() método.

Obtenha a chave privada usando o getPrivate() método conforme mostrado abaixo.

//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();

Etapa 5: criar um objeto de assinatura

o getInstance() método do Signature classe aceita um parâmetro de string que representa o algoritmo de assinatura necessário e retorna o respectivo objeto de assinatura.

Crie um objeto da classe Signature usando o getInstance() método.

//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");

Etapa 6: inicializar o objeto de assinatura

o initSign() método da classe de assinatura aceita um PrivateKey objeto e inicializa o objeto de assinatura atual.

Inicialize o objeto de assinatura criado na etapa anterior usando o initSign() método conforme mostrado abaixo.

//Initialize the signature
sign.initSign(privKey);

Etapa 7: adicionar dados ao objeto de assinatura

o update() O método da classe Signature aceita uma matriz de bytes que representa os dados a serem assinados ou verificados e atualiza o objeto atual com os dados fornecidos.

Atualize o objeto de assinatura inicializado passando os dados a serem assinados para o update() método na forma de matriz de bytes, conforme mostrado abaixo.

byte[] bytes = "Hello how are you".getBytes();      

//Adding data to the signature
sign.update(bytes);

Etapa 8: Calcule a assinatura

o sign() método do Signature classe retorna os bytes de assinatura dos dados atualizados.

Calcule a assinatura usando o sign() método conforme mostrado abaixo.

//Calculating the signature
byte[] signature = sign.sign();

Example

O programa Java seguinte aceita uma mensagem do usuário e gera uma assinatura digital para a mensagem fornecida.

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

O programa acima gera a seguinte saída -

Enter some text
Hi how are you
Digital signature for given text: 0=@gRD???-?.???? /yGL?i??a!?