Encriptación de extremo a extremo

Descripción general de HPKE

La encriptación de clave pública híbrida (HPKE) es un mecanismo criptográfico que se usa para encriptar una carga útil en una clave pública. Se denomina "híbrido" porque la carga útil se encripta con una clave simétrica, y HPKE deriva esta clave simétrica con un intercambio de claves Diffie-Hellman.

Modos de HPKE

  • Base: Es el modo más común.
  • Autenticación: Usa la clave privada del remitente para la autenticación.
  • PSK: Usa una clave precompartida de alta entropía para la autenticación.
  • AuthPSK: Combina la clave privada del remitente y una clave precompartida de alta entropía para la autenticación.

Interacción en el modo básico (dispositivo y autoridad emisora)

A continuación, se muestra un flujo de alto nivel que describe una situación en la que un dispositivo quiere enviar datos sensibles a una autoridad emisora.

Paso 1: Generación e intercambio de claves

  • La autoridad emisora crea un par de claves de encriptación: IE₍ₚₖ, ₛₖ₎, donde ₚₖ es la clave pública y ₛₖ es la clave privada.
  • La autoridad emisora envía y comparte la clave pública (IEₚₖ) con el dispositivo.

Paso 2: Encripta y envía

El dispositivo ejecuta Hybrid-Encrypt(Data, IEₚₖ, Context).

  • El dispositivo genera un par de claves asimétricas efímeras para la encriptación: ₍Eₚₖ, Eₛₖ₎.
  • Deriva una clave AES simétrica, conocida como secreto compartido (SS), con la fórmula SS = ExtractAndExpand(Diffie-Hellman(IEₚₖ, Eₛₖ), _Context).
  • El dispositivo encripta los datos con este secreto compartido para producir encData.
  • Comparte { encData, Eₚₖ } y lo envía a la autoridad emisora.

Paso 3: Desencriptar

Actualmente, la autoridad emisora tiene IE₍ₚₖ, ₛₖ₎ y recibió { encData, Eₚₖ }. Ejecuta Hybrid-Decrypt(encData, Eₚₖ, IEₛₖ, Context).

  • Deriva la clave AES simétrica (secreto compartido, SS) con la fórmula SS = ExtractAndExpand(Diffie-Hellman(IEₛₖ, Eₚₖ), _Context).
  • Desencripta encData con SS.

Terminología

Término Definición y detalles
DIₚₖ Cadena de certificados de clave de credencial (certificados de identidad del dispositivo): Es una cadena de certificados X.509 para la CredentialKey que identifica la credencial ante la autoridad emisora.
  • Contiene una extensión de certificación de Android Keystore que describe la clave y su hardware de seguridad.
  • Se usa para demostrar la propiedad de la credencial.
  • La entidad emisora DEBE examinar cuidadosamente esta cadena de certificados (p.ej., verificar que el certificado raíz sea conocido, que esté presente Tag::IDENTITY_CREDENTIAL_KEY, que esté presente el desafío, que Tag::ATTESTATION_APPLICATION_ID sea correcto, que el arranque verificado esté habilitado y que el estado de la firma o revocación sea correcto).
Aₚₖ Claves de autenticación: Claves de autenticación X.509 dinámicas que requieren certificación, cada una firmada por CredentialKey.
  • El emisor genera datos de autenticación estáticos para cada clave, los envía al dispositivo y el dispositivo los almacena a través de storeStaticAuthenticationData.
  • Esta clave es una carga útil que se encriptará, no se usará directamente para la E2EE.
  • Los campos X.509 no opcionales incluyen: versión (INTEGER 2), serialNumber (INTEGER 1), firma (ECDSA), sujeto (CN establecido en "Android Identity Credential Authentication Key"), emisor (CN establecido en "Android Identity Credential Key"), validez (hora actual hasta 365 días en el futuro) y subjectPublicKeyInfo (debe contener la clave pública certificada).
IE₍ₛₖ,ₚₖ₎ Par de claves de encriptación del emisor: Es una clave asimétrica que genera el emisor. El dispositivo usa esta clave para realizar la encriptación híbrida a la entidad emisora.
II₍ₛₖ,ₚₖ₎ Par de claves de identidad del emisor: Es una clave asimétrica que genera el emisor. El dispositivo usa esta clave para verificar la identidad de la entidad emisora.
DE₍ₛₖ,ₚₖ₎ Par de claves de encriptación del dispositivo: Es una clave asimétrica efímera que genera el dispositivo por solicitud. La entidad emisora usa esta clave para realizar el cifrado híbrido en el dispositivo.
FE₍ₛₖ,ₚₖ₎ Clave de encriptación de campo: Es una clave asimétrica efímera que se genera por campo durante la encriptación híbrida.

E2EE en la API de Google Digital Credential Provisioning

Paso 1: Obtén la clave de identidad del emisor y la clave de encriptación

  • Extremos de API: /getIdentityKey y /getHybridEncryptionKey.
  • Devoluciones: IIₚₖ, IEₚₖ.

Paso 2: Obtén el nonce de registro del dispositivo

  • Genera un ID de referencia del dispositivo (deviceReferenceId).
  • Extremo de API: Llama a /getDeviceRegistrationNonce(deviceReferenceId).
  • Devuelve nonce.

Paso 3: Registra el dispositivo

  • Configura la credencial de identidad de Android.
  • Llama a IC.getCredentialKeyCertificateChain(nonce), que devuelve un objeto DIₚₖ incorporado con un nonce.
  • Extremo de API: Llama a /registerDevice(deviceReferenceId, DIₚₖ).
  • La autoridad emisora debe examinar cuidadosamente esta cadena de certificados para asegurarse de que el certificado raíz sea conocido, el desafío esté presente, el ATTESTATION_APPLICATION_ID coincida con la app esperada, el arranque verificado esté habilitado y las firmas o revocaciones sean válidas.
  • Devuelve ack.

Paso 4a: Envía la solicitud de prueba

  • Para cada campo, haz lo siguiente:
    • Ejecuta Hybrid-Encrypt(Data, IEₚₖ, Context=FieldName) para generar encData y FEₚₖ.
    • Llama a IC.proveOwnership(SHA-256(Data + IEₚₖ)) para obtener sigData (una estructura de datos COSE_Sign1 firmada por CredentialKey, con la carga útil establecida en ProofofOwnership).
  • Extremo de API: Llama a /proofUser([encData, sigData, FEₚₖ]).
  • La autoridad emisora verifica sigData con DIₚₖ.
  • La autoridad emisora ejecuta Hybrid-Decrypt(encData, FEₚₖ, IEₛₖ, Context=FieldName) para generar Data.
  • Devuelve ack.

Paso 4b: Actualización del estado de la revisión

  • Notifica a Google una actualización del estado de la prueba con deviceReferenceId y proofingId.
  • Extremo de API: Llama a /notifyProofingStatusUpdateAvailable(...).
  • Los servidores de Google recuperan el estado de la prueba del emisor llamando a /getProofingStatus(deviceReferenceId, proofingId).

Paso 5: Proporciona credenciales

  • Llama a IC.proveOwnership(SHA-256(DEₚₖ)) para obtener sigDEₚₖ (estructura COSE_Sign1 firmada por CredentialKey/DIₛₖ con la carga útil ProofofOwnership).
  • Extremo de API: Envía deviceReferenceId, proofingId, credentialId y sigDEₚₖ a la entidad emisora a través de /provisionCredential(dRId, pId, cId, DEₚₖ, sigDEₚₖ).
  • Lado del emisor:
    • Verifica sigDEₚₖ con DIₚₖ.
    • Encripta la credencial (PersonalizationData + AccessControlProfiles).
    • Ejecuta Hybrid-Encrypt(Cred, DEₚₖ, Context=FieldName) para generar encCred y FEₚₖ.
    • Crea sigCred firmando COSE_Sign1 SHA-256(Cred + DEₚₖ) con IIₛₖ.
    • Devuelve encCred, sigCred y FEₚₖ.
  • Lado del dispositivo:
    • Verifica sigCred con IIₚₖ.
    • Ejecuta Hybrid-Decrypt(encCred, FEₚₖ, DEₛₖ, Context=FieldName) para extraer Cred.
    • Llama a WC.personalize(Cred) para obtener sigCredReceipt (COSE_Sign1 firmado por CredentialKey, carga útil ProofOfProvisioning).
    • Ejecuta Hybrid-Encrypt(sigCredReceipt, DEₛₖ, Context=FieldName) para generar encReceipt y FE1ₚₖ.
    • Llama a IC.proveOwnership(SHA-256(encReceipt + IEₚₖ)) para obtener sigReceipt (COSE_Sign1 firmado por CredentialKey, carga útil ProofofOwnership).
    • Genera claves de autorización [Aₚₖ].

Paso 6: Genera MSO y StaticAuthData

  • Lado del dispositivo:
    • Para cada clave de autorización, ejecuta Hybrid-Encrypt(AuthKey, IEₚₖ, Context=FieldName) para generar encAuthKey y FEₚₖ.
    • Llama a IC.proveOwnership(SHA-256(AuthKey + IEₚₖ)) para obtener sigAuthKey.
    • Extremo de API: Llama a /provisionMSOs(.., encReceipt, sigReceipt, [encAuthKey, sigAuthKey, FEₚₖ], DEₚₖ, sigDEₚₖ).
  • Lado del emisor:
    • Verifica sigReceipt y sigDEₚₖ con DIₚₖ para verificar el recibo.
    • Para cada [encAuthKey, sigAuthKey, FEₚₖ], ejecuta Hybrid-Decrypt(encAuthKey, FEₚₖ, IEₛₖ, Context=FieldName) para extraer el AuthKey.
    • Genera el MSO (incluida la clave de autorización) y genera staticAuthData (SAD), incluidos digestIdMapping y issuerAuth.
    • Ejecuta Hybrid-Encrypt(SAD, DEₚₖ, Context=FieldName) para generar encSAD y FEₚₖ.
    • Firma con COSE_Sign1 SHA-256(SAD + DEₚₖ) con IIₛₖ para producir sigSAD.
    • Muestra [encSAD, sigSAD, FEₚₖ].
  • Lado del dispositivo (final):
    • Para cada encSAD, sigSAD, FEₚₖ que se devuelva, verifica sigSAD con IIₚₖ.
    • Ejecuta Hybrid-Decrypt(encSAD, FEₚₖ, DEₛₖ, Context=FieldName) para extraer SAD.
    • Llama a storeStaticAuthenticationData con SAD para finalizar el proceso.

Requisitos de rotación

La clave de identidad del emisor se debe rotar una vez al año. Durante el período de rotación, la entidad emisora debe alojar la clave anterior y la nueva, y el dispositivo confiará en ambas claves. Una vez que la entidad emisora haya cambiado por completo a la nueva clave de identidad de la entidad emisora, esta deberá dejar de alojar la clave anterior y el dispositivo ya no confiará en ella.

La clave de encriptación híbrida de la entidad emisora se debe rotar una vez cada 3 meses. Durante el período de rotación, la entidad emisora debe comenzar a alojar solo la clave nueva, y el dispositivo comenzará a encriptar con la clave nueva. La entidad emisora debe admitir el descifrado con la clave anterior y la nueva durante un período razonable para evitar el tiempo de inactividad.

Valores de AAD

Usa los siguientes valores de contexto para AAD.

Campos Valores de contexto
preAuthorizationCode PreAuthorizationCode

Para obtener los valores del AAD de otros tipos de evidencia, comunícate con tu representante de Google.

Vectores de prueba para la encriptación de extremo a extremo de credenciales digitales

Los vectores de prueba para la encriptación de extremo a extremo del ID digital son un conjunto de mensajes predefinidos y sus versiones encriptadas que se usan para probar la corrección del algoritmo de encriptación.

Parámetros de encriptación de HPKE:

  KEM = DHKEM(P-256, HKDF-SHA256), id = 0x0010
  KDF = HKDF-SHA256, id = 0x0001
  AEAD = AES-256-GCM, id = 0x0002
  • Los datos asociados adicionales (AAD) son una entrada para HPKE CtxInfo. Los AAD para la encriptación AES (simétrica) son NULL (vacíos).
  • Los datos binarios en las estructuras JSON están codificados en Base64, y los valores intermedios de este documento están codificados en hexadecimal.
  • Formato de firma en esta documentación:
    • Dispositivo → entidad emisora, entidad emisora → dispositivo: COSE_Sign1

Cliente → Emisor, Emisor → Cliente

Ejemplo de comunicación en ambas direcciones.

Ejemplo de campo de solicitud encriptado

Texto sin formato = "Hello, world!", datos asociados = "field1"

{
  "field1": {
    "encryptedValue": "yGFWT9MkgV6/IZfYUZjqGEf3k2M/HQhz9XnKWyI\u003d",
    "encapsulatedKey": "BOpBC2LGh1RWk99iIm6ISsaPbtrNnu9hIgHeby5khXY6PG+ZmDOYmorEUne7uzhDmD6JCVYyME1+A8ueJ0CZvAI\u003d",
    "signature": "hEOhASagWE+EcFByb29mT2ZPd25lcnNoaXB4GG9yZy5pc28uMTgwMTMtNS4yMDE5Lm1kbFggTOsHXzsgDgh/2chekltve8rJsFFb6DTtBjY98H58gjb0WEBUnwNT3gvbavE8QoaAKaELqF7JKqh0+ivPisQg6RerTmx8Zsk/tCjW/y1cxhGKatl2EjASemns67r1/lZumEqZ",
    "recipientKeyId": "4D7E5D8B9460810A"
  }
}

Análisis detallado:

>> plaintext = "Hello, world!"
48656C6C6F2C20776F726C6421

>> associated-data = "field1"
6669656C6431

## AES key = 
2831F07355FEAB3A8654EADEEC2E2D497B9FD3C76CB8B5E776DB03583F302332

## AES initialization vector = 
64620929032C85B352156528

## AES associated data (empty) = 

>> encrypted-value = HPKE(plaintext, associated-data)
C861564FD324815EBF2197D85198EA1847F793633F1D0873F579CA5B22

>> encapsulated-key (ephemeral) =
04EA410B62C687545693DF62226E884AC68F6EDACD9EEF612201DE6F2E648576
3A3C6F999833989A8AC45277BBBB3843983E89095632304D7E03CB9E274099BC
02

>> tbs-data = plaintext || issuer-encryption-key
48656C6C6F2C20776F726C6421044F1FC726AFFFC32EAA1275B5B49D67018ADE
7D8599DE53FE049996C0EC45D26EA3375BF467B631CF8AB0F284E4B628E287C8
99107465529DCA93DCF5F7A7EA5F

>> sha-256(tbs-data)
4CEB075F3B200E087FD9C85E925B6F7BCAC9B0515BE834ED06363DF07E7C8236

>> proof-of-ownership (cbor array)
847050726F6F664F664F776E65727368697078186F72672E69736F2E31383031
332D352E323031392E6D646C58204CEB075F3B200E087FD9C85E925B6F7BCAC9
B0515BE834ED06363DF07E7C8236F4

>> signature (cose_sign1)
8443A10126A0584F847050726F6F664F664F776E65727368697078186F72672E
69736F2E31383031332D352E323031392E6D646C58204CEB075F3B200E087FD9
C85E925B6F7BCAC9B0515BE834ED06363DF07E7C8236F45840549F0353DE0BDB
6AF13C42868029A10BA85EC92AA874FA2BCF8AC420E917AB4E6C7C66C93FB428
D6FF2D5CC6118A6AD9761230127A69ECEBBAF5FE566E984A99

Clave de encriptación de dispositivo o emisor de muestra

{
  "deviceEncryptionKey": {
    "publicKey": "BP5vgzZ+UTozzb6cmaZ8tkof2nh2Q2oHVAsggvc8V8SR6C9wWU6W9JEq0AmsGbou3jYw4BLftJP2XQeCB3uD/to\u003d",
    "signature": "hEOhASagWE+EcFByb29mT2ZPd25lcnNoaXB4GG9yZy5pc28uMTgwMTMtNS4yMDE5Lm1kbFgg7641tE2UhuT5Tw9p1u9yEDpyYzDf1Jf9m//mIQfd4Kf0WEBB7PvHbfWozCYlFUqMJ6x+QWzoUU/OT10F1J1zoB8MTELPqfC9acF6IX5oMmsgLn2RtPS7QfylRqEAfG0FyYli",
    "keyIdentifier": "F29BA6298BC93156D2D50EA7E2233FC4"
  }
}

Análisis detallado:

>> ec-point
04FE6F83367E513A33CDBE9C99A67CB64A1FDA7876436A07540B2082F73C57C4
91E82F70594E96F4912AD009AC19BA2EDE3630E012DFB493F65D0782077B83FE
DA

>> sha-256(ec-point)
EFAE35B44D9486E4F94F0F69D6EF72103A726330DFD497FD9BFFE62107DDE0A7

>> proof-of-ownership (cbor array)
847050726F6F664F664F776E65727368697078186F72672E69736F2E31383031
332D352E323031392E6D646C5820EFAE35B44D9486E4F94F0F69D6EF72103A72
6330DFD497FD9BFFE62107DDE0A7F4

>> signature (cose_sign1)
8443A10126A0584F847050726F6F664F664F776E65727368697078186F72672E
69736F2E31383031332D352E323031392E6D646C5820EFAE35B44D9486E4F94F
0F69D6EF72103A726330DFD497FD9BFFE62107DDE0A7F4584041ECFBC76DF5A8
CC2625154A8C27AC7E416CE8514FCE4F5D05D49D73A01F0C4C42CFA9F0BD69C1
7A217E68326B202E7D91B4F4BB41FCA546A1007C6D05C98962

Claves y certificados de prueba

Puedes consultar las siguientes claves de prueba durante la implementación.

Clave de identidad del emisor de prueba (firma)

  • Clave privada

    -----BEGIN PRIVATE KEY-----
    MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCBSDJqogkjkqD7O8mX5
    FcUvwOxFp0CxPOGnMD8BfSbcyw==
    -----END PRIVATE KEY-----

  • Certificado de clave pública

    -----BEGIN CERTIFICATE-----
    MIIBkDCCATegAwIBAgIIIi7oI6UIMEYwCgYIKoZIzj0EAwIwNzE1MDMGA1UEAxMs
    Ly9leHBlcmltZW50YWwvdXNlcnMvaWdhcmlldi9jcnlwdG86U2lnbkNlcnQwHhcN
    MjIxMjEyMjAyNDA0WhcNMjMxMjEyMjAyNDA0WjBSMQ8wDQYDVQQLEwZXYWxsZXQx
    DzANBgNVBAoTBkdvb2dsZTEuMCwGA1UEAxMlVEVTVCBEQVRBIElzc3VlciBJZGVu
    dGl0eSAoU2lnbmF0dXJlKTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHV9uYlT
    wGV3UB+SM62fXcW6QzFfSoxq2gU34xG+XVMjxk9JDP9UTE34zX72WIfZ9nqRN9y/
    SsbSxw5WrSQdGY2jEjAQMA4GA1UdDwEB/wQEAwIHgDAKBggqhkjOPQQDAgNHADBE
    AiBnMgsyJhdfelqpOFvT4H63dWSrNPxyrKEdxTwbYMfCKQIgOh2n2gCETH07tjxR
    l9HQfUcb6vqQY4EoPz2O0wNs6yc=
    -----END CERTIFICATE-----

Clave de encriptación de la entidad de certificación de prueba

  • Clave privada

    -----BEGIN PRIVATE KEY-----
    MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCDZMUnwmygUdKXSujXS
    ye7YbVnk1Zy/qwnQtzlZs3pQFQ==
    -----END PRIVATE KEY-----

  • Certificado de clave pública

    -----BEGIN CERTIFICATE-----
    MIIBpjCCAUygAwIBAgIIIVwLEOrrzm0wCgYIKoZIzj0EAwIwNzE1MDMGA1UEAxMs
    Ly9leHBlcmltZW50YWwvdXNlcnMvaWdhcmlldi9jcnlwdG86U2lnbkNlcnQwHhcN
    MjIxMjIyMjA1NzIzWhcNMjMxMjIyMjA1NzIzWjBIMQ8wDQYDVQQLEwZXYWxsZXQx
    DzANBgNVBAoTBkdvb2dsZTEkMCIGA1UEAxMbVEVTVCBEQVRBIElzc3VlciBFbmNy
    eXB0aW9uMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETx/HJq//wy6qEnW1tJ1n
    AYrefYWZ3lP+BJmWwOxF0m6jN1v0Z7Yxz4qw8oTktijih8iZEHRlUp3Kk9z196fq
    X6MxMC8wDgYDVR0PAQH/BAQDAgMYMB0GA1UdDgQWBBQKFb7K4eZjtp70DLoCHWe7
    v/toXzAKBggqhkjOPQQDAgNIADBFAiEAwN1gOwiSx3999Zxc980eKv3p2H8kA4J6
    9aWH6jiVaGMCIA7lLkebHFhD0fItGqXv1f5fwiMBV0605KZFh5+RBj/W
    -----END CERTIFICATE-----

Clave de identidad del dispositivo (firma), también conocida como clave de credencial

  • Cadena de certificados de clave pública (X.509)
    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

Consulta la documentación de Key Attestation de Android para obtener más detalles.

Clave de encriptación del dispositivo

  • Clave privada

    -----BEGIN PRIVATE KEY-----
    MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCBJY8n7A1v+thMM63np
    m0wr+rAoMFEYmMZ+mWzBIj2CiQ==
    -----END PRIVATE KEY-----

  • Certificado de clave pública

    -----BEGIN CERTIFICATE-----
    MIIBhzCCAS2gAwIBAgIIAyJ+NkzueMUwCgYIKoZIzj0EAwIwNzE1MDMGA1UEAxMs
    Ly9leHBlcmltZW50YWwvdXNlcnMvaWdhcmlldi9jcnlwdG86U2lnbkNlcnQwHhcN
    MjMwMTA5MjMwOTIwWhcNMjQwMTA5MjMwOTIwWjBIMQ8wDQYDVQQLEwZXYWxsZXQx
    DzANBgNVBAoTBkdvb2dsZTEkMCIGA1UEAxMbVEVTVCBEQVRBIERldmljZSBFbmNy
    eXB0aW9uMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/m+DNn5ROjPNvpyZpny2
    Sh/aeHZDagdUCyCC9zxXxJHoL3BZTpb0kSrQCawZui7eNjDgEt+0k/ZdB4IHe4P+
    2qMSMBAwDgYDVR0PAQH/BAQDAgMYMAoGCCqGSM49BAMCA0gAMEUCIQD9syewRhvK
    KcyaM7fLwuuCidpiIVd/CZxFCLOo9adCPAIgNd3FMcT710KtYptJBZQ/i7N+C7G5
    pLbHmAUoFwNuB2E=
    -----END CERTIFICATE-----