ID 사용자 인증 정보
Android 기기는 ID 사용자 인증 정보를 사용합니다. 라이브러리를 사용하여 기기에서 사용자 인증 정보를 안전하게 관리할 수 있습니다. ID 사용자 인증 정보 발급자가 사용해야 하는 여러 가지 보안 기능을 제공하는 라이브러리입니다. 하는 것이 가장 중요합니다.
서명된 nonce
ID 사용자 인증 정보 라이브러리에 'challenge'가 필요합니다. (이 API에서는 nonce)를 반환하며 기기 ID 인증서를 가져올 때 발급기관에 전송됩니다. RegisterDeviceRequest에 있습니다. 이 nonce는 서명되어 기기의 증명 확장에 삽입됩니다. 생성할 수 있습니다 이렇게 하면 발급기관이 날짜순을 확신할 수 있습니다. 서버에서 재생하지 않는 것을 확인할 수 있습니다. 서로 소통하는 것입니다.
액세스 제어 프로필
액세스 제어 프로필은 발급기관이 액세스 제어 프로필을 사용하여 ID 사용자 인증 정보에 저장된 데이터를 보호하려고 합니다. 이 발급기관은 데이터에 액세스하는 데 사용자 인증이 필요한지 지정할 수 있습니다. 요소, 사용자가 인증을 수행해야 하는 시간 등이 포함됩니다. 미래 (다음 제외) 이 기능을 사용할 수 있는 사례로는 데이터 요소에 액세스할 수 있습니다. 액세스 제어 형식 지정 방법에 관한 세부정보 프로필은 사용자 인증 정보 객체 형식에서 확인할 수 있습니다.
프로비저닝 증명
발급자는 프로비저닝 객체의 증명을 통해 사용자 인증 정보가 ID 사용자 인증 정보 내에 저장되었습니다. 발급기관은 MSO를 발급하지 않기 위해 MSO를 발급하고 프로비저닝할 수 있습니다 이 객체는 ID 사용자 인증 정보 문서에 자세히 설명되어 있습니다.
객체 형식
이러한 각 객체는 장치와 장치 사이에서 엔드 투 엔드 암호화됩니다 발급자 결과적으로 Google 서버는 이러한 객체 중 일부는 API 객체입니다. 예를 들어 사용자 인증 정보는 CBOR 형식이라기보다는 이는 Android 수준에서 예상되는 것이기 때문입니다.
사용자 인증 정보
사용자 인증 정보에는 데이터 요소와 데이터 요소에 액세스하는 방법이 포함됩니다. 그것은
provisionedData와 accessControlProfiles라는 두 가지 기본 객체가 포함되어 있습니다. 이
provisionedData는 대상 네임스페이스와 관련된 모든 네임스페이스를
사용자 인증 정보 유형입니다. 예를 들어 모바일 운전면허증의 경우
org.iso.18013.5.1 및 org.aamva.18013.5.1. 데이터 항목 및 값
관련 액세스 제어 프로필을 지정합니다 이것은
ID 목록 형태로 수행되며, 여기서 ID는
accessControlProfiles 목록 아래 예에서 각 데이터의 [0]는
항목은 색인 0이 아닌 ID가 0인 액세스 제어 프로필을 나타냅니다.
다음은 인코딩되지 않은 CBOR 지도 데이터 항목의 예입니다.
{ "provisionedData": { "org.iso.18013.5.1": [ { "name": "family_name", "value": "Smith", "accessControlProfiles": [ 1 ] }, { "name": "given_name", "value": "Stewart", "accessControlProfiles": [ 1 ] }, { "name": "birth_date", "value": { "tag": 1004, "value": "1965-09-01" }, "accessControlProfiles": [ 1 ] }, { "name": "issue_date", "value": { "tag": 1004, "value": "2022-08-01" }, "accessControlProfiles": [ 1 ] }, { "name": "expiry_date", "value": { "tag": 1004, "value": "2027-08-01" }, "accessControlProfiles": [ 1 ] }, { "name": "issuing_authority", "value": "IA", "accessControlProfiles": [ 1 ] }, { "name": "issuing_country", "value": "US", "accessControlProfiles": [ 1 ] }, { "name": "document_number", "value": "D04320785", "accessControlProfiles": [ 1 ] }, { "name": "portrait", "value": { "type": "Buffer", "data": [ 167, 30, 148, 218, 204, 75, 112, 162, 138, 40, 52, 63, 255 ] }, "accessControlProfiles": [ 1 ] }, { "name": "un_distinguishing_sign", "value": "USA", "accessControlProfiles": [ 1 ] }, { "name": "driving_privileges", "value": [ { "expiry_date": { "tag": 1004, "value": "2027-08-01" }, "issue_date": { "tag": 1004, "value": "2022-08-01" }, "vehicle_category_code": "B" } ], "accessControlProfiles": [ 1 ] }, { "name": "sex", "value": 1, "accessControlProfiles": [ 1 ] }, { "name": "height", "value": 170, "accessControlProfiles": [ 1 ] }, { "name": "weight", "value": 79, "accessControlProfiles": [ 1 ] }, { "name": "eye_colour", "value": "Blue", "accessControlProfiles": [ 1 ] }, { "name": "hair_colour", "value": "Gray", "accessControlProfiles": [ 1 ] }, { "name": "age_in_years", "value": 57, "accessControlProfiles": [ 1 ] }, { "name": "age_over_18", "value": true, "accessControlProfiles": [ 1 ] }, { "name": "age_over_21", "value": true, "accessControlProfiles": [ 1 ] }, { "name": "resident_address", "value": "1600 Amphitheatre Pkwy ", "accessControlProfiles": [ 1 ] }, { "name": "issuing_jurisdiction", "value": "US-CA", "accessControlProfiles": [ 1 ] }, { "name": "resident_city", "value": "Mountain View", "accessControlProfiles": [ 1 ] }, { "name": "resident_state", "value": "CA", "accessControlProfiles": [ 1 ] }, { "name": "resident_postal_code", "value": "94043", "accessControlProfiles": [ 1 ] }, { "name": "resident_country", "value": "US", "accessControlProfiles": [ 1 ] } ], "org.iso.18013.5.1.aamva": [ { "name": "DHS_compliance", "value": "F", "accessControlProfiles": [ 1 ] }, { "name": "domestic_driving_privileges", "value": [ { "domestic_vehicle_class": { "domestic_vehicle_class_code": "D", "domestic_vehicle_class_description": "Operator", "expiry_date": { "tag": 1004, "value": "2027-08-01" }, "issue_date": { "tag": 1004, "value": "2022-08-01" } }, "domestic_vehicle_restrictions": [ { "domestic_vehicle_restriction_code": "B", "domestic_vehicle_restriction_description": "Corrective lenses (also automated - vision screening)" } ] } ], "accessControlProfiles": [ 1 ] }, { "name": "aamva_version", "value": "1", "accessControlProfiles": [ 1 ] }, { "name": "family_name_truncation", "value": "N", "accessControlProfiles": [ 1 ] }, { "name": "given_name_truncation", "value": "N", "accessControlProfiles": [ 1 ] }, { "name": "organ_donor", "value": true, "accessControlProfiles": [ 1 ] } ] }, "accessControlProfiles": [ { "id": 1, "userAuthenticationRequired": true, "timeoutMillis": 10000 } ] }
그런 다음 이 객체를 CBOR 형식으로 인코딩하고 암호화한 다음 base64로 인코딩됩니다. 테스트 환경에서 데이터가 암호화되지 않으면 CBOR 형식으로 인코딩한 다음 base64로 인코딩해야 합니다.
위의 예는 JSON이 아닌 인코딩되지 않은 CBOR 맵입니다. JSON 문자열이 CBOR로 인코딩되어 있으면 Android 기기에서 올바르게 파싱되지 않습니다.
모바일 보안 객체
ISO/IEC 18013-5는 MDL (모바일 보안 객체)을 데이터가 변조되지 않았고 신뢰할 수 있는 기관에서 발급된 데이터임을 확인합니다.
MSO에는 다음이 포함됩니다.
- 다이제스트 값: 각 데이터에 대해 생성되는 고유한 값입니다. 요소에 명시됩니다. 이 API는 데이터가 MSO가 체결된 이후 변경된 사항
- 기기 키: 각 휴대기기용으로 생성되는 고유 키입니다. 사용자 인증 정보를 저장하는 MSO를 장치에 바인딩하고 다른 기기에서 사용되지 못하게 합니다.
- 유효성 정보: 여기에는 MSO가 유효해야 합니다.
- IA 서명: 생성되는 디지털 서명입니다. 발급 기관 (IA)에 의해 결정됩니다. 이 번호는 신뢰할 수 있는 기관에서 MSO를 발행했는지 확인하는 데 사용됩니다.
MSO의 CCDL 구조는 다음과 같습니다.
MobileSecurityObjectBytes = #6.24(bstr .cbor MobileSecurityObject)
MobileSecurityObject = {
"digestAlgorithm" : tstr, ; Message digest algorithm used
"valueDigests" : ValueDigests, ; Array of digests of all data elements
"deviceKeyInfo" : DeviceKeyInfo,
"docType" : tstr, ; DocType as used in Documents
"validityInfo" : ValidityInfo
}
DeviceKeyInfo = {
"deviceKey" : DeviceKey
? "keyAuthorizations" : KeyAuthorizations,
? "keyInfo" : KeyInfo
}
DeviceKey = COSE_Key ; Device key in COSE_Key as defined in RFC 8152
KeyAuthorizations = {
? "nameSpaces" : AuthorizedNameSpaces
? "dataElements" : AuthorizedDataElements
}
AuthorizedNameSpaces = [+ NameSpace]
AuthorizedDataElements = {+ NameSpace => DataElementsArray}
DataElementsArray = [+ DataElementIdentifier]
KeyInfo = { * int => any} ; Positive integers are RFU, negative integers may be used for proprietary use
ValueDigests = {
"nameSpaces" : NameSpacesDigests
}
NameSpacesDigests = {
+ NameSpace => DigestIDs
}
DigestIDs = {
+ DigestID => Digest
}
ValidityInfo = {
"signed" : tdate,
"validFrom" : tdate,
"validUntil" : tdate,
? "expectedUpdate" : tdate
}
NameSpace = tstr ; NameSpace as used in IssuerSigned
DigestID = uint ; DigestID as used in IssuerSig정적 인증 데이터
정적 인증 데이터는
digestIdMapping 및 issuerAuth는 발급기관에서 구성해야 합니다.
특정 네임스페이스의 digestIdMapping는
IssuerSignedItem 인스턴스(각각 elementValue 속성의 null 값이 있음)
또한 issuerAuth는
COSE_Sign1에서 MobileSecurityObjectBytes 사용
StaticAuthDataBytes = (bstr .cbor StaticAuthData) StaticAuthData = { "digestIdMapping" : DigestIdMapping, "issuerAuth" : IssuerAuth } DigestIdMapping = { NameSpace => [ + IssuerSignedItemBytes ] } ; Defined in ISO 18013-5 ; NameSpace = String DataElementIdentifier = String DigestID = uint IssuerAuth = COSE_Sign1 ; The payload is MobileSecurityObjectBytes IssuerSignedItemBytes = #6.24(bstr .cbor IssuerSignedItem) IssuerSignedItem = { "digestID" : uint, ; Digest ID for issuer data auth "random" : bstr, ; Random value for issuer data auth "elementIdentifier" : DataElementIdentifier, ; Data element identifier "elementValue" : DataElementValue ; Data element value }
/provisionMobileSecurityObjects 호출 시
엔드포인트에서 StaticAuthDataBytes는 HPKE를 사용하여 암호화되고
응답의 일부로 간주됩니다.
이 코드 샘플 가이드를 마치겠습니다