Serratura OTP

luca 14/09/2013 48

Libreria TOTP

Ho pubblicato una libreria Arduino per la generazione di codici TOTP.

Ringraziamenti

Questo progetto è stato possibile grazie a:

Jose Damico, per la sua implementazione della RFC 6238 in Arduino;

Peter Knight, per la sua libreria crittografica per Arduino;

Maniacbug, per aver reso la libreria Cryptosuite compatibile con Arduino 1.0.

La descrizione del completo funzionamento della libreria è presente nella pagina dedicata; il suo utilizzo comunque è molto semplice:

uint8_t hmacKey[] = {0x4d, 0x79, 0x4c, 0x65, 0x67, 0x6f, 0x44, 0x6f, 0x6f, 0x72};
TOTP totp = TOTP(hmacKey, 10);

L’oggetto TOTP viene istanziato passando la chiave segreta e la relativa lunghezza (nell’esempio 10 caratteri);

totp.getCode(GMT);

il metodo getCode, a cui va passato il valore di timestamp attuale, restituisce una stringa (char*) contenente il codice generato.

Sincronizzazione

Google Authenticator e Arduino devono essere sincronizzati: condividere la medesima password e avere lo stesso timestamp.

L’applicazione di Google richiede l’inserimento della password in formato base32; è anche in grado di leggere un QRCode per la configurazione automatica.

Ho preparato una pagina web (http://www.lucadentella.it/OTP) per facilitare la configurazione: è sufficiente inserire la password desiderata per ottenere sia il byte array per lo sketch Arduino, sia password e QRCode per l’app:

Esempio

Ecco la descrizione del progetto mostrato nel breve video in apertura.

Arduino è collegato alle seguenti periferiche:

  • una tastiera, utilizzando la libreria presente nel Playground;
  • un servocomando, utilizzando la libreria inclusa nel core.

Per semplicità, l’orario viene mantenuto utilizzando un RTC software (la libreria swRTC di Leonardo Milani); per progetti reali è consigliato l’uso di un RTC hardware, ad esempio il DS1307.

L’utente inserisce tramite la tastiera il codice OTP: Arduino lo confronta con quello generato internamente e – se uguali – muove il servo per l’apertura della porta.

E’ possibile attivare una modalità di debugging via seriale:

Due tasti hanno funzioni particolari:

  • *, chiude la porta
  • #, svuota il buffer di input, per iniziare l’inserimento di un nuovo codice

Lo sketch è disponibile su GitHub.

Pagine: 1 2

48 Comments »

  1. Ivan 19/09/2013 at 12:25 - Reply

    # 1!!!!

  2. Burke 01/11/2013 at 21:08 - Reply

    Great article.

  3. customdev 05/03/2014 at 23:13 - Reply

    I have the sketch up and running. Everything compiles and uploads beautifully.

    However I am having synchronization problems. Which time zone are we to use? I cannot tell rather my phone simply uses the GMT as its system clock or rather it is GMT adjusted with an offset for my time zone.

    I have tried using both GMT and GMT adjusted for my time zone with less than 5 seconds of difference between the Arduino’s time and the phone’s time. Either way the codes generated never match up.

    • luca 15/03/2014 at 10:46 - Reply

      Hi! Google Authenticator uses GMT even if your phone displays time in your timezone, so you have to configure arduino with the same timezone.

  4. Chrisitan 15/05/2014 at 12:12 - Reply

    Ottimo articolo fa venir voglia di utilizzare questa serratura….

  5. customdev 26/11/2014 at 06:03 - Reply

    hi,i have configured arduino with the same timezone as GMT,but the codes generated never match up

    • luca 26/11/2014 at 11:06 - Reply

      Hi! make sure you’re using the same shared secret, it must work

  6. Nonnino 05/12/2014 at 16:57 - Reply

    Salve!!! Grazie per la condivisione del progetto.
    Volevo chiederLe cosa si intende per:
    “Choose an account name:”, presente nel sito http://www.lucadentella.it/OTP/. Si intende un nome fittizio?
    Alle righe 64 e 65 dello sketch è presente una specifica data e ora, mi chiedevo se andava cambiata. Come avrà capito il mio problema è la mancata sincronizzazione dei due codici OTP. Potrebbe spiegarmi come impostare la sincronizzazione dei codici?

    • luca 06/12/2014 at 11:54 - Reply

      ciao! il nome è fittizio ed è quello che poi comparirà nella app sul cellulare. Nell’esempio va inserito “a mano” l’orario corrente appunto alle righe 64-65 dello sketch, altrimenti si potrebbe leggere l’orario da un RTC…

      • Nonnino 08/12/2014 at 19:18 - Reply

        Grazie mille per la risposta, modificherò le righe dello sketch. Se non ho capito male, la data e l’ora, da impostare alle righe 64-65 è la stessa di quando viene premuto il pulsante “GO” e viene generata la chiave nel sito http://www.lucadentella.it/OTP/. Giusto?? :-) Grazie di nuovo!!!

        • luca 13/12/2014 at 17:31 - Reply

          in realtà data/ora devono essere quelle attuali di quando si compila e carica lo sketch su Arduino

  7. Gianni Trevisanello 10/01/2015 at 10:31 - Reply

    Ciao, complimenti per il tuo enorme lavoro che metti a disposizione di tutti !!!
    Gentilmente sapresti indicarmi come posso modificare totp.h per generare il codice con una chiave di 16 caratteri e non 10.
    Ti ringrazio infinitamente
    Gianni

    • luca 19/01/2015 at 20:48 - Reply

      Ciao Gianni, la libreria TOTP gestisce chiavi con lunghezza arbitraria: il secondo parametro è proprio la lunghezza della chiave: http://www.lucadentella.it/totp-libreria-per-arduino/
      L’unico problema è che l’app di google accetta solo password a 10 caratteri quindi non puoi usarla se cambi la lunghezza chiave lato Arduino.

  8. Matteo 14/03/2015 at 15:18 - Reply

    Bellissimo progetto!!
    Ho provato a scaricare sia lo sketch che le librerie necessarie, ma quando clicco su “verifica” mi compare un errore facendo riferimento a “shal.h”;
    infatti non ho una libreria con quel nome.
    Come posso risolvere?

    Grazie 1000

    Complimenti ancora per il progetto
    Matteo

  9. Oren Pinsky 20/05/2015 at 23:21 - Reply

    Hello, and thank you for the inspiration.

    My system, based on the BeagleBoard and in javascript has been in production for the last 3 months. It has multiple users, and the software can identify which user is typing the OTP.

    Also, every user has 2 possible OTPs – one opens the door, and the other opens the door and alert the police. It also logs all accesses to a dropbox file.

    Eventually I will migrate this to arduino+rtc+wifi. Do you know how many OTP tests per second can your system execute?

    Best regards, OP

  10. francesco 16/09/2015 at 15:03 - Reply

    Salve, ho provato a compilare il tutto e sembra funzionare, ma non riesco a sincronizzare la data.
    Mi spieghi come posso risolvere?
    codice inserito: 794370
    il codice corretto e': 028137

    • luca 26/09/2015 at 10:32 - Reply

      Ciao Francesco… tieni conto che la data che devi configurare è UTC, non con il fuso orario italiano.

  11. lorenzo 13/01/2016 at 18:54 - Reply

    ciao
    bellissimo progetto ho un problema pero a trovare la libreria “sha1.h” dove la posso trovare??
    sul link che hai lasciato a mettao non mi va!!
    grazie :)

  12. lorenzo 14/01/2016 at 21:38 - Reply

    questo problema sono riuscito a risolverlo
    me ora ne ho un altro cioè che( boolean setClockWithTimestamp(unsigned long timeT, int yearT = 0); mi da questo errore quando compilo lo skech
    grazie mille per la disponibilità
    ancora complimenti per il progetto :)

    • luca 15/01/2016 at 20:57 - Reply

      Ciao, che errore ti da in fase di compilazione?

  13. lorenzo 17/01/2016 at 12:56 - Reply

    ciao
    l’errore che mi da è questo!!
    ( boolean setClockWithTimestamp(unsigned long timeT, int yearT = 0);
    grazie ancora

    • luca 17/01/2016 at 13:51 - Reply

      ciao! ma stai usando il mio sketch? quel metodo (setClockWithTimestamp) non c’è proprio nel sorgente…

  14. lorenzo 17/01/2016 at 14:05 - Reply

    ciao
    si sto usando il tuo skecht

  15. lorenzo 17/01/2016 at 14:16 - Reply

    mi da tutti questi errori

    Arduino:1.6.7 (Windows 10), Scheda:”Arduino/Genuino Uno”

    In file included from C:\Users\canto\Desktop\TOTP_DoorLock\TOTP_DoorLock.ino:4:0:

    C:\Users\canto\OneDrive\Documenti\Arduino\libraries\swRTC-master/swRTC.h:531:6: error: prototype for ‘byte swRTC::setClockWithTimestamp(long unsigned int, int)’ does not match any in class ‘swRTC’

    byte swRTC::setClockWithTimestamp(unsigned long timeT, int yearRef) {

    ^

    C:\Users\canto\OneDrive\Documenti\Arduino\libraries\swRTC-master/swRTC.h:92:11: error: candidate is: boolean swRTC::setClockWithTimestamp(long unsigned int, int)

    boolean setClockWithTimestamp(unsigned long timeT, int yearT = 0);

    ^

    exit status 1
    Errore durante la compilazione

    Questo report potrebbe essere più ricco di informazioni con
    “Mostra un output dettagliato durante la compilazione”
    abilitato in “File > Impostazioni”
    cosa posso fare??
    grazie mille

    • luca 18/01/2016 at 14:16 - Reply

      ciao, sembra un problema della libreria swRTC… purtroppo non è mia: hai preso l’ultima versione?

  16. lorenzo 18/01/2016 at 16:48 - Reply

    ciao
    io ho lo scaricata da git hub!! se riesci mi gireresti il link grazie mille

  17. Davide 26/01/2016 at 13:40 - Reply

    Ciao
    Bellisimmo progetto
    Però anche io ho lo stesso problema di Lorenzo… Cosa posso fare

  18. Mabson 25/02/2016 at 11:32 - Reply

    Please, how you sync the RTC in arduino to take the same time from android ?

    • luca 25/02/2016 at 20:11 - Reply

      I usually use my RTCSetup software ;)

  19. giorgio 12/04/2016 at 15:07 - Reply

    ciao Luca, complimenti per i tuoi lavori e per la scelta di condividerli. Ho provato a replicare il tuo progetto: con l’IDE 1.6.5 mi dava problemi di librerie e ho provato con l’1.0.6. Il programma gira ma produce un codice diverso da quello della app. Mi potresti aiutare? Ho inserito data e ora sullo sketch spaccando quasi il secondo nell’upload, cioè ho inserito un orario tenendo conto dei secondi per l’upload ma senza esito positivo. Ho usato l’UTC come richiesto. Ho trovato questo tuo progetto su elettronica in e cercando su google ho trovato il tuo sito…

    • luca 19/04/2016 at 14:18 - Reply

      Ciao Giorgio… molto strano: sei sicuro che la password sia la stessa che hai configurato nell’app? Prova a far generare (come fa lo sketch che ho scritto per Elettronica In) 3 codici (t-30, t e t+30) e verificare se uno di questi è valido così ti “proteggi” da piccoli disallineamenti di orario

  20. Tito 01/01/2017 at 10:40 - Reply

    Hi luca, how to configure hardware RTC with your sketch? i tried with DS3231 but i get error because timestamp in your sketch is long but function gettime() from DS3231 is DateTime variable. thanks

    • luca 02/01/2017 at 21:03 - Reply

      Hi Tito, you need a timestamp value not a DateTime… check if your library can return it

  21. Thomas 09/03/2017 at 18:44 - Reply

    Hi
    Awesome project !
    Got an question about the TOTP interval. Is there an maximum ?
    and if i change it to 3600 secounds will this then break the security ?
    Thanks

    • luca 10/03/2017 at 09:31 - Reply

      Hi Thomas, no maximum but of course the more the interval is long, the less is the security

  22. Mos Branca 14/11/2017 at 13:56 - Reply

    Ciao Luca,
    il tuo sito web e’ un punto di riferimento prezioso. Intanto GRAZIE per tutto quello che condividi.

    Vorrei generare off line il Google Authenticator code. C’e’ del codice da poter scaricare o un riferimeto?

    Grazie ancora.

    • luca 15/11/2017 at 10:19 - Reply

      ciao, essendo un algoritmo “pubblico” puoi usare un qualsiasi programma che supporti la RFC6238. Ad esempio questa è una applicazione opensource che si basa sul codice di Google Authenticator.

  23. bats 13/12/2017 at 07:48 - Reply

    Hi Luca. Can I change the time limit for TOTP.

    • luca 13/12/2017 at 15:32 - Reply

      yes, but the application and your code on arduino MUST use the same timestep.

  24. bhumika 23/12/2018 at 20:18 - Reply

    but where the complete code to make OTP and send it on mobile , to verify that OTP and to open the doorl lock after verification of valid OTP. please help me.

    • luca 28/12/2018 at 14:24 - Reply

      You don’t need to send anything… both the Arduino and the mobile generate their “own” codes, but using the same algorithm with the same private key makes it possible to generate the same sequence of codes.

  25. Giuseppe Conforto 17/03/2019 at 23:09 - Reply

    Ciao,
    Vorrei realizzare una tastiera per aprire le porte da utilizzare nei b e b o piccoli hotel.
    Praticamente utilizzando i codici OTP da comunicare al cliente per l’apertura Della camera.
    Ma questo codice dovrebbe aprire la camera per i giorni che il cliente soggiorna, cioè se il cliente rimane 3 giorni, per 3 giorni il codice non dovrà modificarsi.
    È possibile ciò?

    • luca 25/03/2019 at 11:40 - Reply

      Buongiorno Giuseppe… è sicuramente possibile (esistono prodotti commerciali che lo fanno) ma è un approccio completamente diverso (attualmente la serratura viene aperta con un codice valido una sola volta e entro 30s dalla sua generazione).

  26. Giuseppe 09/07/2019 at 20:17 - Reply

    Ciao Luca se possibile vorrei farti alcune domande: è possibile cambiare il tempo di utilizzo del codice da 30s a 3min? Nel caso non volessi usare l’OTP cos’altro posso usare come generatore di codici random?
    Grazie in anticipo.

    • luca 17/07/2019 at 10:05 - Reply

      ciao giuseppe, la libreria supporta un timeStep (durata di ogni singolo codice) variabile, guarda il metodo:

      TOTP::TOTP(uint8_t* hmacKey, int keyLength, int timeStep)

      Per generare i codici con cellulare vi sono moltissime app, basta che cerchi nel market “TOTP”.

Leave A Response »

Fare clic qui per annullare la risposta.

Questo sito usa i cookie per poterti offrire una migliore esperienza di navigazione maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi