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
signedPayload | Le 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é). |
signature | La signature ECDSA (courbe P-256, SHA-256), encodée en DER puis en Base64. |
devicePublicKey | La clé publique de l’appareil, au format X.509 (SubjectPublicKeyInfo) encodé en Base64. |
completionTime, user | L’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
- Le texte signé est le vôtre. Reconstruisez
signedPayloadà partir de ce que vous avez envoyé (orderRefetuserVisibleData) et comparez. C’est ce qui prouve que la personne a signé votre texte, pas un autre. - La signature est valide. Vérifiez-la avec
devicePublicKey. - Le contexte est cohérent. Comparez
device.ipAddressàendUserIppour un parcours sur le même appareil, et vérifiez quecompletionTimeest 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.