Алгоритм MAC (Message A uthentication Code) — это криптографический метод с симметричным ключом, обеспечивающий аутентификацию сообщения. Для установления процесса MAC отправитель и получатель совместно используют симметричный ключ K.
По сути, MAC — это зашифрованная контрольная сумма, сгенерированная для базового сообщения, которое отправляется вместе с сообщением для обеспечения аутентификации сообщения.
Процесс использования MAC для аутентификации изображен на следующей иллюстрации —

В Java класс Mac пакета javax.crypto обеспечивает функциональность кода аутентификации сообщений. Следуйте приведенным ниже инструкциям, чтобы создать код аутентификации сообщения с использованием этого класса.
Шаг 1. Создайте объект KeyGenerator
Класс KeyGenerator предоставляет метод getInstance (), который принимает переменную String, представляющую требуемый алгоритм генерации ключей, и возвращает объект KeyGenerator, который генерирует секретные ключи.
Создайте объект KeyGenerator, используя метод getInstance (), как показано ниже.
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
Шаг 2: Создайте объект SecureRandom
Класс SecureRandom пакета java.Security предоставляет мощный генератор случайных чисел, который используется для генерации случайных чисел в Java. Создайте этот класс, как показано ниже.
//Creating a SecureRandom object SecureRandom secRandom = new SecureRandom();
Шаг 3: Инициализируйте KeyGenerator
Класс KeyGenerator предоставляет метод с именем init (), этот метод принимает объект SecureRandom и инициализирует текущий KeyGenerator .
С помощью этого метода инициализируйте объект KeyGenerator, созданный на предыдущем шаге.
//Initializing the KeyGenerator keyGen.init(secRandom);
Шаг 4: Генерация ключа
Сгенерируйте ключ с помощью метода generateKey () класса KeyGenerator, как показано ниже.
//Creating/Generating a key Key key = keyGen.generateKey();
Шаг 5: Инициализируйте объект Mac
Метод init () класса Mac принимает объект Key и инициализирует текущий объект Mac, используя заданный ключ.
//Initializing the Mac object mac.init(key);
Шаг 6: Завершите операцию Mac
Метод doFinal () класса Mac используется для завершения операции Mac. Передайте в этот метод необходимые данные в виде байтового массива и завершите операцию, как показано ниже.
//Computing the Mac
String msg = new String("Hi how are you");
byte[] bytes = msg.getBytes();
byte[] macResult = mac.doFinal(bytes);
пример
В следующем примере демонстрируется генерация кода аутентификации сообщений (MAC) с использованием JCA. Здесь мы берем простое сообщение «Привет, как дела» и генерируем Mac для этого сообщения.
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
public class MacSample {
public static void main(String args[]) throws Exception{
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();
//Initializing the KeyGenerator
keyGen.init(secRandom);
//Creating/Generating a key
Key key = keyGen.generateKey();
//Creating a Mac object
Mac mac = Mac.getInstance("HmacSHA256");
//Initializing the Mac object
mac.init(key);
//Computing the Mac
String msg = new String("Hi how are you");
byte[] bytes = msg.getBytes();
byte[] macResult = mac.doFinal(bytes);
System.out.println("Mac result:");
System.out.println(new String(macResult));
}
}