источники "уникальности" / энтропии на встроенных системах - PullRequest
14 голосов
/ 22 сентября 2010

У меня есть встроенная система. То, что я хотел бы сделать, когда он включается или иным образом сбрасывается, - это генерировать уникальный идентификатор, чтобы при разных перезапусках генерировался другой уникальный идентификатор с высокой вероятностью.

У него нет доступа к часам реального времени, но есть доступ к АЦП и UART. Мне интересно, есть ли достойный способ собрать энтропию из этих источников для генерации уникального идентификатора. Я смутно знаком с Ярроу . Есть ли хороший способ использовать это?

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

edit: что стоит, это процессор TI TMS320F28335.


обновление / уточнение: Я искал метод в программном обеспечении сбора энтропии. Я нашел другой способ решения своей проблемы, поэтому мой вопрос был спорным, но я все еще ищу рекомендации по специальным программным решениям для сбора энтропии с низкой источники энтропии, такие как младшие разряды АЦП и системное время для приема символов UART.

Ответы [ 5 ]

11 голосов
/ 22 сентября 2010

Я использовал:

  • младший бит плавающего входа АЦП, но вы касались этого

  • чрезвычайно высокийтаймер разрешения (~ 10 нс) и самые младшие «n» биты при синхронизации между нажатиями клавиш пользователя.Если вы согласны с тем, что нажатия клавиш пользователя (с самым высоким временным разрешением) являются практически случайными по времени, это работает довольно хорошо.но они могут быть намного более детерминированными / предсказуемыми, чем многие люди.Электрические шумы и взаимодействие с пользователем являются лучшими источниками энтропии.

    Кстати, что касается «временных интервалов между нажатиями клавиш», я склонен хранить их во встроенной системе, начиная с включения, в круговом буферепоследние 8 или около того, потому что вы никогда не знаете, когда они вам понадобятся.(Другими словами: не ждите, пока вам понадобятся случайные биты, а затем заставьте пользователя нажимать кнопки 3 раза!)

3 голосов
/ 27 сентября 2010

Это зависит от:

  • Какую степень уникальности вы хотите?
  • Есть ли энергонезависимая память?
  • Как скоро вам нужен ответ?

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

(Очевидно, вы можете захотеть сделать что-то еще, если используете вспышку, а ваш контроллер вспышки не изнашиваетсяВыровняйте или примените собственное выравнивание износа.)

Если вы этого не сделаете, то соберите энтропию из всех возможных источников, и генерируйте UUID только после того, как у вас будет достаточно энтропии , Zvi Gutterman (2006) отмечает, что единственным источником энтропии OpenWRT является доступ к сети, который легко наблюдать.

Использование вывода АЦП представляется разумным, с некоторыми простыми рекомендациями:

  • Используйте все биты (или, по крайней мере, больше битов, чем ваша оценка энтропии), но увеличивайте свою оценку энтропии консервативно.
  • Выход АЦП имеет нулевую энтропию при обрезании (и, возможно, низкую энтопию, когда почти обрезается).

Измерьте количество шума на входе.Я подозреваю, что вы получите по крайней мере один бит за образец.Затем хэшируйте свои биты и генерируйте UUID версии 4.

2 голосов
/ 29 декабря 2010

См. Также Фортуна , описанная в Практическая криптография Нильсом Фергюсоном и Брюсом Шнайером. Хотя и Ярроу, и Фортуна могут быть слишком тяжелыми для встраиваемой системы.

В отличие от Ярроу, Фортуна не требует от вас оценивать энтропию ваших случайных источников.

1 голос
/ 28 сентября 2010

Я сделал что-то похожее на ответ Дэна . У меня был буфер в энергонезависимой памяти с разницей таймеров, использующей таймер высокого разрешения (20 нс) между нажатиями клавиш пользователя, содержащий последние 256 нажатий клавиш. Затем я вычисляю 32-битный CRC для получения уникального числа при каждом включении системы. Некоторые версии без взаимодействия с пользователем измеряли время между сообщениями, полученными по последовательным портам

Эти уникальные номера использовались в качестве идентификаторов узлов в сети, и никогда не было проблем с дубликатами.

Позже он был дополнен DS2401 , который предоставлял постоянный, но уникальный идентификатор, но это сработало бы только для вас, если вы можете изменить оборудование.

0 голосов
/ 22 сентября 2010

Незначительное дополнение к ответу Дэна выше ... Если в вашей системе есть какое-то радио, вы можете прочитать RSSI.

...