2010-09-21 9 views
13

Ho un sistema incorporato. Quello che mi piacerebbe che facesse quando si accende o resetta in altro modo, è quello di generare un ID univoco, in modo che su diversi riavvii venga generato un ID univoco diverso con alta probabilità.sorgenti di "unicità"/entropia su sistemi embedded

Non ha accesso a un orologio in tempo reale, ma ha accesso a un ADC e un UART. Mi chiedo se ci sia un modo decente di raccogliere entropia da queste fonti per generare un ID univoco. Sono vagamente familiare con Yarrow. C'è un buon modo per usarlo?

Purtroppo non ho sorgenti di rumore con caratteristiche prevedibili; l'ADC è collegato a un numero di ingressi relativamente a basso rumore, quindi suppongo che potrei semplicemente usare i bit meno significativi dell'ADC come input.

modifica: per quello che vale, questo è il processore TI TMS320F28335.


aggiornamento/precisazione: ero alla ricerca di un metodo in software di raccolta di entropia. Ho trovato un altro modo per risolvere il mio problema, ma in un certo senso, la mia domanda era discutibile, ma sto ancora cercando indicazioni su soluzioni software specifiche per raccogliere entropia da fonti a bassa entropia come bit meno significativi di l'ADC e il tempo di sistema per la ricezione dei caratteri UART.

+0

quale processore? Potrebbero esserci alcune opzioni specifiche per il chip ... – dls

+0

È possibile aggiungere hardware personalizzato alla porta ADC? Se è così, puoi aggiungere un generatore di rumore zener diodi lì. http://electronicdesign.com/article/test-and-measurement/wide-band-analog-white-noise-generator6356.aspx – Rudi

+0

no, l'hardware è fisso. Stai parlando di sorgenti di rumore hardware di alta qualità e io non ne ho. –

risposta

10

ho usato:

  • il bit più basso di un ingresso ADC galleggiante, ma hai toccato su quel

  • un timer estremamente ad alta risoluzione (~ 10ns), e portato il più basso "n" bit quando cronometrano tra i tasti premuti dall'utente. Se accetti che i tasti utente (con la massima risoluzione temporale) siano effettivamente casuali nella loro tempistica, funziona piuttosto bene.

Si potrebbe anche tempo le cose come il tempo tra i pacchetti di rete, ecc, ma questi possono essere molto più deterministica/prevedibile di quello che un sacco di gente cosa. Il rumore elettrico e l'interazione dell'utente sono migliori fonti di entropia.

A proposito, sui "tempi tra i tasti", tendo a memorizzarli su un sistema embedded a partire dall'accensione, in un buffer circolare degli ultimi 8 o giù di lì, perché non si sa mai quando si " avremo bisogno di loro. (INOLTRE: Non aspettare che ti servano i bit casuali e quindi costringi l'utente a premere i pulsanti 3 volte!)

0

Minore aggiunta alla risposta di Dan sopra ... Se il tuo sistema include una sorta di radio tu può prendere una lettura RSSI.

3

Dipende:

  • Quale grado di unicità vuoi?
  • C'è memoria non volatile?
  • Quanto tempo hai bisogno di una risposta?

Se si dispone di flash/NVRAM/disco, leggere il seed casuale, incrementarlo e riscriverlo. Il seed può essere un semplice contatore se non si richiede l'univocità tra i dispositivi/reflashing/batteria NVRAM in esaurimento.Se vuoi unicità, una volta che hai raccolto abbastanza "entropia", riscrivi il seme.

(Ovviamente si potrebbe desiderare di fare qualcosa di diverso se si sta utilizzando il flash e il controller Flash non dispone di wear-leveling, o implementare il proprio wear-leveling.)

Se non lo fai, quindi raccogli entropia da tutte le fonti che puoi, e genera l'UUID solo dopo che hai abbastanza entropia. Zvi Gutterman (2006) nota che l'unica fonte di entropia di OpenWRT è l'accesso alla rete, che è facilmente osservabile.

Uso dell'uscita ADC sembra ragionevole, con alcune semplici linee guida:

  • utilizzare tutti i bit (o almeno più bit vostra stima entropia), ma aumentare la vostra stima entropia conservativo.
  • L'uscita ADC ha entropia pari a zero quando è tagliata (e possibilmente un'entità bassa quando è quasi tagliata).

Misurare la quantità di rumore sull'ingresso. Sospetto che otterrai almeno un bit per campione. Quindi elimina i tuoi bit e genera un UUID versione 4.

1

Ho fatto qualcosa similar to Dan's answer. Ho avuto un buffer in memoria non volatile con la differenza del timer utilizzando un timer ad alta risoluzione (20ns) tra le sequenze di tasti utente contenenti gli ultimi 256 battiti di tastiera. Quindi computo un CRC a 32 bit per ottenere un numero univoco ogni volta che si accende il sistema. Alcune versioni senza interazione dell'utente hanno misurato il tempo intercorso tra il messaggio ricevuto sulle porte seriali

Questi numeri univoci sono stati utilizzati come identificatori di nodo su una rete e non si sono mai verificati problemi con i duplicati.

Questo è stato successivamente aumentato con un DS2401 che ha fornito un ID persistente ma univoco ma questo funzionerebbe solo per te se è possibile modificare l'hardware.

2

Vedere anche Fortuna, descritto in Crittografia pratica di Niels Ferguson e Bruce Schneier. Sebbene, sia Yarrow che Fortuna potrebbero essere troppo pesanti per un sistema embedded.

A differenza di Yarrow, Fortuna non richiede di stimare l'entropia delle fonti casuali.

Problemi correlati