KeycardAccess v2

La versione 2 di KeycardAccess è la più vicina ad essere realizzata. 5p4k e wifasoi hanno realizzato una libreria per la comunicazione con la nostra tessera da un ESP32.

  • MIFARE DESFire EV2
  • PN532
  • ESP32
  • ESP32
  • PN532

Keycardaccess V2

Notazione usata:

  • KDF: key derivation function
  • SIGN: firma usando la chiave privata del Mittelab (o meglio, una chiave derivata)
  • DB: database o archiviato nel backend o nel controller
  • controller: dispositivo localizzato all’interno della sede che decide se aprire la porta. Potrebbe o non potrebbe includere il lettore della carta (a cui potrebbe essere collegato)
  • backend: FreeIPA o qualsiasi altro software faremo girare in infra ext/int per gestire l’apertura porta
  • MID: Member ID, potrebbe essere l’username ad esempio
  • UID: tessera UID
  • SALT_*: un qualche valore scelto a caso in maniera crittograficamente sicura, al momento dell’attivazione
  • STORE(<content>, <key>): archivia un file sulla tessera, con contenuto <content>, criptato con la chiave simmetrica <key>.
  • <entry> → <value>: mappa unidirezionale da entry a value

Attivazione nuova carta

  1. Ottieni SALT_DB, SALT_CARD
  2. STORE(SALT_CARD, KDF(UID + <shared_secret>))
  3. Salva sul backend DB: MIDHASH(UID), SALT_DB
  4. Deriva la chiave K := KDF(HASH(UID), SALT_DB, SALT_CARD)
  5. Firma e salva il file firmato sulla carta: STORE(SIGN(HASH(UID), HASH(SALT_CARD), MID), K)

Deploy di un nuovo controller

  1. Crea una coppia chiave pubblica KP_c / chiave privata KS_c per ogni controller
  2. Archivia KP_c sul backend

Aggiornamento del DB del controller

  1. Costruisci la mappa HASH(UID) → SALT_DB per ogni MID autorizzato
  2. Cripta la mappa HASH(UID) → SALT_DB con tutte le chiavi pubbliche KP_c.
  3. Consegna il crittogramma ad ogni controller
  4. Il controller decripta con la propria chiave privata KS_c e salva

Verifica degli accessi

  1. Il controller calcola HASH(UID) e controlla se ha un’entry HASH(UID) → SALT_DB
  2. Se sì, legge SALT_CARD dalla carta, e deriva K = KDF(HASH(UID), SALT_CARD, SALT_DB)
  3. Usando K, legge SIGN(HASH(UID), HASH(SALT_CARD), MID)
  4. Verifica la firma, verifica che HASH(UID) corrisponda e che HASH(SALT_CARD) corrisponda
  5. Se sì, l'utente è autenticato
  • progetti/keycardaccess_v2.txt
  • Ultima modifica: 2021/01/25 20:31
  • da g5pw