Информационный портал по безопасности » Железо » Сделай Сам » Делаем свой «умный дом» чуть более безопасным

 

Делаем свой «умный дом» чуть более безопасным

Автор: admin от 8-06-2015, 17:55, посмотрело: 968

В посленее время мир «умного дома» стал более близок для начинающих энтузиастов, благодаря наличию большого количества аппаратных решений с низким порогом вхождения (речь конечно про платформу Arduino и немалому набору модулей/сенсоров для неё) и уже готовых библиотек и фреймворков для работы с ними. Как правило они имеют настройки по-умолчанию (мак-адреса, каналы и т.п.), которые нетронутыми и остаются в руках этих самых начинающих… Например фреймворк MySensors, упоминавщийся не так давно на Хабре, имеет файл настроек «MyConfig.h», который многие (мой незадачливый сосед в частности) даже не правят.

С одной стороны мне все равно, что в многоэтажном доме кто-то сможет «подслушать» температуру на кухне (а то и позвонить с вопросом «Что готовишь?»), но с другой стороны не хотелось бы, чтобы кто-то смог (хоть бы и теоретически) управлять силовыми нагрузками (включить любимую кофе-машину, например). Хочется быть чуть более уверенным, что комманда исходит от моего управляющего устройства, а не подставного (в криптографии, это известно как «проверка подлинности»).

Реализовать такой подход сравнительно просто…

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

Делаем свой «умный дом» чуть более безопасным

Реализовать можно с помощью трех функций. Одна для генерации случайной фразы:

byte alphabet[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a }; // a, b, c, d, etc

void getPhrase(byte *phrase) {
	for (int i = 0; i < 8; i++) {
		phrase[i] = alphabet[random(0, 26)];
		phrase[i + 1] = '';
	}
}


Вторая собственно создание MD5-хеша (MD5 library for the Arduino):

#include <MD5.h>

byte sessionPhrase[9];
byte salt[] = { 0x4c, 0x39, 0x78, 0x36, 0x73, 0x4c, 0x39, 0x78 }; // L9x6sL9x - внутренний ключ

void signPhrase(byte *phrase, char *signedPhrase) {
	byte localPhrase[17];
	for (int i = 0; i < 16; i++) {
		if (i < 8) localPhrase[i] = salt[i];
		else localPhrase[i] = sessionPhrase[i - 8];
		localPhrase[i + 1] = '';
	}

	unsigned char* hash = MD5::make_hash((char *)localPhrase);
	char *md5str = MD5::make_digest(hash, 16);

	for (int i = 0; i < 16; i++) {
		signedPhrase[i] = md5str[i];
		signedPhrase[i + 1] = '';
	}

	free(hash);
	free(md5str);
}


Третья для сверки «подписанной» фразы инициатора с «самоподписанной» фразой исполнителя:

bool compareSignedPhrases(char *signedPhrase) {
	if (strcmp(signedPhrase, (char *)sessionMD5Phrase) == 0) {
		return true;
	}
	return false;
}




Такой подход можно исполнять как в своих “велосипедах», так и в других фреймворках (таких как MySensors) и дает дополнительный плюсик к безопасности Вашего Интернета вещей.

[i]Кстати, аутентификация будет в MySensors, на текущий момент она реализована в development-версии.[/i]

P.S.: Если будет интересно сообществу — сделаю update заметки на примере того же MySensors с примерами листингов для Serial Gateway и Relay…

Источник: Хабрахабр

Категория: Железо / Сделай Сам

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
  • bowtiesmilelaughingblushsmileyrelaxedsmirk
    heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
    winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
    worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
    expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
    disappointedconfoundedfearfulcold_sweatperseverecrysob
    joyastonishedscreamtired_faceangryragetriumph
    sleepyyummasksunglassesdizzy_faceimpsmiling_imp
    neutral_faceno_mouthinnocent