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