O objetivo deste
artigo e demonstrar como gerar uma assinatura digital, para assinar
um arquivo.
Para tanto vamos
precisar de um par de chaves um Privada e Outra Publica.
Com a chave Privada
assinamos e criptografar-mos o documento, esta chave como o nome diz e
privada e não pode ser revelada, para que o destinatário possa
abrir o documento e comprovar a autoria do mesmo verificando o mesmo
e validando a assinatura enviamos a chave Publica, desse modo
poderemos enviar a mesma chave para diversos destinatários, desse
modo somente quem possuir a chave publica poderá poderá abrir e
validar a assinatura.
Podemos criar uma
par de chaves de varias maneiras, pelo shell do linux, sites
softwares etc, o JAVA e muito utilizado em aplicações WEB para
esses fim, e possui muitas classes para criar chaves encriptografar ler
arquivos de diversos formatos, e também possui um tipo de dado para
chaves.
Algumas classes
utilizadas para criptografia criação de Chaves e validação de
assinaturas:
import java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.ObjectInputStream;
import
java.io.ObjectOutputStream;
import
java.security.KeyPair;
import
java.security.KeyPairGenerator;
import
java.security.PrivateKey;
import
java.security.PublicKey;
import
javax.crypto.Cipher;
import
java.security.InvalidKeyException;
import
java.security.KeyFactory;
import
java.security.Signature;
import
java.security.spec.PKCS8EncodedKeySpec;
Para criarmos uma
assinatura digital precisamos de uma instância da classe
java.security.Signature. Para isso podemos chamar o metodo
Signature.getInstance(), com seus devidos parâmetros de algoritimos
e Provedor, neste exemplo esta sendo utilizado o algotirimo
SHAcithDSA e o provedor SUN.
Antes utilizarmos o
objeto Signature para iniciar com a PrivateKey, no exemplo também e
demonstrado como se obter a PrivateKey, e iniciaremos a assinatura
chamando com o método initSign().
Agora já estamos
aptos a gerar uma Assinatura Digital. Dentro do arquivo que
pretendemos assinar, para isso temos trabalhar com dados tipo
Byte[], usamos o método Files.readALLBytes().
E então para
assinar digitalmente o documento, temos que atualizar-lo, isso se
fazer com o método update() passamos os bytes para a Signature, e
para gerar a assinar no documento fechamos com o método sign() ,
este método retorna uma array de bytes da assinatura.
Exemplo de Código:
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.*;
public class GenerateDigitalSignature {
public static void main(String[] args) {
try {
// Get instance and initialize a KeyPairGenerator object.
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(1024, random);
// Get a PrivateKey from the generated key pair.
KeyPair keyPair = keyGen.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
// Get an instance of Signature object and initialize it.
Signature signature = Signature.getInstance("SHA1withDSA", "SUN");
signature.initSign(privateKey);
// Supply the data to be signed to the Signature object
// using the update() method and generate the digital
// signature.
byte[] bytes = Files.readAllBytes(Paths.get("
ENDEREÇO DO
"));
signature.update(bytes);
byte[] digitalSignature = signature.sign();
// Save digital signature and the public key to a file.
Files.write(Paths.get("signature"), digitalSignature);
Files.write(Paths.get("publickey"), keyPair.getPublic().getEncoded());
} catch (Exception e) {
e.printStackTrace();
}
}
}