codiceotp - ElettronicaIn
Transcript
codiceotp - ElettronicaIn
Automazione SERRATURA CON CODICE OTP dell’ Ing. LUCA DENTELLA Realizziamo una serratura a comando elettrico che si apre grazie ad un codice, sempre diverso, generato dal nostro cellulare sulla base di un algoritmo che tiene conto dell’orario. S e siete clienti di una banca on-line, probabilmente già utilizzate un apparecchio chiamato “token” per accedere ai servizi di home-banking o per autorizzare le operazioni. Questi dispositivi, spesso simili a dei portachiavi, sono dotati di un display sul quale appare -ogni tot secondi o alla pressione di un tasto- un codice numerico sempre differente chiamato OTP (one-time password); il codice è tipo un rolling-code dei radiocomandi a elevata sicurezza e viene generato con un algoritmo pseudo-casuale che tiene conto anche del timestamp, ossia dell’orario attuale. Recen- temente hanno iniziato a diffondersi anche i soft-token, ovvero applicazioni per smartphone che generano i medesimi codici senza la necessità di avere con sè un ulteriore dispositivo fisico. Elettronica In ~ Marzo 2016 93 [schema ELETTRICO] tramite semplici modifiche allo sketch di Arduino, legare una serratura ad uno o più cellulari e modificarne il comportamento. IL CODICE OTP La generazione dei codici OTP parte da alcuni dati iniziali cui viene applicato un algoritmo, ovvero una serie di operazioni matematiche che trasformano tali dati in un codice numerico. L’algoritmo è deterministico: partendo dai medesimi dati iniziali, si ottiene sempre lo stesso codice. Perché il codice generato cambi, è quindi necessario che almeno uno dei dati di partenza sia variabile; allo scopo i token più diffusi utilizzano come dato variabile il numero di clic sul pulsante (quindi ad ogni pressione del pulsante viene generato un nuovo codice) oppure un valore legato a data e ora attuali. Non c’è normalmente comunicazione diretta tra chi genera i codici (nel nostro caso l’applicazione sul cellulare) e chi li valida (la serratura): la verifica del codice inserito avviene grazie al fatto che entrambi condividono gli stessi dati di partenza e lo stesso algoritmo e quindi possono, in ogni istante, generare il medesimo codice (vedi Fig. 1). Esistono diversi algoritmi per la generazione dei codici e alcuni produttori utilizzano, inoltre, sistemi chiusi, rendendo i propri token compatibili solo con applicazioni “certificate”. Per il nostro progetto, abbiamo deciso di adottare un algoritmo open, Il progetto che vi presentiamo in questo articolo vi consentirà di realizzare una serratura che può essere aperta inserendo, tramite un tastierino alfanumerico, un codice generato da un’applicazione presente sul vostro smartphone. Come vedremo sarà possibile, 94 Marzo 2016 ~ Elettronica In definito dalla specifica RFC6238 – “TOTP: Time-Based One-Time Password Algorithm” (https:// tools.ietf.org/html/rfc6238); in questo modo sarà possibile generare i codici da una qualsiasi applicazione o token fisico compatibile con tale specifica. L’algoritmo si basa su una chiave segreta (shared secret) e sul valore di timestamp Unix, ovvero il numero di secondi trascorsi dalla data Epoch, corrispondente alla mezzanotte del giorno 01/01/1970. Molto importante, lo vedremo nuovamente in seguito, è che tale timestamp sia espresso secondo il fuso orario UTC e che smartphone e serratura siano sincronizzati proprio con l’orario. Se ormai tutti i cellulari si mantengono sincronizzati automaticamente via Internet, per la nostra serratura sarà fondamentale avere a disposizione un “orologio” quanto più preciso possibile, che nello specifico otteniamo con un modulo RTC. Per generare dei codici che variano ogni n secondi, si divide il timestamp per la durata in secondi desiderata e si prende il solo quoziente della divisione: tale numero sarà costante per tutta la durata dell’intervallo. Nella Tabella 1 vediamo alcuni esempi per capire meglio il meccanismo. L’HARDWARE La serratura che realizzeremo sarà basata su una scheda Arduino, al quale applicheremo Tabella 1 Data e ora Unix timestamp Unix timestamp/30 01/01/2016 08:00:00 1451635200 48387840 01/01/2016 08:00:10 1451635210 48387840 01/01/2016 08:00:31 1451635231 48387841 01/01/2016 08:00:59 1451635259 48387841 01/01/2016 08:01:05 1451635265 48387842 uno shield cui collegheremo: • un tastierino alfanumerico a membrana per l’inserimento dei codici; • un display seriale per visualizzare lo stato della serratura e i codici inseriti; • un relé per attivare un carico esterno (ad esempio una elettroserratura) se il codice inserito è corretto; • un buzzer per generare segnalazioni acustiche; • due LED (uno rosso e l’altro verde) per visualizzare lo stato della serratura; • un RTC (real-time clock) per avere a disposizione sempre un valore di timestamp aggiornato e corretto; • una batteria tampone per alimentare l’RTC anche se la scheda non è alimentata. Per rendere più facile la realizzazione del progetto, abbiamo preparato uno shield che comprende tutti i componenti sopra elencati, il cui schema elettrico è illustrato in queste pagine. Il Real Time Clock è un integrato DS1307 della Maxim/Dallas e si avvale di un quarzo (Q1) da 32.768 kHz che fornisce la frequenza base per l’oscillatore interno; l’integrato è un contatore BCD che conta secondi, minuti, ore, giorni, mesi e anni, provvisto di 56 byte di RAM statica non volatile; il componente determina automaticamente quali sono i mesi con meno di 31 giorni e ad effettuare la correzione per l’anno bisestile. Fig. 2 Fig. 1 Listato 1 // configurazione della tastiera #define KEY_ROWS 4 #define KEY_COLUMNS 4 char keys[KEY_ROWS][KEY_COLUMNS] = { {‘1’,’2’,’3’,’A’}, {‘4’,’5’,’6’,’B’}, {‘7’,’8’,’9’,’C’}, {‘*’,’0’,’#’,’D’} }; byte rowPins[KEY_ROWS] = {5, 4, 3, 2}; byte colPins[KEY_COLUMNS] = {10, 9, 8, 7}; Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEY_ROWS, KEY_COLUMNS); L’orologio può operare nelle modalità 12 o 24 ore, con indicazione delle ore antimeridiane (AM) e di quelle pomeridiane (PM). Le informazioni sull’ora e la data vengono collocate in un apposito registro e trasferite all’esterno al microcontrollore di Arduino mediante l’I²C-bus del quale il chip è provvisto; Arduino fa da unità master dell’I²C-Bus, mentre il chip della Maxim-Dallas è lo slave. Oltre a ciò, il DS1307 dispone di un’uscita di clock programmabile: più esattamente, rende disponibile un’onda quadra ricavata dalla frequenza di clock dell’orologio (determina- ta, a sua volta, dal quarzo da 32.768 kHz collegato ai piedini 1 e 2) che, mediante un apposito divisore interno, può essere divisa di frequenza ottenendo 1 Hz, 4.096 kHz, 8.192 kHz o l’intero clock. Le frequenze ottenibili non sono state scelte a caso: per esempio, 1 Hz può servire a far lampeggiare i due punti o il punto dei secondi di un eventuale display che mostra l’ora, in un’applicazione da orologio stand-alone. La condizione dell’uscita di clock ausiliario (SQWE, piedino 7) si definisce impostando opportunamente lo stato logico dei bit RS0 (0) ed RS1 (1) del registro di controllo, secondo quanto mostrato nell’apposito riquadro; ad esempio, 1 Hz si ottiene con entrambi i bit a zero. Si noti che quando sia il quarto (SQWE) che il settimo bit (OUT) si trovano a zero logico, l’uscita di clock si pone fissa a Elettronica In ~ Marzo 2016 95 . e ch i ità M en s ile a ic on r tt e l E e d l ie w w it l a u r t t at lic pp a a, w .e le t t a fic n o à t at i sc o ,n i r o n ic a o n ec t a c i v t en g lo in t i . a c i on r t t le e ’ l e lo tr n I