Header Ads

Utiliser des cartes RFID pour projet de micro-paiement scolaire

Question
Je suis sur un projet de payement avec cartes RFID. Je suis donc à la recherche de cartes RFID qu’il est possible de sécuriser puisque le crédit de la carte serait stocké sur celle-ci.

Je souhaiterais savoir si vous vendez des composants pour lire et écrire sur des cartes RFID. Je souhaiterais également savoir si des solutions sécurisées existent et si vous les vendez.
J’ai découvert les writer/reader RFID chez XYZ qui supporte une fonction de login pour être certain que les données sont lues par un lecteur autorisé.
Réponse
Je profite d'une pause ce midi pour répondre à ce billet... n'hésitez pas à demander l'éclaircissement d'un point ou l'autre qui aurait été rédigé trop hativement.
Il est effectivement possible de réaliser une tel dispositif en utilisant:
  1. Des produits (cartes, tags, etc) RFID MiFare
  2. Un RFID Shield pour Arduino Uno
  3. Un Arduino Uno
Carte RFID/NFC pour Arduino - Disponible chez MCHobby

Les composantes "Mot de passe" et "gestion des données de la carte" étant pris en charge par le Firmware (votre programme Arduino).
Ce mot de passe peut-être saisi de deux façons différentes:
  1. En utilisant un clavier physiquement attaché à votre Arduino
    (Gestion de mot de passe de type "Hardware")
  2. Soit en le prévoyant dans votre protocole de liaison série entre un ordinateur et votre Arduino
    (Gestion de mot de passe de type "Software")
Pourquoi ce shield?
Le shield  RFID/NFC d'AdaFruit est un produit très bien fini, bien documenté et stable. De surcroit, il est livré avec un bibliothèque Arduino sérieusement réalisée. Autant de raison d'opter pour ce produit.

Pourquoi une carte MiFare?
Premièrement parce qu'elle dispose d'un identifiant unique (nommée "ID") qui est gravé par le constructeur de la carte ET NON MODIFIABLE!
Carte MiFare Disponible chez MCHobby
C'est un point important, car si l'on copie les données d'une carte à l'autre, il est possible de vérifier que les données correspondent bien à la carte physique.
Le plus simple c'est de placer l'identifiant de la carte (ID) dans les données stockées sur la carte :-)

Deuxièmement, les produits MiFare sont disponibles sous forme de Carte, tag, mais aussi tag à coller, porte clé, pendentif, etc. De quoi prévoir de nombreux cas d'applications.
Tag MiFare, disponible chez MCHobby
Troisièmement, les carte MiFare disposent d'un espace de stockage de 1,3Kb. De quoi stocker toutes les informations nécessaires à ce projet.

Stocker les information sur une carte RFID
Puisque les cartes MiFare dispose d'un espace de stockage, c'est l'endroit idéal pour y stocker des informations.
Dans le cas présent, les données devraient idéalement contenir les éléments suivants:
  • Un header / une entête - un suite de byte (chaine de caractère) qui permet d'identifier les données.
    De sorte, vous savez qu'il s'agit bien des données correspondant à votre projet...
    mais aussi la version de ces données (car ont est parfois amené à en ajouter).
  • L'identifiant de la carte / ID - Qui vous permet de vérifier que les données correspondent bien à la carte. Au cas ou un petit malin essayerait de dupliquer la carte pour profiter plusieurs fois du même crédit ;-)
  • Le crédit - Forcément, l'information qui vous intéresse le plus... il faut bien la stocker.
  • Les 5 dernières opérations + date et heure - c'est optionnel mais peut se révéler utile
  • Un CRC / Clé de vérification: Permet de faire un checksum sur les données et permet de vérifier qu'elles ne sont pas corrompue (accidentellement ou par tentative de Hacking).
    CRC32 sera certainement très convenable et utilise "une clé" de vérification qui est encodé en dure dans votre FirmWare Arduino
Je ne veux pas d'information en clair sur la carte!
Bien entendu, l'information en clair serait bien trop facile à manipuler.
Il faudra donc l'encrypter... Plusieurs solution à envisager:
  • Trop élémentaire:
    Le plus simple est une opération XOR avec une valeur que vous avez encodé dans votre FirmWare.
    Cette approches est généralement considérée comme de l'amateurisme... je dirais qu'elle à au moins  mérite de masquer les évidences (un minimum) à peu de frais et ne réclame pas un savoir poussé.
  • Le canon pour tuer une mouche:
    L'idéal serait d'utiliser une encryption à la PGP (clé longue, algorithme symétrique pour encryption comme DES ou AES, clé d'encryption encrypté avec un algorithme asymétrique comme RSA). Solution courant sur un PC, elle réclame un minimum de connaissance dans ce domaine et n'est vraiment pas à la portée d'un Arduino (pas assez puissant, pas assez de mémoire).
  • L'approche raisonnable:
    Le mieux est d'utiliser un algorithme symétrique comme DES ou AES. DES à largement fait sont temps mais devrait raisonnablement convenir à ce type d'application. Ma préférence irait vers AES (aussi dit Rijndael) que j'ai déja utilisé sur PC. AES, issus de travaux Belges, à été sélectionné par la NSA pour encrypter les communications non confidentielles. AES à l’avantage d'avoir été conçu pour fonctionner sur des système ayant des ressources très limitées et à très vite été porté sur de nombreuses plateformes.
    Reste a trouver soit une implémentation de DES, soit d'AES pour Arduino... cela doit exister.
Ne reste plus qu'a encoder la clé d'encryption (ultra secrète) dans votre FirmWare de votre Arduino.
Ecriture sur le RFID:
  1. Vous écrivez vos données en clair dans un buffer/mémoire tampon de votre Arduino
    PS: n'oublier pas d'utiliser l'ID de la carte MiFare pour le placer dans votre Buffer.
  2. PUIS vous l'encodez le buffer à l'aide de votre clé d'encryption utra-secrète...
  3. PUIS vous copiez le buffer encryté dans la mémoire de la carte RFID
 Lecture depuis le RFID:
  1. Lecture du contenu encrypté depuis la carte RFID et stockage dans le buffer (mémoire tampon Arduino)
  2. Décrypter le contenu du buffer avec la clé ultra-secrète
  3. Vérifier que le header (entête) est bien présent
  4. Vérifier que l'ID de la carte MiFare contenu dans le buffer correspond bien à l'ID physique de la carte. Mode Parano... permet de s'assurer que ce n'est pas un duplicat de la carte d'origine.
Mode parano - protéger la clé d'encryption
Avoir la clé d'encryption ultra secrète codée en dure dans votre programme Arduino (le FirmWare) est un problème pour vous?
Et bien, la solution est simple:
Il faut stockez la clé d'encryption ultra-secrète dans l'EPROM de votre Arduino.
Mais soyons plus parano encore... encodons la clé d'encryption (qui n'est jamais qu'une information comme n'importe quel autre) avec le mot de passe Administrateur que vous aurrez choisit (dans votre programme ou saisi sur un clavier).
Comment protéger/encrypter la clé:
  • Placer la clé d'encryption cle_pour_RFID choisie de façon arbitraire dans la mémoire tampon en vue d'une encryption.
    Vous pouvez saisir cette valeur soit au clavier ou soit l'envoyé à votre Arduino.
  • Saisir le mot de passe Administrateur (saisie au clavier ou envoyé à votre Arduino)
  • Encrypter la clé d'encryption avec l'algorithme --> produit un "clé d'encryption encryptée" dite clé_protégé_par_mot_de_passe
  • Stocker clé_protégé_par_mot_de_passe ("la clé d'encryption encryptée avec le mot de passe Admin) dans l'EPROM
Comment retrouver la clé:
Le but est de récupérer cette clé dans la mémoire de votre Arduino pendant qu'il fonctionne... une fois éteind, la mémoire est perdu et il ne reste qu'une copie non volatile dans l'EPROM (et celle là est encrypté avec le mot de passe Administrateur).

Mais comment récupérer cette clé d'encryption?
  • Au démarrage de votre Arduino: saisir le mot de passe Admistrateur au clavier ou l'envoyer à votre Arduino
  • Charger le buffer avec la clé_protégé_par_mot_de_passe depuis l'EPROM
  • Décoder le buffer avec le mot de passe Administrateur -> produit la "Clé d'encryption" décryptée que nous appelerons cle_pour_RFID
  • Stocker le résultat de la décryption dans une variable (ex: la variable cle_pour_RFID).
A ce stade, si le mot de passe Administrateur est correct,  cle_pour_RFID contient une clé valide. Dans le cas contraire, cle_pour_RFID contient une valeur plutôt aléatoire.

A la lecture d'une carte RFID:
On reprend le procédé de lecture d'une carte RFID déjà décrit ci-dessus avec une petite variante:
  1. Lecture du contenu encrypté depuis la carte RFID et stockage dans le buffer (mémoire tampon Arduino)
  2. Décrypter le contenu du buffer avec la clé cle_pour_RFID
  3. Vérifier que le header (entête) est bien présent
    S'il contient la valeur attendu...
    1. Le mot de passe Administrateur était donc correct!
    2. Il s'agit bien entendu d'une carte RFID dont le contenu correspond à votre programme
  4. Vérifier que l'ID de la carte MiFare contenu dans le buffer correspond bien à l'ID physique de la carte. Mode Parano... permet de s'assurer que ce n'est pas un duplicat de la carte d'origine.
Si le mot de passe Administrateur saisi au démarrage du système était incorrect:
  1. La cle_pour_RFID contiendra une valeur quelconque qui ne sera pas la bonne clé de décryption
  2. Le contenu de la carte RFID sera décrypter avec une cle_pour_RFID invalide. Le résultat sera quelconque
  3. Il sera impossible d'identifier le votre header/entête!
Pour finir
Voila, c'est les etapes techniques essentielles. Il ne reste plus qu'a mettre en musique... bien que cela soit une tâche relativement complexe.
Si un lecteur à déjà utilisé avec succès de l'encryption DES ou AES sur Arduino, ce serait super sympa d'envoyer un petit commentaire pour partager votre découverte :-)

Bonne découverte avec Arduino et l'Open-Source

Où Acheter: