Authentification à Zéro Connaissance & Biométrie

Dans cette article nous étudions quelques bonnes caractéristiques que devrait avoir un système d’authentification basé sur des données biométriques.

Partager un secret

Très souvent l’authentification repose sur le partage d’un secret connu par l’accédant et du système qui le protège : l’accédé.
Le système classique basé sur le mot de passe suppose que celui qui accède (accédant) et celui qui vérifie l’accès (accédé), connaissent le mot de passe. Fondamentalement, le système est anonyme, je suis alors identifié comme étant le porteur du secret. Le secret ne me caractérise pas. Le fait de posséder la clé d’une serrure ne prouve pas que je suis légitime à ouvrir la porte.

Identifier / authentifier

Il se pose alors le problème de l’identification. Le facteur biométrique retenu sera-t’il le secret ou le moyen d’identification ?
Par exemple un système d’accès reposant sur l’empreinte palmaire doit disposer d’un clavier, pour que l’accédant donne son code d’identification en même temps qu’il partage les dimensions de sa main. Mais finalement qu’est-ce qui est secret : la main ou le code ? La donnée biométrique est-elle le secret ou l’identification ?

Dans les deux cas c’est une information privée qu’il faut partager avec un tiers, ce qui n’est pas souhaitable pour une donnée biométrique.

Keep the Secret secret

Comment faire dans ce cas pour que l’accédant puisse déposer un secret chez l’accédé sans que ce dernier ne le connaissance, mais qu’il puisse tout de même faire confiance à l’accédant sur la base de cette information ? Pas facile 😉

C’est là qu’intervient le ZKIP (Zero Knowledge Interactive Proof) ou Preuve à divulgation nulle. Mais comment cela fonctionne ?

Prenons un exemple:

Admettons que je dépose un mot de passe chez l’accédé fait de chiffres et de lettres et que ce dernier ne connaisse uniquement les positions des lettres et des chiffres mais pas leur valeur. Cette myopie ne lui permet pas de voir la totalité du secret. Par contre, il peut proposer à l’accédant des challenges du type:

  • A la position X qu’est-ce qui se trouve ? Sous entendu une lettre ou un chiffre.

L’accédant peut alors lui répondre car il connaît le secret. Si ce dernier n’est pas en possession du secret, il finira par faire des erreurs permettant à l’accédé de détecter une tentative d’intrusion. La preuve est donc obtenue de manière statistique. Le secret doit avoir une entropie suffisante pour garantir un calcul efficient de la preuve.

Dans le secret d’un coffre-fort

Revenons à notre problème de biométrie. Admettons qu’il existe des caractéristiques uniques et stables comme la longueur du nez, l’écart entre les yeux, la taille d’une phalange…etc. Toutes ces longueurs et dimensions doivent être captées d’une manière simple et chiffrée avec un algorithme de type homomorphe.

Qu’est ce que cette dernière invention ! C’est simple avec ce type de chiffrement vous pouvez appliquer une opération simple sur la partie chiffrée, sans pour autant avoir besoin de déchiffrer et chiffrer de nouveau. Par exemple RSA est homomorphe à la multiplication:

La formule de chiffrement de RSA pour un nombre x: ϵ(x)=x^e mod m 
si on multiplie deux messages chiffrés on obtient:
 ϵ(x1)*ϵ(x2)
 =(x1^e mod m) * (x2^e mod m) 
 =(x1^e * x2^e)mod m
 =(x1*x2)^e mod m
 =ϵ(x1*x2)
cqfd le produit des nombres chiffrés est égal au chiffre du produit des nombres

Comment mettons nous cela en pratique afin d’avoir une authentification sur des données biométriques sans les communiquer et tout en leur faisant confiance ?

C’est assez simple : je chiffre toute mes données avec RSA et remet le tout, plus la clé publique, à l’accédé. Quand, en tant qu’accédant, je sollicite un accès, le système me propose des challenges en multipliant une de mes dimensions biométriques par un facteur chiffré avec ma clé publique. Pour retrouver ce facteur, je déchiffre le nombre transmis avec ma clé privée, et par une simple division entre la valeur initiale et celle générée, je répondrai au challenge.

action opération
Accédé chiffre un facteur f et le multiplie avec une données biométrique chiffrée d1
d1 * ϵ(f) avec d1 = ϵ(x1)
Accédant déchiffre le challenge et trouve une valeur x
x = x1 * f
Accédant calcule le facteur depuis ma valeur de la dimension et le retourne à l’accédé
x / x1 = f

Pour renforcer ce système je pourrais utiliser autant de clés RSA que d’accédés et aussi appliquer un salage sur les valeurs de mes dimensions biométriques.

Ne vous précipitez pas pour mettre un brevet sur cette méthode, elle est très imparfaite ;-).

  • En premier vous pouvez par essai / erreur retrouver toutes les dimensions biométriques en chiffrant les valeurs et en comparant avec le dépôt (d’où le salage mais alors mes dimensions sont altérés);
  • En second il faut que les dimensions ne puissent pas être déduites d’une simple photo, car ce n’est plus un secret dans ce cas.

Donc pour résumer, il faut:

  • Un relevé de dimensions biométriques secrètes
  • Un chiffrement homomorphe riche et robuste
  • Un protocole de challenge sur les dimensions biométriques

[:en]Le principe d’une authentification repose sur le partage d’un secret, en fait une connaissance mutuelle.
Le système classique basé sur le mot de passe suppose que celui qui accède et celui qui vérifie l’accès connaisse le mot de passe pour un utilisateur donné. En fait on partage deux choses:
* Le code de l’utilisateur
* Le secret
Le secret peut être vérifié en étant communiqué en clair ou sous forme d’une empreinte. Il existe aussi des moyens pour vérifier un mot de passe par partie (longueur, x premier caractère, ce caractère …). Ce dernier moyen est particulièrement intéressant car il permet d’échanger sur le secret sans le transmettre intégralement.
Supposons que nous voulions utiliser une information biométrique et personnelle pour nous authentifier. Le principal écueil serait que cette information privée serait connue de l’accédé.
Comment faire dans ce cas pour que l’accédant puisse déposer un secret chez l’accédé sans que ce dernier ne le connaissance, mais qu’il puisse tout de même faire confiance à l’accédant sur la base de cette information ? Pas facile 😉
C’est là qu’intervient le ZKIP (Zero Knowledge Interactive Proof) ou Preuve à divulgation nulle. Mais comment cela fonctionne ?

Prenons un exemple:
Admettons que je dépose un mot de passe chez l’accédé fait de chiffre et de lettre et que ce dernier ne connaisse juste que les positions des lettres et des chiffres, sans connaitre la valeur. Cette myopie ne lui permet pas de voir la totalité du secret. Par contre il peut proposer à l’accédant des challenges du type: A la position X qu’est-ce qui se trouve ? Sous entendu une lettre ou un chiffre. L’accédant peut alors lui répondre sans erreur. Si ce dernier n’est pas en possession du secret, il finira par faire des erreurs et alors l’accédé saura que c’est une tentative d’intrusion. La preuve est donc obtenue de manière statistique et donc le secret doit avoir une entropie suffisante pour garantir un calcul efficient de la preuve.

[:]