Шифрование и безопасность_Углубленное понимание алгоритма Hmac (код аутентификации сообщения)
Шифрование и безопасность_Углубленное понимание алгоритма Hmac (код аутентификации сообщения)

Pre

Шифрование и безопасность_Углубленное понимание алгоритмов хешированияв мы упомянули,

При хранении хешированного пароля пользователя его необходимо хранить с солью, чтобы противостоять атакам радужной таблицы.

Язык кода:javascript
копировать
digest = hash(input)

Именно потому, что одни и те же входные данные будут давать одинаковый результат, цель добавления соли состоит в том, чтобы изменить входные данные:

Язык кода:javascript
копировать
digest = hash(salt + input)

Эту соль можно рассматривать как дополнительный «код аутентификации». Один и тот же вход, но разные коды аутентификации будут давать разные выходные данные. Поэтому для проверки выходного хеша необходимо также предоставить «код аутентификации».

Алгоритм Hmac — это алгоритм кода аутентификации сообщений на основе ключей. Его полное название — на основе хэша. Message Authentication Код, более безопасный алгоритм дайджеста сообщений.

Алгоритм Hmac всегда используется в сочетании с каким-либо алгоритмом хеширования. Например, мы используем алгоритм MD5, который соответствует алгоритму HmacMD5, эквивалентному «соленому» MD5:

Язык кода:javascript
копировать
HmacMD5 ≈ md5(secure_random_key, input)

Обзор HMAC

Алгоритм HMAC (код аутентификации сообщения на основе хэша) — это алгоритм кода аутентификации сообщения, основанный на хэш-функции, используемый для проверки целостности сообщения и аутентификации отправителя сообщения. Он сочетает в себе хеш-функцию и ключ для генерации кода аутентификации сообщения путем хеширования ключа с сообщением.

Процесс расчета HMAC выглядит следующим образом:

  1. Сначала выберите подходящую хеш-функцию (например, MD5, SHA-1, SHA-256 и т. д.) и ключ.
  2. Ключ дополняется и обрабатывается соответствующим образом, чтобы соответствовать требованиям хеш-функции к длине входных данных.
  3. Объедините сообщение и дополненную клавишу определенным образом.
  4. Хешируйте объединенные данные.
  5. Выведите результат хеширования в виде кода аутентификации сообщения.

После получения сообщения получатель также будет использовать тот же ключ и хэш-функцию для расчета значения HMAC сообщения и сравнения его со значением HMAC, отправленным отправителем. Если они совпадают, сообщение является полным и пришло от законного отправителя; в противном случае может возникнуть риск того, что сообщение было подделано или пришло от неавторизованного отправителя;


С точки зрения непрофессионала, алгоритм HMAC похож на «аутентификатор пароля», который гарантирует, что данные не будут подделаны во время передачи.

Представьте, что вы хотите отправить письмо другу, но беспокоитесь, что его кто-то подделал. Вы можете использовать HMAC для решения этой проблемы. Сначала вы поставите свою подпись на конверте. Но на этот раз вместо подписи ручкой используется специальная техника генерации «ключа». Этот ключ подобен вашему личному паролю, известному только вам и вашим друзьям.

Затем вы отправляете эту подпись вместе с письмом. После того, как ваш друг получит письмо, он тоже узнает ключ. Он снова сгенерирует подпись, используя тот же метод, а затем сравнит ее с отправленной вами подписью. Если обе подписи одинаковы, это означает, что письмо не было подделано, поскольку этот специальный «пароль» знаете только вы и ваш друг.

Таким образом, HMAC обеспечивает целостность и безопасность данных посредством механизма проверки двойного «пароля». Алгоритм HMAC обладает высокой безопасностью и широким применением и часто используется в сетевой связи, передаче данных, цифровой подписи и других областях для обеспечения целостности и безопасности данных.


Общий алгоритм Hmac

Алгоритм HMAC (код аутентификации сообщения на основе хэша) можно использовать в сочетании со многими хеш-функциями. К наиболее часто используемым хеш-функциям относятся:

  1. HMAC-MD5: используйте хэш-функцию MD5 для генерации HMAC.
  2. HMAC-SHA1: сгенерируйте HMAC, используя хэш-функцию SHA-1.
  3. HMAC-SHA256: сгенерируйте HMAC, используя хэш-функцию SHA-256.
  4. HMAC-SHA512: сгенерируйте HMAC, используя хэш-функцию SHA-512.

Эти алгоритмы предоставляют различные варианты хеш-функций, и соответствующий алгоритм может быть выбран на основе требований безопасности и соображений производительности. Обычно новые алгоритмы SHA-256 и SHA-512 считаются более безопасными, чем MD5 и SHA-1, и поэтому чаще используются в сценариях с более высокими требованиями безопасности.


Code

Генерация случайных ключей KeyGenerator

ИспользуяJavaв стандартной библиотекеKeyGeneratorгенерировать Безопасностьслучайныхключ,может гарантироватьключслучайныхсекси Безопасностьсекс,Тем самым повышая безопасность алгоритма шифрования.

KeyGenerator类提供了генерироватьверно称ключфункция,может быть указано в соответствии салгоритми Безопасность随机数генерировать器来генерироватьключ。Обычно,Можно использовать

  • KeyGenerator.getInstance(String algorithm)метод полученияKeyGeneratorПример,
  • а затем использоватьKeyGenerator.init(int keysize)Спецификация методаключдлина,
  • наконец прошлоKeyGenerator.generateKey()методгенерироватьключ。

这样генерироватьизключ通常会具有足够длинаи随机секс,Защищает от распространенных атак с использованием паролей.,Например, полный поиск и атака по словарю. поэтому,использоватьJavaв стандартной библиотекеKeyGeneratorгенерировать Безопасностьслучайныхключ Это рекомендуемая практика,Помогает улучшить безопасность системы.

HmacMD5

HmacMD5можно рассматривать как наличие БезопасностьизkeyизMD5。использоватьHmacMD5вместо использованияMD5добавлятьsalt,Он имеет следующие преимущества:

  • HmacMD5использоватьизkeyДлина64байт,Даже Безопасность;
  • Hmacэто стандарталгоритм,То же самое относится и к другим хэшам, таким как алгоритм SHA-1;
  • Hmacвыходи原有из Хэшалгоритм Одинаковая длина。

Видно, что Hmac по сути представляет собой алгоритм, который смешивает ключи в дайджесты. При проверке этого хэша помимо исходных входных данных необходимо указать еще и ключ.

Язык кода:javascript
копировать
package com.artisan.securityalgjava.hmac;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import java.math.BigInteger;

/**
 * @author маленький мастер
 * @version 1.0
 * @mark: show me the code , change the world
 */
public class HmacTest {

    public static void main(String[] args)  throws  Exception{
        // создавать KeyGenerator экземпляр и укажите алгоритм как HmacMD5
        KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");

        // Генерировать случайные ключи
        SecretKey key = keyGen.generateKey();

        // Распечатать случайно сгенерированные ключи
        byte[] skey = key.getEncoded();
        System.out.println("Случайно сгенерированный ключ:" + new BigInteger(1, skey).toString(16));

        // создавать Mac экземпляр и укажите алгоритм как HmacMD5
        Mac mac = Mac.getInstance("HmacMD5");

        // инициализация Mac Пример
        mac.init(key);

        // Обновить новости
        mac.update("HellArtisan".getBytes("UTF-8"));

        // вычислить HMAC ценить
        byte[] result = mac.doFinal();

        // Распечатать HMAC ценить
        System.out.println("HMAC ценить:" + new BigInteger(1, result).toString(16));
    }
}

использоватьJava标准库генерироватьHmacMD5алгоритмслучайныхключ,ивычислитьданное сообщение(“HellArtisan”)изHMACценить。


Используйте алгоритм Hmac для замены исходного пользовательского алгоритма засолки.

Мы можем использовать алгоритм Hmac для замены исходного пользовательского алгоритма засолки.,поэтому,Структура библиотеки данных, в которой хранятся имена пользователей и пароли, следующая:

Язык кода:javascript
копировать
| username | secret_key                        | password                              |
|----------|----------------------------------|---------------------------------------|
| bob      | a8c06e05f92e...5e16              | 7e0387872a57c85ef6dddbaa12f376de      |
| alice    | e6a343693985...f4be              | c1f929ac2552642b302e739bc0cdbaac      |
| tim      | f27a973dfdc0...6003              | af57651c3a8a73303515804d4af43790      |

В каждой строке содержится имя пользователя (username), случайно сгенерированный секрет (secret_key, длиной 64 байта) и хеш пароля (password), сгенерированный с помощью алгоритма Hmac. Ключ используется для расчета Hmac для обеспечения безопасности пароля.

Язык кода:javascript
копировать
package com.artisan.securityalgjava.hmac;

import java.util.Arrays;
import javax.crypto.*;
import javax.crypto.spec.*;

/**
 * HMACПример:использоватьпредварительно сгенерированный ключвычислитьHMACценить
 * @author artisan
 */
public class HmacVerifyTest {

    public static void main(String[] args) throws Exception {
        // предварительно сгенерированный ключ
        byte[] hkey = new byte[]{106, 70, -110, 125, 39, -20, 52, 56, 85, 9, -19, -72, 52, -53, 52, -45, -6, 119, -63,
                30, 20, -83, -28, 77, 98, 109, -32, -76, 121, -106, 0, -74, -107, -114, -45, 104, -104, -8, 2, 121, 6,
                97, -18, -13, -63, -30, -125, -103, -80, -46, 113, -14, 68, 32, -46, 101, -116, -104, -81, -108, 122,
                89, -106, -109};

        // создаватьSecretKeyобъект
        SecretKey key = new SecretKeySpec(hkey, "HmacMD5");

        // Получить Макэкземпляр и укажите алгоритм какHmacMD5
        Mac mac = Mac.getInstance("HmacMD5");

        // использоватьключинициализацияMacПример
        mac.init(key);

        // Обновить новости
        mac.update("HelloArtisan".getBytes("UTF-8"));

        // вычислитьHMACценить
        byte[] result = mac.doFinal();

        // РаспечататьHMACценить
        System.out.println(Arrays.toString(result));
        // [-22, 82, 110, 65, -70, -122, 93, 121, 48, 96, -40, -78, 126, 46, -47, 112]
    }
}
Язык кода:javascript
копировать
// создаватьSecretKeyобъект,использоватьпредварительно сгенерированный ключбайт数组иалгоритмимя"HmacMD5"
SecretKey key = new SecretKeySpec(hkey, "HmacMD5");

Функция этой строки кода — создать объект SecretKey, использовать предварительно созданный массив ключевых байтов (hkey) в качестве ключа и указать имя алгоритма как «HmacMD5».

это восстановлениеSecretKeyиз代码。


HmacMD5 VS MD5

По сравнению с прямым использованием алгоритма хеширования MD5, использование алгоритма HmacMD5 требует некоторых дополнительных шагов для генерации значения хеш-функции.

Вот шаги для генерации хеш-значения с использованием алгоритма HmacMD5:

  1. проходитьимя"HmacMD5"получатьKeyGeneratorПример。
  2. проходитьKeyGeneratorсоздаватьодинSecretKeyПример,этотключбудет использоваться дляинициализацияMacПример。
  3. проходитьимя"HmacMD5"получатьMacПример。
  4. использоватьSecretKeyинициализацияMacПример,以指定использоватьизключ。
  5. верноMacПример反复调использоватьupdate(byte[])входитьданные,可以多次调использоватьupdateметод以входитьданныеиз不同部分。
  6. 调использоватьMacПримеризdoFinal()методполучать最终из Хэшценить。

这些步骤确保了использоватьHmacMD5алгоритмгенерировать Хэшценить时из Безопасностьсекси正确секс。 HmacMD5алгоритмкомбинированныйMD5Хэшалгоритмиключ,Обеспечивает повышенную безопасность и защитные свойства.,Подходит для сценариев, где требуется проверка целостности сообщения и аутентификация личности.


HmacSHA256

https://github.com/aperezdc/hmac-sha256/blob/master/hmac-sha256.c

Язык кода:javascript
копировать
 package com.artisan.securityalgjava.hmac;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
/**
 * @author маленький мастер
 * @version 1.0
 * @mark: show me the code , change the world
 */


public class HmacSHA256Example {
    public static void main(String[] args) {
        // Новости для шифрования
        String message = "Hello, HMAC!";
        // ключ
        String key = "secretKey";

        try {
            // вычислитьHMAC-SHA256ценить
            byte[] result = calculateHmacSHA256(message, key);
            // Преобразовать массив байтов в шестнадцатеричную строку
            String hmacSHA256 = bytesToHex(result);
            // РаспечататьHMAC-SHA256ценить
            System.out.println("HMAC-SHA256: " + hmacSHA256);
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            e.printStackTrace();
        }
    }

    /**
     * вычислитьHMAC-SHA256ценить
     * @param message
     * @param key
     * @return
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     */
    public static byte[] calculateHmacSHA256(String message, String key)
            throws NoSuchAlgorithmException, InvalidKeyException {
        // создаватьHmacSHA256Пример
        Mac hmacSHA256 = Mac.getInstance("HmacSHA256");
        // создаватьключобъект
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA256");
        // использоватьключинициализацияMacПример
        hmacSHA256.init(secretKey);
        // вычислить消息изHMAC-SHA256ценитьи返回
        return hmacSHA256.doFinal(message.getBytes());
    }

    /**
     * Преобразовать массив байтов в шестнадцатеричную строку
     * @param bytes
     * @return
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuilder result = new StringBuilder();
        for (byte b : bytes) {
            result.append(String.format("%02x", b));
        }
        return result.toString();
    }
}

сначала определено Новости для шифрованияиключ。Затем,использоватьcalculateHmacSHA256методвычислить消息изHMAC-SHA256ценить。наконец,Волявычислить得到избайт数组转换成十六进制字符串,и Распечататьвыход。

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose