Olá Habr! Apresento a você a tradução do quarto artigo "Java Mac", de Jakob Jenkov, a partir de uma série de artigos para iniciantes que desejam aprender o básico da criptografia em Java.
Sumário:
- Criptografia Java
- Cifra Java
- Messagedigest
- Mac
- Assinatura
- Par de chaves
- Keygenerator
- KeyPairGenerator
- Keystore
- Keytool
- Certificado
- CertificateFactory
- CertPath
Código de autenticação de mensagem (MAC)
O Java Mac ( javax.crypto.Mac ) gera código de autenticação de mensagens (MAC) a partir de dados binários. MAC é um resumo da mensagem criptografado com uma chave secreta. Somente com uma chave secreta você pode verificar a autenticidade do MAC.
Instanciação
Antes de usar a classe Mac, você deve criar uma instância do Mac. Uma instância de uma classe Mac é criada usando o método getInstance () . Aqui está um exemplo de criação de uma instância do Mac:
Mac mac = Mac.getInstance("HmacSHA256");
O parâmetro de string passado para getInstance () contém o nome do algoritmo usado. Nesse caso, o algoritmo HmacSHA256 é usado.
Inicialização
Após criar a instância, o Mac deve ser inicializado. Uma instância do Mac é inicializada chamando o método init () , passando a chave secreta que será usada pela instância como parâmetro. Aqui está um exemplo de inicialização de uma instância do Mac:
byte[] keyBytes = new byte[]{0,1,2,3,4,5,6,7,8 ,9,10,11,12,13,14,15}; String algorithm = "RawBytes"; SecretKeySpec key = new SecretKeySpec(keyBytes, algorithm); mac.init(key);
O método init () aceita uma instância de Key . Este exemplo usa SecretKeySpec , que implementa a interface Key.
Cálculo MAC
Usando a instância do MAC (após a inicialização), você pode começar a calcular os dados do MAC. Para calcular o valor MAC, você chama o método update () ou doFinal () . Se você tiver apenas um bloco de dados para calcular o MAC, poderá chamar diretamente doFinal () , por exemplo:
byte[] data = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8"); byte[] macBytes = mac.doFinal(data);
Se você tiver vários blocos de dados para calcular o MAC, por exemplo, se você ler o arquivo bloco por bloco, deverá chamar o método update () para cada bloco e terminar com doFinal () no último bloco. Aqui está um exemplo:
byte[] data = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8"); byte[] data2 = "0123456789".getBytes("UTF-8"); mac.update(data); mac.update(data2); byte[] macBytes = mac.doFinal();