Chứng chỉ danh tính
Thiết bị Android sử dụng Thông tin xác thực danh tính để quản lý thông tin xác thực trên thiết bị một cách an toàn. Chứng chỉ danh tính thư viện này sẽ cung cấp một số tính năng bảo mật mà nhà phát hành nên sử dụng nhằm đảm bảo quá trình tích hợp của họ với Google diễn ra an toàn nhất có thể.
Số chỉ dùng một lần đã ký
Thư viện Thông tin xác thực danh tính chấp nhận "thách thức" (được gọi là trong API này là số chỉ dùng một lần) khi truy xuất chứng chỉ nhận dạng thiết bị, được gửi tới nhà phát hành trong RegisterDeviceRequest. Số chỉ dùng một lần này được ký và nhúng trong tiện ích chứng thực của thiết bị chứng chỉ danh tính. Điều này giúp công ty phát hành tin tưởng vào thông tin mới nhất của chứng chỉ và chứng thực và chứng chỉ đó không được máy chủ phát lại trong quá trình giao tiếp.
Hồ sơ kiểm soát quyền truy cập
Hồ sơ kiểm soát quyền truy cập là một cách giúp tổ chức phát hành chỉ định chính xác cách thức muốn bảo vệ dữ liệu đang được lưu trữ trong Chứng chỉ danh tính. Chiến lược phát hành đĩa đơn tổ chức phát hành có thể chỉ định xem có yêu cầu xác thực người dùng để truy cập dữ liệu hay không và khoảng thời gian người dùng phải thực hiện xác thực. Tương lai (không phải hiện được hỗ trợ) cho các trường hợp sử dụng tính năng này, chẳng hạn như việc giới hạn độc giả có thể truy cập vào phần tử dữ liệu đó. Thông tin chi tiết về cách định dạng chế độ kiểm soát quyền truy cập bạn có thể tìm thấy hồ sơ theo định dạng đối tượng Thông tin xác thực.
Bằng chứng về việc cấp phép
Bằng chứng về đối tượng cấp phép là một cách để nhà phát hành biết rằng đã được lưu trữ thành công trong Thông tin xác thực danh tính. Tổ chức phát hành không phát hành MSO cho một chứng chỉ cho đến khi họ nhận được và xác minh bằng chứng về cấp phép. Đối tượng này được nêu chi tiết hơn trong tài liệu về Chứng chỉ danh tính.
Định dạng đối tượng
Mỗi đối tượng trong số này được mã hoá hai đầu giữa thiết bị và nhà phát hành. Do đó, các máy chủ của Google không có khả năng chuẩn hoá các đối tượng này và một số đối tượng trong số này có thể ở định dạng khác với các đối tượng API còn lại. Ví dụ: Chứng chỉ danh tính được định dạng theo CBOR thay vì so với JSON, vì đó là những gì được mong đợi ở cấp Android.
Thông tin xác thực
Thông tin xác thực chứa các phần tử dữ liệu và cách truy cập các phần tử này. Nó
chứa hai đối tượng chính là provisionedData và accessControlProfiles. Chiến lược phát hành đĩa đơn
provisionedData chứa tất cả không gian tên liên quan đến bất kỳ
là. Ví dụ: đối với giấy phép lái xe trên thiết bị di động, thuộc tính này sẽ là
org.iso.18013.5.1 và org.aamva.18013.5.1. Các mục dữ liệu và giá trị
bên trong không gian tên chỉ định các hồ sơ kiểm soát quyền truy cập có liên quan. Đây là
được thực hiện dưới dạng danh sách id, trong đó id tương ứng với một hồ sơ kiểm soát truy cập
danh sách accessControlProfiles. Trong ví dụ bên dưới, [0] trong mỗi dữ liệu
mục nhập tham chiếu đến cấu hình kiểm soát truy cập có id 0, không phải chỉ mục 0.
Dưới đây là ví dụ về một mục dữ liệu bản đồ CBOR chưa được mã hoá.
{ "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 } ] }
Sau đó, đối tượng này phải được mã hoá theo định dạng CBOR, rồi mã hoá mã hóa base64. Nếu ở trong môi trường thử nghiệm và dữ liệu không được mã hoá, nó phải được mã hoá theo định dạng CBOR, rồi mã hoá base64.
Lưu ý rằng ví dụ trên là bản đồ CBOR chưa được mã hoá, chứ không phải JSON. Nếu một chuỗi JSON được mã hoá thành CBOR thì sẽ không được thiết bị Android phân tích cú pháp chính xác.
Đối tượng bảo mật trên thiết bị di động
ISO/IEC 18013-5 xác định một Đối tượng bảo mật di động (MSO) để đảm bảo rằng mDL này không bị can thiệp và dữ liệu đó được phát hành bởi một cơ quan đáng tin cậy.
MSO chứa các thành phần sau:
- Giá trị chuỗi đại diện: Đây là những giá trị riêng biệt được tạo cho mỗi dữ liệu phần tử trong Chứng chỉ danh tính mDL. Chúng được dùng để xác minh rằng dữ liệu chưa đã được thay đổi kể từ khi MSO được ký.
- Khoá thiết bị: Đây là khoá duy nhất được tạo cho mỗi thiết bị di động có lưu trữ Thông tin xác thực. Tham số này được dùng để liên kết MSO với thiết bị và với ngăn việc sử dụng dữ liệu đó trên các thiết bị khác.
- Thông tin về tính hợp lệ: Thông tin này bao gồm ngày bắt đầu và ngày kết thúc mà MSO là hợp lệ.
- Chữ ký IA: Đây là chữ ký số được tạo tạo bởi Cơ quan phát hành (IA) bằng cách sử dụng khoá riêng tư của mình. Mã này được dùng để xác minh rằng MSO do một cơ quan đáng tin cậy phát hành.
MSO có cấu trúc CCDL sau:
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 IssuerSigDữ liệu xác thực tĩnh
Dữ liệu xác thực tĩnh, bao gồm cả
digestIdMapping và issuerAuth phải do nhà phát hành tạo.
digestIdMapping cho một không gian tên cụ thể bao gồm một mảng
Thực thể IssuerSignedItem, mỗi thực thể có một giá trị rỗng cho thuộc tính elementValue.
Ngoài ra, issuerAuth được tạo bằng cách ký
MobileSecurityObjectBytes bằng COSE_Sign1.
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 }
Sau khi gọi /provisionMobileSecurityObjects
điểm cuối, StaticAuthDataBytes được mã hoá bằng HPKE và được truyền
như một phần của câu trả lời.
Sau đây là một mã mẫu để tạo MSO và Dữ liệu xác thực tĩnh.