В прошлой статье мы попытались обобщить знания об устройстве и функционировании микросхемы ATSHA204A и создать прототип системы аутентификации «база — датчик». Мы разобрали пример построения и код базового блока, в этой статье мы завершим построение системы аутентификации и создадим и разберём работу кода датчика.
Задача аутентификации
Как вы помните из предыдущей статьи, нам нужно разработать систему в которой «база» (базовый контроллер) при общении с «датчиком» сможет однозначно распознать, что ответ на запрос пришёл именно от «родного» датчика (принадлежащего нашей экосистеме, а не поддельного).
Базовый контроллер посылает запрос на датчик, а датчик формирует ответ по которому база может однозначно определить, что он пришёл от «легитимного» устройства нашей экосистемы. Вся криптографическая часть проекта обеспечивается микросхемой ATSHA204A.
Обратите внимание: пример, рассматриваемый в данной статье, может использоваться в реальных проектах, но только как одна из частей крипто-архитектуры системы. В реальных проектах, параллельно с задачей аутентификации устройств, нужно решать ещё множество других задач по обеспечению безопасного обмена информацией.
Крипто-архитектура
Напомним ещё раз крипто-архитектуру нашего проекта:
Базовый блок и датчик содержат в своём составе идентично запрограммированные микросхемы ATSHA204A (сам процесс работы с микросхемами ATSHA204A и их программирования подробно описаны в этом цикле статей).
Базовый блок и датчик имеют у себя на борту чипы ATSHA204A и в каждый чип заранее зашит одинаковый секретный ключ.
Микросхемы ATSHA204A имеют встроенный генератор случайных чисел. В нашем примере чип ATSHA204A базового блока генерирует случайное число и подаёт его на вход как своего блока вычисления хеш-функции SHA-256, так и передаёт контроллеру для отсылки удалённому датчику, который имеет такой же блок хеширования и такой же секретный ключ внутри своего чипа ATSHA204A.
В результате обе микросхемы ATSHA204A вычисляют хеш на основе случайного числа и секретного ключа (зашитого в микросхемы и недоступного для чтения извне) и датчик отсылает его (хеш) обратно базовому блоку для сравнения. Далее на базовом блоке происходит сравнение хешей и принимается решение о верификации («легитимности») или не верификации датчика.
Поскольку секретный ключ хранится в микросхемах ATSHA204A, недоступен злоумышленнику и не передаётся по сети, то злоумышленник не может подделать ответ датчика на произвольное случайное число, присылаемое базовым блоком. Таким образом происходит проверка на «легитимность» удалённого датчика.
Датчик нашей экосистемы
Теперь переходим с созданию и описанию работы скетча датчика (нашей экосистемы).
Мы имеем запрограммированную микросхему ATSHA204A (2 идентично запрограммированных экземпляра — один для базы и другой для датчика) в Data зоне которой содержатся секретные 32-байтовые ключи, 13 из которых недоступны для чтения извне.
Как и на базе, в датчике используется нулевой (0) слот зоны данных (Data Zone), который содержит 32 байта со значениями 0x00 (в вашем реальном проекте этот ключ будет содержать другую информацию). Нулевой слот в нашей конфигурации ATSHA204A недоступен для чтения извне и, даже украв ваш датчик, злоумышленник не сможет извлечь из ATSHA204A ваш секретный ключ и не сможет клонировать ваши датчики.
Алгоритм работы схемы аутентификации датчика несколько отличается от алгоритма работы базы. На базе мы генерировали секретный ключ и вычисляли его SHA хеш, используя секретный ключ из нулевого слота Data зоны нашей микросхемы ATSHA204A.
На датчике мы не генерируем случайное число, а получаем его от базы, используя любой вид и канал связи между контроллерами (в соответствии с вашим проектом). А затем уже вычисляем SHA хеш полученного случайного числа с использованием секретного ключа из нулевого слота Data зоны нашей идентично (с базой) запрограммированной микросхемы ATSHA204A.
Алгоритм работы нашей системы аутентификации на стороне датчика можно описать следующим образом:
- Датчик принимает от базы тестовое случайное число
- Вычисляет SHA хеш на основе полученного числа и ключа из своего экземпляра ATSHA204A
- Отсылает вычисленный хеш обратно на базу
На стороне базы:
- База сравнивает хеши и принимает решение о «легитимности» датчика
Теперь код датчика, который на основе полученного случайного числа вычисляет хеш (как уже было отмечено ранее, без функций реализации транспорта передачи и приёма информации, специфичного для вашего конкретного проекта).
/* ATSHA204A Project (Sensor) */ #include <sha204_library.h> const int sha204Pin = A3; byte rnd[MAC_CHALLENGE_SIZE] = { 0x23, 0x47, 0x3B, 0x1D, 0x89, 0xEA, 0x07, 0x80, 0x07, 0x5A, 0xEE, 0xD9, 0xEC, 0x8D, 0xF5, 0x68, 0x88, 0xAC, 0x3B, 0x36, 0x50, 0xF4, 0x03, 0xA4, 0xDF, 0xB3, 0x38, 0xA7, 0x16, 0xBA, 0x4A, 0xF5 }; byte challenge[MAC_CHALLENGE_SIZE]; byte hash[MAC_CHALLENGE_SIZE]; byte retCode = 0; atsha204Class sha204(sha204Pin); void setup() { Serial.begin(115200); Serial.println("ATSHA204 Project (Sensor) start..."); getRandom(); Serial.println("Random:"); printArray(challenge, 32); Serial.println(); macChallenge(); Serial.println("Hash:"); printArray(hash, 32); Serial.println(); } // Print void printArray(byte arr[], byte len) { for (byte i = 0; i < len; i++) { if (arr[i] < 16) {Serial.print('0');} Serial.print(arr[i], HEX); Serial.print(' '); } } // Random void getRandom() { for (byte i = 0; i < 32; i++) { challenge[i] = rnd[i]; } } // MAC void macChallenge() { uint8_t command[MAC_COUNT_LONG]; uint8_t response[MAC_RSP_SIZE]; retCode = sha204.sha204m_execute(SHA204_MAC, 0, 0, MAC_CHALLENGE_SIZE, (uint8_t *) challenge, 0, NULL, 0, NULL, sizeof(command), &command[0], sizeof(response), &response[0]); for (byte i = 0; i < 32; i++) { hash[i] = response[i]; } } void loop() { }
Подробный разбор его работы: вначале мы объявляем массив rnd, в который вносим случайное 32-байтовое число, сгенерированное ATSHA204A микросхемой базы на прошлом уроке. В вашем реальном проекте это (в данном случае тестовое) число ваш датчик должен получить от базы.
byte rnd[MAC_CHALLENGE_SIZE] = { 0x23, 0x47, 0x3B, 0x1D, 0x89, 0xEA, 0x07, 0x80, 0x07, 0x5A, 0xEE, 0xD9, 0xEC, 0x8D, 0xF5, 0x68, 0x88, 0xAC, 0x3B, 0x36, 0x50, 0xF4, 0x03, 0xA4, 0xDF, 0xB3, 0x38, 0xA7, 0x16, 0xBA, 0x4A, 0xF5 };
Далее объявляем два массива для хранения случайного 32-байтового числа и SHA хеша.
byte challenge[MAC_CHALLENGE_SIZE]; byte hash[MAC_CHALLENGE_SIZE];
Затем при помощи функции getRandom() получаем 32-байтовое случайное число в массив challenge. В вашем реальном проекте это число будет браться не из массива rnd, а приходить по сети от базы. Как уже было отмечено ранее, проводных и беспроводных способов передачи данных существует великое множество и конкретная реализация процедуры обмена ими зависит от специфики вашего проекта.
void getRandom() { for (byte i = 0; i < 32; i++) { challenge[i] = rnd[i]; } }
Далее на основе полученного случайного числа (находящегося в массиве challenge) и секретного ключа из нулевого слота Data зоны нашей микросхемы ATSHA204A вычисляем SHA хеш.
void macChallenge() { uint8_t command[MAC_COUNT_LONG]; uint8_t response[MAC_RSP_SIZE]; retCode = sha204.sha204m_execute(SHA204_MAC, 0, 0, MAC_CHALLENGE_SIZE, (uint8_t *) challenge, 0, NULL, 0, NULL, sizeof(command), &command[0], sizeof(response), &response[0]); for (byte i = 0; i < 32; i++) { hash[i] = response[i]; } }
И помещаем его в массив hash.
for (byte i = 0; i < 32; i++) { hash[i] = response[i]; }
Который наш датчик должен отослать обратно на базу для сравнения его с хешем, вычисленным на базе, а пока мы выводим случайное число и полученный хеш на печать.
Serial.println("Random:"); printArray(challenge, 32); Serial.println(); macChallenge(); Serial.println("Hash:"); printArray(hash, 32); Serial.println();
Вот результат работы нашего скетча:
Как вы видите, вычисленные SHA хеши на базе и датчике совпадают и база может сделать уверенный вывод о том, что датчик, приславший ответ, является «легитимным» контроллером нашей экосистемы. Уверенность этому решению придаёт то, что вычислить правильный хеш в ответ на случайное число можно только имея доступ к секретному ключу в Data зоне (запрограммированной нами) микросхемы ATSHA204A.
Заключение
Мы успешно построили прототип системы аутентификации «база — датчик» на основе специализированной крипто-микросхемы ATSHA204A. Как вы понимаете, это только один из простых (но чрезвычайно полезный) пример использования ATSHA204 и эта микросхема содержит ещё множество полезных функций, которые вы можете использовать в своих проектах.
Ссылки по теме
ATSHA204 - Библиотека и примеры
ATSHA204A - Чтение зоны конфигурации 1
ATSHA204A - Чтение зоны конфигурации 2
ATSHA204A - Чтение зоны конфигурации 3
ATSHA204A - Запись конфигурации 1
ATSHA204A - Запись конфигурации 2
ATSHA204A - Запись конфигурации 3
ATSHA204A - Запись конфигурации 4
ATSHA204A - Работа в режиме Config Lock
ATSHA204A - Работа с зонами памяти
ATSHA204A - Чтение Data и OTP зон памяти
ATSHA204A - Аутентификация. Базовый блок
ATSHA204A - Криптография и команды
ATSHA204A - nRF24 аутентификация. База
ATSHA204A - nRF24 аутентификация. Датчик