This is an old revision of the document!


Magnetic Authentication

Autor: Carol-Sebastian Bontas SRIC1

Project Description

Magnetic Authentication este o forma de autentificare folosind un magnet ce interactioneaza cu senzorul Hall integrat in ESP32. Fiecare utilizator are un id unic introdus de la tastatura si citit de ESP32. Citirile periodice ale senzorului Hall sunt stocate intr-o instanta de InfluxDB locala folosind Docker. Avem 2 tipuri de citiri in timp ale senzorului stocate in 2 baze (buckets). Prima (bucket “Signature”) contine toate semnaturile utilizatorilor (o semnatura este totalitatea citirilor senzorului atunci cand s-a dorit introducerea unui nou utilizator). A doua (bucket “MagneticAttempts”) contine toate citirile senzorului atunci cand id-ul introdus exista deja in “Signature”. Practic, “MagneticAttempts” contine toate incercarile de autentificare (corecte sau gresite) aparute de-a lungul timpului.

Pentru a crea un nou utilizator trebuie doar sa introducem un id ce nu a mai fost folosit si sa ne cream o semnatura ce va fi stocata in “Signature”. Pentru a autentifica un utilizator existent, trebuie sa introducem id-ul acestuia si sa recream semnatura originala din “Signature”. Semnatura creata in incercarea de autentificare este scrisa in “MagneticAttempts”.

Cunoscand id-ul (ID) si cat timp ne-a luat sa recream semnatura originala (DELTA), comparam ultima semnatura din “MagneticAttempts” cu id ID si care incepe de la -DELTA milisecunde fata de momentul actual, cu semnatura din “Signature” cu id ID.

Cum comparam semnaturile ?

Cum mana umana nu poate recrea semnaturile magnetice la perfectie (atat distanta fata de senzor cat si timpul de expunere la senzor) ne trebuie un test statistic care ne dea cu o anumita eroare similaritatea acestor semnaturi.

Pentru asta am folosit Coeficientul de corelatie Pearson.

Problema este ca pentru acest coeficient ne trebuie semnaturi (sau vectori) cu acelasi numar de elemente (adica acelasi numar de esantionari). Acest lucru este improbabil deoarece ar insemna ca mana sa recreeze la nivel de milisecunde timpul de expunere asupra senzorului. Pe langa asta, cei 2 vectori trebuie sa fie crescatori. Ca solutie, agregam la fiecare 100 ms masuratorile (esantionarea se face la 30 ms) in sume partiale pentru a cocentra informatia. Pentru fiecare din cei 2 vectori compunem sumele cumulative ale sumelor partiale si facem un inner join (practic alegem numarul minim de esantionari dintre cele 2 semnaturi). In final, prin inner join si sume cumulative ajungem la 2 vectori crescatori si de dimensiuni egale.

Hardware Description

Statia meteo primeste energia de la baterii lithium ion incarcate de la soare, informatia de la senzori si posteaza prin internet rezultatele. Am pus microcontroller-ul in sleep mode majoritatea timpului, pentru ca in mod realistic nu se schimba temperatura atat de mult in cateva secunde. Pana si 30 secunde s-ar putea sa fie prea putin timp intre esantionari. Am pus tot montajul electric intr-o cutie in care am dat gauri in zona senzorilor pentru a primi aer de afara si am izolat cat am putut de bine montajul de influenta soarelui. Am ridicat sistemul de la sol ca sa nu faca contact termic cu suprafata pe care sta, am acoperit cu folie de staniol toate suprafetele care stau la soare ca sa nu ajungem la un fel de sera si am inclinat panoul solar intr-un unghi ca sa fie mai eficienta capturarea energiei de la soare. Mult timp a fost petrecut in testarea sistemului si sa ma asigur ca fiecare componenta functioneaza corect (ca bateriile se incarca de la soare, ca supravietuieste pe balcon fara sa moara etc.).

Componente necesare:

  • Lolin32 microcontroller esp32
  • Panou solar 3W
  • Doua baterii lithium ion ICR18650 3.7V de 2600mAh
  • Lithium ion battery charger TP4056
  • Senzor temperatura si presiune atmosferica BMP280
  • Senzor de temperatura si umiditate DHT11

Software Description

Pentru ingerarea datelor folosim InfluxDB si pentru afisare folosim Grafana.

Modul de functionare al proiectului poate fi descris in pseudocod in felul urmator:

init_wifi()
init_influx()
init_sensors()

while true:
      read_sensors()
      send_influxDB()
      hibernate(30s)

In grafana folosim flux pentru querry-uri din influx:

from(bucket: "esp")
  |> range(start: -1d)
  |> filter(fn: (r) =>
    r._measurement == "wifi_status" and (
      r._field == "dht temp" or
      r._field == "mbe temp"
    )
  )

InfluxDB

Grafana

Bibliografie

iothings/proiecte/2022/magneticauth.1685721906.txt.gz · Last modified: 2023/06/02 19:05 by carol.bontas
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0