엔드 투 엔드 암호화

HPKE 개요

하이브리드 공개 키 암호화 (HPKE)는 공개 키로 페이로드를 암호화하는 데 사용되는 암호화 메커니즘입니다. 페이로드 자체가 대칭 키로 암호화되고 HPKE가 디피-헬만 키 교환을 사용하여 이 대칭 키를 파생시키기 때문에 '하이브리드'라고 합니다.

HPKE 모드

  • 기본: 가장 일반적인 모드입니다.
  • 인증: 인증에 발신자의 비공개 키를 사용합니다.
  • PSK: 인증에 사전 공유된 높은 엔트로피 키를 사용합니다.
  • AuthPSK: 인증을 위해 발신자의 비공개 키와 사전 공유된 높은 엔트로피 키를 결합합니다.

기본 모드 상호작용 (기기 및 발급 기관)

기기에서 발급 기관에 민감한 데이터를 전송하려는 시나리오를 보여주는 대략적인 흐름은 다음과 같습니다.

1단계: 키 생성 및 교환

  • 발급 기관은 암호화 키 쌍 IE₍ₚₖ, ₛₖ₎을 만듭니다. 여기서 ₚₖ는 공개 키이고 ₛₖ는 비공개 키입니다.
  • 발급 기관은 공개 키 (IEₚₖ)를 기기에 전송하고 공유합니다.

2단계: 암호화 및 전송

기기가 Hybrid-Encrypt(Data, IEₚₖ, Context)를 실행합니다.

  • 기기에서 암호화를 위한 임시 비대칭 키 쌍을 생성합니다(₍Eₚₖ, Eₛₖ₎).
  • SS = ExtractAndExpand(Diffie-Hellman(IEₚₖ, Eₛₖ), _Context) 공식을 사용하여 공유 보안 비밀 (SS)이라고 하는 대칭 AES 키를 파생합니다.
  • 기기는 이 공유 보안 비밀을 사용하여 데이터를 암호화하여 encData를 생성합니다.
  • { encData, Eₚₖ }를 공유하고 발급 기관에 전송합니다.

3단계: 복호화

발급 기관은 현재 IE₍ₚₖ, ₛₖ₎ 및 수신된 { encData, Eₚₖ }를 보유하고 있습니다. Hybrid-Decrypt(encData, Eₚₖ, IEₛₖ, Context)를 실행합니다.

  • SS = ExtractAndExpand(Diffie-Hellman(IEₛₖ, Eₚₖ), _Context) 공식을 사용하여 대칭 AES 키 (공유 보안 비밀, SS)를 파생합니다.
  • SS를 사용하여 encData을 복호화합니다.

용어

용어 정의 및 세부정보
DIₚₖ 인증 키 인증서 체인 (기기 ID 인증서): 인증서를 발급 기관에 식별하는 CredentialKey의 X.509 인증서 체인입니다.
  • 키와 보안 하드웨어를 설명하는 Android 키 저장소 증명 확장 프로그램을 포함합니다.
  • 사용자 인증 정보의 소유권을 증명하는 데 사용됩니다.
  • 발급자는 이 인증서 체인을 주의 깊게 검사해야 합니다(예: 루트 인증서가 잘 알려져 있는지, Tag::IDENTITY_CREDENTIAL_KEY 존재, 챌린지 존재, 올바른 Tag::ATTESTATION_APPLICATION_ID, 자체 검사 부팅 사용 설정, 서명/해지 상태 확인)(MUST).
Aₚₖ 인증 키: 인증이 필요하고 CredentialKey로 서명된 동적 X.509 인증 키입니다.
  • 발급자는 각 키의 정적 인증 데이터를 생성하여 기기에 전송하고 기기는 storeStaticAuthenticationData를 통해 이를 저장합니다.
  • 이 키는 암호화될 페이로드이며 E2EE에 직접 사용되지 않습니다.
  • 필수 X.509 필드에는 버전 (정수 2), serialNumber (정수 1), 서명 (ECDSA), subject (CN이 'Android Identity Credential Authentication Key'로 설정됨), issuer (CN이 'Android Identity Credential Key'로 설정됨), validity (현재 시간부터 365일 후까지), subjectPublicKeyInfo (증명된 공개 키를 포함해야 함)가 포함됩니다.
IE₍ₛₖ,ₚₖ₎ 발급자 암호화 키 쌍: 발급자가 생성한 비대칭 키입니다. 기기는 이 키를 사용하여 발급자에게 하이브리드 암호화를 실행합니다.
II₍ₛₖ,ₚₖ₎ 발급자 ID 키 쌍: 발급자가 생성한 비대칭 키입니다. 기기는 이 키를 사용하여 발급자의 ID를 확인합니다.
DE₍ₛₖ,ₚₖ₎ 기기 암호화 키 쌍: 요청에 따라 기기에서 생성된 일시적인 비대칭 키입니다. 발급자는 이 키를 사용하여 기기에 하이브리드 암호화를 실행합니다.
FE₍ₛₖ,ₚₖ₎ 필드 암호화 키: 하이브리드 암호화 중에 필드별로 생성되는 임시 비대칭 키입니다.

Google 디지털 사용자 인증 정보 프로비저닝 API의 E2EE

1단계: 발급자 ID 키 및 암호화 키 가져오기

  • API 엔드포인트: /getIdentityKey, /getHybridEncryptionKey
  • 반환: IIₚₖ, IEₚₖ.

2단계: 기기 등록 nonce 가져오기

  • 기기 참조 ID (deviceReferenceId)를 생성합니다.
  • API 엔드포인트: /getDeviceRegistrationNonce(deviceReferenceId) 호출
  • 반환: nonce

3단계: 기기 등록

  • Android ID 사용자 인증 정보를 설정합니다.
  • nonce가 삽입된 DIₚₖ을 반환하는 IC.getCredentialKeyCertificateChain(nonce)를 호출합니다.
  • API 엔드포인트: /registerDevice(deviceReferenceId, DIₚₖ) 호출
  • 발급 기관은 이 인증서 체인을 주의 깊게 검사하여 루트 인증서가 잘 알려져 있고, 챌린지가 있으며, ATTESTATION_APPLICATION_ID가 예상 앱과 일치하고, 확인된 부팅이 사용 설정되어 있으며, 서명 또는 취소가 유효한지 확인해야 합니다.
  • 반환: ack

4a단계: 교정 요청 보내기

  • 각 필드에 대해 다음을 수행합니다.
    • Hybrid-Encrypt(Data, IEₚₖ, Context=FieldName)를 실행하여 encDataFEₚₖ를 생성합니다.
    • IC.proveOwnership(SHA-256(Data + IEₚₖ))를 호출하여 sigData (CredentialKey로 서명되고 페이로드가 ProofofOwnership으로 설정된 COSE_Sign1 데이터 구조)을 가져옵니다.
  • API 엔드포인트: /proofUser([encData, sigData, FEₚₖ]) 호출
  • 발급 기관은 DIₚₖ을 사용하여 sigData를 확인합니다.
  • 발급 기관은 Hybrid-Decrypt(encData, FEₚₖ, IEₛₖ, Context=FieldName)를 실행하여 Data를 생성합니다.
  • 반환: ack

4b단계: 교정 상태 업데이트

  • deviceReferenceIdproofingId을 사용하여 교정 상태 업데이트를 Google에 알립니다.
  • API 엔드포인트: /notifyProofingStatusUpdateAvailable(...) 호출
  • Google 서버는 /getProofingStatus(deviceReferenceId, proofingId)를 호출하여 발급자로부터 증빙 상태를 가져옵니다.

5단계: 사용자 인증 정보 프로비저닝

  • IC.proveOwnership(SHA-256(DEₚₖ))를 호출하여 sigDEₚₖ (페이로드 ProofofOwnership으로 CredentialKey/DIₛₖ로 서명된 COSE_Sign1 구조)을 가져옵니다.
  • API 엔드포인트: /provisionCredential(dRId, pId, cId, DEₚₖ, sigDEₚₖ)를 통해 발급자에게 deviceReferenceId, proofingId, credentialId, sigDEₚₖ를 전송합니다.
  • 발급기관 측:
    • DIₚₖ으로 sigDEₚₖ를 확인합니다.
    • 사용자 인증 정보 (PersonalizationData + AccessControlProfiles)를 암호화합니다.
    • Hybrid-Encrypt(Cred, DEₚₖ, Context=FieldName)를 실행하여 encCredFEₚₖ를 생성합니다.
    • IIₛₖ으로 COSE_Sign1 SHA-256(Cred + DEₚₖ)에 서명하여 sigCred 생성
    • encCred, sigCred, FEₚₖ 반환
  • 기기 측:
    • IIₚₖ을 사용하여 sigCred를 확인합니다.
    • Hybrid-Decrypt(encCred, FEₚₖ, DEₛₖ, Context=FieldName)를 실행하여 Cred를 추출합니다.
    • WC.personalize(Cred)를 호출하여 sigCredReceipt (CredentialKey로 서명된 COSE_Sign1, 페이로드 ProofOfProvisioning)을 가져옵니다.
    • encReceiptFE1ₚₖ를 생성하는 Hybrid-Encrypt(sigCredReceipt, DEₛₖ, Context=FieldName)를 실행합니다.
    • IC.proveOwnership(SHA-256(encReceipt + IEₚₖ))를 호출하여 sigReceipt (CredentialKey로 서명된 COSE_Sign1, 페이로드 ProofofOwnership)을 가져옵니다.
    • 인증 키 생성[Aₚₖ]

6단계: MSO 및 StaticAuthData 생성

  • 기기 측:
    • 각 인증 키의 경우 Hybrid-Encrypt(AuthKey, IEₚₖ, Context=FieldName)를 실행하여 encAuthKeyFEₚₖ를 생성합니다.
    • IC.proveOwnership(SHA-256(AuthKey + IEₚₖ))을 호출하여 sigAuthKey을 가져옵니다.
    • API 엔드포인트: /provisionMSOs(.., encReceipt, sigReceipt, [encAuthKey, sigAuthKey, FEₚₖ], DEₚₖ, sigDEₚₖ) 호출
  • 발급기관 측:
    • DIₚₖ를 기준으로 sigReceiptsigDEₚₖ를 확인하여 수신을 확인합니다.
    • [encAuthKey, sigAuthKey, FEₚₖ]에 대해 Hybrid-Decrypt(encAuthKey, FEₚₖ, IEₛₖ, Context=FieldName)를 실행하여 AuthKey를 추출합니다.
    • MSO (AuthKey 포함)를 생성하고 digestIdMapping 및 issuerAuth를 포함한 staticAuthData (SAD)를 생성합니다.
    • Hybrid-Encrypt(SAD, DEₚₖ, Context=FieldName)를 실행하여 encSADFEₚₖ를 생성합니다.
    • IIₛₖ를 사용하여 COSE_Sign1 SHA-256(SAD + DEₚₖ)으로 서명하여 sigSAD를 생성합니다.
    • [encSAD, sigSAD, FEₚₖ]를 반환합니다.
  • 기기 측 (최종):
    • 반환된 각 encSAD, sigSAD, FEₚₖ에 대해 IIₚₖsigSAD를 확인합니다.
    • Hybrid-Decrypt(encSAD, FEₚₖ, DEₛₖ, Context=FieldName)를 실행하여 SAD를 추출합니다.
    • SADstoreStaticAuthenticationData에 전화하여 프로세스를 완료합니다.

순환 요구사항

발급자 ID 키는 1년에 한 번 순환해야 합니다. 교체 기간 동안 발급자는 이전 키와 새 키를 호스팅해야 하며 기기는 이러한 키를 모두 신뢰합니다. 발급자가 새 발급자 ID 키를 사용하는 것으로 완전히 전환되면 발급자는 이전 키 호스팅을 중지해야 하며 기기는 더 이상 이를 신뢰하지 않습니다.

발급자 하이브리드 암호화 키는 3개월에 한 번 순환해야 합니다. 순환 기간 동안 발급자는 새 키만 호스팅하기 시작해야 하고 기기는 새 키로 암호화하기 시작합니다. 발급자는 다운타임을 방지하기 위해 적절한 기간 동안 이전 키와 새 키를 모두 사용하여 복호화를 지원해야 합니다.

AAD 값

AAD에 다음 컨텍스트 값을 사용합니다.

필드 컨텍스트 값
preAuthorizationCode PreAuthorizationCode

다른 증빙 유형의 AAD 값은 Google 담당자에게 문의하세요.

디지털 사용자 인증 정보 엔드 투 엔드 암호화 테스트 벡터

디지털 ID 엔드 투 엔드 암호화의 테스트 벡터는 암호화 알고리즘의 정확성을 테스트하는 데 사용되는 사전 정의된 메시지와 암호화된 버전의 집합입니다.

HPKE 암호화 매개변수:

  KEM = DHKEM(P-256, HKDF-SHA256), id = 0x0010
  KDF = HKDF-SHA256, id = 0x0001
  AEAD = AES-256-GCM, id = 0x0002
  • 추가 연결 데이터 (AAD)는 HPKE CtxInfo의 입력이며, AES (대칭) 암호화의 AAD는 NULL (비어 있음)입니다.
  • JSON 구조의 바이너리 데이터는 Base64로 인코딩되고 이 문서의 중간 값은 16진수로 인코딩됩니다.
  • 이 문서의 서명 형식:
    • 기기 → 발급기관, 발급기관 → 기기: COSE_Sign1

클라이언트 → 발급자, 발급자 → 클라이언트

양방향 통신 샘플

샘플 암호화된 요청 필드

일반 텍스트 = 'Hello, world!', 연결된 데이터 = 'field1'

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

자세히 알아보기:

>> 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

샘플 발급자 또는 기기 암호화 키

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

자세히 알아보기:

>> 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

테스트 키 및 인증서

구현 중에 다음 테스트 키를 참고할 수 있습니다.

테스트 발급자 ID (서명) 키

  • 비공개 키

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

  • 공개 키 인증서

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

테스트 발급자 암호화 키

  • 비공개 키

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

  • 공개 키 인증서

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

기기 ID(서명) 키(사용자 인증 정보 키라고도 함)

  • 공개 키 인증서 체인 (X.509)
    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

자세한 내용은 Android의 키 증명 문서를 참고하세요.

기기 암호화 키

  • 비공개 키

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

  • 공개 키 인증서

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