Guides pratiques

Vérifier les signatures

Chaque identification ou signature produit une preuve que vous pouvez vérifier vous-même et conserver. Les informations de cette page concernent les API d’identification et de signature, ainsi que la vérification de la carte numérique.

Identification et signature

Toutes les signatures renvoyées par le service sont vérifiées par ExcelID. Il n’est donc pas obligatoire de les vérifier de votre côté, mais vous le pouvez, et nous le recommandons pour les opérations qui engagent une personne.

Ce que contient la preuve

signedPayloadLe texte exact que le téléphone a signé : excelid:v1:{orderRef}:{userVisibleData}:APPROVE, où userVisibleData est le texte Base64 que vous avez envoyé (vide si vous n’en avez pas envoyé).
signatureLa signature ECDSA (courbe P-256, SHA-256), encodée en DER puis en Base64.
devicePublicKeyLa clé publique de l’appareil, au format X.509 (SubjectPublicKeyInfo) encodé en Base64.
completionTime, userL’heure de la confirmation et la personne identifiée.

La clé privée correspondante est générée dans le matériel sécurisé du téléphone et n’en sort jamais. Pour confirmer, la personne déverrouille avec son empreinte, ou saisit son code de sécurité, vérifié par ExcelID.

Comment vérifier

  1. Le texte signé est le vôtre. Reconstruisez signedPayload à partir de ce que vous avez envoyé (orderRef et userVisibleData) et comparez. C’est ce qui prouve que la personne a signé votre texte, pas un autre.
  2. La signature est valide. Vérifiez-la avec devicePublicKey.
  3. Le contexte est cohérent. Comparez device.ipAddress à endUserIp pour un parcours sur le même appareil, et vérifiez que completionTime est dans la durée de la demande.
import { verify } from 'node:crypto';

function verifyProof(sent, completionData) {
  // 1. Le texte signé doit être exactement celui que vous avez demandé
  const expected = `excelid:v1:${sent.orderRef}:${sent.userVisibleData ?? ''}:APPROVE`;
  if (completionData.signedPayload !== expected) return false;

  // 2. La signature doit être valide pour la clé de l'appareil
  return verify(
    'sha256',
    Buffer.from(completionData.signedPayload, 'utf8'),
    { key: Buffer.from(completionData.devicePublicKey, 'base64'), format: 'der', type: 'spki' },
    Buffer.from(completionData.signature, 'base64'),
  );
}

En Java, Signature.getInstance("SHA256withECDSA") avec une clé lue par X509EncodedKeySpec fait la même vérification. En PHP ou en Python, utilisez openssl_verify avec OPENSSL_ALGO_SHA256 sur la clé convertie en PEM, ou la bibliothèque cryptography avec ECDSA(hashes.SHA256()).

Que conserver

Notre service ne conserve pas les données de la signature. Vous êtes responsable de conserver ce dont vous avez besoin, conformément à la réglementation applicable. Pour prouver une opération plus tard, gardez avec chaque transaction : orderRef, le texte envoyé, signedPayload, signature, devicePublicKey, completionTime et user. Avec ces éléments, n’importe qui peut refaire la vérification.

Vérification de la carte numérique

ExcelID vérifie toutes les signatures, y compris les certificats : vous n’avez pas à les vérifier. Pour chaque vérification réussie, une preuve d’identification vous est fournie, au format JSON signé : l’identité vérifiée, l’heure de l’identification de l’utilisateur (identifiedAt), l’heure de votre vérification du code QR (verifiedAt), et une référence de vérification (verificationId). Voir la référence.