Seguridad y privacidad
Modelo de seguridad
La wallet está diseñada con el principio de custodia local: las claves privadas y las credenciales nunca abandonan el dispositivo del holder, salvo cuando el holder decide presentar una credencial a un verificador.
Almacenamiento de claves privadas
Las claves privadas del holder se almacenan en el almacén seguro del sistema operativo:
| Plataforma | Almacén |
|---|---|
| iOS | iOS Keychain |
| Android | Android KeyStore |
Estos almacenes están protegidos por el hardware del dispositivo (Secure Enclave en iOS, StrongBox o TEE en Android cuando está disponible). Las claves privadas nunca se escriben en el sistema de ficheros del dispositivo ni se transmiten a ningún servidor.
Cifrado de credenciales en reposo
Las credenciales almacenadas en la wallet se cifran con AES-256 antes de guardarse en el almacenamiento local del dispositivo. La clave de cifrado deriva del material de clave almacenado en el Keychain / KeyStore.
Autenticación de acceso
Para acceder a la wallet el holder debe autenticarse con:
- PIN de 6 dígitos (obligatorio).
- Biometría (Face ID, Touch ID, Fingerprint) — opcional, habilitada por el holder.
La wallet se bloquea automáticamente al pasar a segundo plano.
Prueba de posesión
Cuando la wallet solicita una credencial a un emisor (OID4VCI), adjunta una prueba de posesión (proof of possession): un JWT firmado con la clave privada del holder que demuestra que el holder controla el DID al que se emitirá la credencial. Esto impide que un tercero solicite credenciales en nombre del holder.
Cuando la wallet presenta credenciales a un verificador (OID4VP), firma la VP con la clave privada del holder. El verificador puede comprobar que la presentación fue creada por el holder legítimo y que no ha sido manipulada.
Modelo de privacidad
Minimización de datos
La wallet solo transmite datos al exterior en dos momentos:
- Recepción de credencial: la wallet se comunica con el endpoint del emisor (OID4VCI) para obtener la credencial.
- Presentación de credencial: la wallet envía la VP al endpoint del verificador (
response_uri) después de que el holder confirme el consentimiento.
En ningún caso la wallet comunica el contenido de las credenciales a terceros, ni siquiera al equipo ISBE.
La wallet no envía telemetría, no sincroniza credenciales en la nube y no comparte el DID del holder con ningún servicio de directorio. Todo el almacenamiento es local.
Consentimiento explícito
Antes de enviar cualquier presentación, la wallet muestra al holder exactamente qué credencial o atributos se van a compartir y con qué verificador. El holder debe confirmar activamente el envío. No existe ningún mecanismo de presentación automática sin confirmación.
Divulgación selectiva
La divulgación selectiva (compartir solo un subconjunto de atributos de una credencial) no está disponible en la implementación actual. La wallet presenta siempre la credencial completa. Los formatos vc+sd-jwt y ldp_vc que habilitarían esta funcionalidad no están implementados.
Correlación de presentaciones
Cada VP incluye el DID del holder como campo iss. Esto significa que si el mismo holder presenta credenciales a múltiples verificadores que colaboran entre sí, pueden correlacionar las presentaciones mediante el DID.
Para casos de uso que requieran mayor privacidad, se recomienda consultar con el equipo ISBE las opciones disponibles.
Verificación de revocación
La wallet verifica la firma del emisor y la fecha de expiración de la credencial en el momento de la recepción. La wallet no verifica el estado de revocación de las credenciales almacenadas (el campo credentialStatus no se comprueba). Si una credencial ha sido revocada por el emisor después de ser emitida, la wallet no lo detectará automáticamente.
Canal de comunicación
Todas las comunicaciones de la wallet con emisores y verificadores se realizan exclusivamente sobre HTTPS. La wallet rechaza cualquier endpoint que no use TLS.
Actualizaciones de seguridad
Las actualizaciones de seguridad se distribuyen a través de la App Store y Google Play. Se recomienda mantener la wallet actualizada.