Magnetic Authentication

Autor: Carol-Sebastian Bontas SRIC1

Descriere proiect

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.

Pearson.flux este scriptul cu care calculam acest coeficient.

1. Pornim de la citirile senzorului aflate in coloana _values din “MagneticAttempts” bucket si agregate ca sume partiale la fiecare 100 ms

2. Eliminam din coloanele aditionale, aplicam o functie de suma cumulata pe coloana cu citiri ale senzorului si adaugam o noua coloana ce numeroteaza randul (o sa fie folositoare atunci cand facem inner-join).

3. Se aplica aceeasi pasi 1 si 2 dar pentru citirile din “Signature” bucket

4. Se face inner-join pe cele 2 tabele de sume cumulative folosind coloana de numerotare a randului de la pasul 2 si se calculeaza patratele sumelor cumulative din acelasi bucket cat si produsele sumelor cumulative din buckets diferite.

5. Facem suma fiecarei coloane de patrate si produse (exemplu din poza ar fi un tabel ce contine suma patratelor sumelor partiale)

6. Repetam pasul 5 pentru toate coloanele din tabelul de la pasul 4.

7. Facem un inner-join cu toate tabelele de la pasul 6. Am obtinut un tabel cu toti parametrii necesari ca sa calculam coeficientul.

Descriere hardware

Componente necesare:

  • Lolin32 microcontroller esp32
  • breadboard
  • fire

Descriere software

Pentru stocarea, procesarea si afisarea datelor folosim InfluxDB. Pentru placuta folosim 2 componente software:

1. magnetic_auth.ino : componenta principala care e responsabila doar cu conectarea la reteaua WiFi, sincronizarea temporala si citirea de la senzorul Hall atunci cand pe seriala este data o comanda de start a autentificarii.

void doUntilSerialInput(void(*task_functional)(void*), void *task_param){
  while(1){

    if(task_functional != NULL){
      task_functional(task_param);
    }

    if(Serial.available() > 0){
      String response = Serial.readString();
      response.trim();
      if(response == "y"){
        return;
      }
    }
  }
}

“doUntilSerial” este functia ce permite executia unei actiuni (data ca pointer de functie/functionala - in cazul nostru task_functional), actiune ce accepta orice parametru (in cazul nostru task_param).

Concret pentru a citi inregistrati de la senzorul Hall se apeleaza astfel

 doUntilSerialInput(sampleHallSensor, NULL) 

2. magnetic_influx.cpp este o componenta auxiliara ce se ocupa exolicit cu interactiunea cu InfluxDB.

partea centrala este reprezentata de construirea query-ului de Flux care sa verifice daca id-ul dat apare sau nu in bucket-ul “Signatures”.

Prezinta urmatorea interfata:

int userExists(int id){
  String existQuery = String("from(bucket: \"") + String(BUCKET_USERS) + String("\")");
  existQuery += String("|> range(start: 2021-05-22T23:30:00Z)");
  existQuery += String("|> filter(fn: (r) => r._measurement == \"") + String(MEASUREMENT) + String("\" and r.id == \"") + String(id) + String("\")"); 
  existQuery += String("|> count()");

  Serial.println(existQuery);
  int userFound = 0;
  FluxQueryResult result = clients[USERS_INDEX].query(existQuery);

  while(result.next()){
    if(result.getValueByName("_value").getLong() > 0){
      Serial.println("User was registered in the past");
      userFound = 1;
    }
  }

  if(result.getError() != ""){
    Serial.print("Query result error: ");
    Serial.println(result.getError());
    return -1;
  }

  Serial.print("User id");
  Serial.println(id);
  Serial.println(" is available.");
  result.close();
  return userFound;

}

Bibliografie

iothings/proiecte/2022/magneticauth.txt · Last modified: 2023/06/02 20:09 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