Источники "уникальности" /энтропии на встроенных системах
У меня встроенная система. То, что я хотел бы сделать, когда он активирует или иным образом сбрасывает, заключается в создании уникального идентификатора, так что при разных перезапусках с высокой вероятностью генерируется другой уникальный идентификатор.
У него нет доступа к часам реального времени, но он имеет доступ к АЦП и UART. Мне интересно, есть ли достойный способ собрать энтропию из этих источников, чтобы создать уникальный идентификатор. Я смутно знаком с Yarrow. Есть ли хороший способ использовать это?
К сожалению, у меня нет источников шума предсказуемых характеристик; АЦП подключен к нескольким относительно малошумящим входам, поэтому, я полагаю, я мог бы использовать наименее значимые биты АЦП в качестве входных данных.
изменить: для чего это стоит, это процессор TI TMS320F28335.
обновление/уточнение: Я искал метод в программном обеспечении сбора энтропии. Я нашел другой способ решить мою проблему, поэтому в некотором роде мой вопрос был спорным, но я все еще ищу руководство по <сильным > специальным программным решениям для сбора энтропии из источников с низкой энтропией, значащие биты АЦП и системного времени для приема символов UART.
Ответы
Ответ 1
Я использовал:
-
младший бит плавающего входа АЦП, но вы коснулись этого
-
таймер с очень высоким разрешением (~ 10 нс) и взял младшие "n" биты при синхронизации между нажатиями кнопок пользователя. Если вы согласны с тем, что пользовательские нажатия клавиш (с наивысшим временным разрешением) являются случайными по времени, это работает очень хорошо.
Вы также можете использовать такие моменты, как время между сетевыми пакетами и т.д., но это может быть намного более детерминированным/предсказуемым, чем то, что много людей. Электрические шумы и взаимодействие с пользователем являются лучшими источниками энтропии.
Кстати, в материалах "таймингов между нажатиями клавиш" я стараюсь хранить их во встроенной системе, начиная с включения питания, в круговом буфере последних 8 или около того, потому что вы никогда не знаете, когда вы они будут нуждаться в них. (Иными словами: не ждите, пока вам не понадобятся случайные биты, а затем заставите пользователя нажимать кнопки 3 раза!)
Ответ 2
Это зависит:
- Какую степень уникальности вы хотите?
- Есть ли какое-либо энергонезависимое хранилище?
- Как скоро вам нужен ответ?
Если у вас есть Flash/NVRAM/диск, прочитайте свое случайное семя, увеличьте его и запишите. Семя может быть простым счетчиком, если вы не требуете уникальности между устройствами/reflashing/батареей NVRAM. Если вы хотите уникальность, то, как только вы соберете энтропию "достаточно", перепишите семя.
(Очевидно, что вы можете захотеть сделать что-то еще, если используете вспышку, а ваш контроллер вспышки не имеет износостойкости или не реализует собственный уровень износа.)
Если вы этого не сделаете, то собирайте энтропию из всех источников, которые вы можете, и генерируете только UUID после того, как у вас достаточно энтропии. Zvi Gutterman (2006) отмечает, что единственным источником энтропии OpenWRT является доступ к сети, что легко заметить.
Использование выхода АЦП представляется разумным, с некоторыми простыми рекомендациями:
- Используйте все биты (или, по крайней мере, больше бит, чем ваша оценка энтропии), но консервативно оценивайте свою энтропийную оценку.
- Выход ADC имеет нулевую энтропию при обрезании (и, возможно, низкой энтопии, когда она почти обрезана).
Измерьте количество шума на входе. Я подозреваю, что вы получите хотя бы один бит на образец. Затем хешируйте ваши биты и сгенерируйте UUID версии 4.
Ответ 3
См. также Fortuna, описанный в Практической криптографии Нильса Фергюсона и Брюса Шнайера. Хотя, как Yarrow, так и Fortuna могут быть слишком тяжелыми для встроенной системы.
В отличие от Yarrow, Fortuna не требует, чтобы вы оценивали энтропию ваших случайных источников.
Ответ 4
Я сделал что-то похожее на ответ Дэна. У меня был буфер в энергонезависимой памяти с разницей таймера с помощью таймера высокого разрешения (20 нс) между нажатиями клавиш пользователя, содержащими последние 256 нажатий клавиш. Затем я вычисляю 32-битный CRC, чтобы получить уникальный номер каждый раз, когда система включена. Некоторые версии без взаимодействия с пользователем измеряли время между сообщением, полученным на последовательных портах
Эти уникальные числа использовались как идентификаторы node в сети, и никогда не возникало проблем с дубликатами.
Впоследствии это было расширено с помощью DS2401, который предоставил постоянный, но уникальный идентификатор, но это будет работать только для вас, если вы можете изменить аппаратное обеспечение,
Ответ 5
Незначительное дополнение к ответу Дэн выше... Если в вашей системе есть какое-то радио, вы можете прочитать RSSI.