ข้อมูลประจำตัว
อุปกรณ์ Android จะใช้ข้อมูลเข้าสู่ระบบข้อมูลประจำตัว เพื่อจัดการข้อมูลเข้าสู่ระบบในอุปกรณ์อย่างปลอดภัย ข้อมูลประจำตัว ไลบรารีมีฟีเจอร์ความปลอดภัยหลายอย่างที่ผู้ออกบัตรควรใช้ เพื่อให้แน่ใจว่าการผสานรวมกับ Google นั้นมีความปลอดภัยสูงสุด
Nonce ที่ลงนาม
คลังข้อมูลเข้าสู่ระบบข้อมูลประจำตัวใช้ "คำท้า" (ซึ่งใน API นี้เรียกว่า ค่า Nonce) เมื่อเรียกใบรับรองข้อมูลประจำตัวของอุปกรณ์ โดยส่งไปยังผู้ออกบัตร ใน RegisterDeviceRequest ค่า Nonce นี้มีการลงนามและฝังอยู่ในส่วนขยายเอกสารรับรองของอุปกรณ์ ใบรับรองข้อมูลประจำตัว วิธีนี้ช่วยให้ผู้ออกบัตรมีความเชื่อมั่นในความใหม่ ของใบรับรองและเอกสารรับรอง และเซิร์ฟเวอร์ไม่ได้เล่นซ้ำ ในระหว่างการสื่อสาร
โปรไฟล์การควบคุมการเข้าถึง
โปรไฟล์การควบคุมการเข้าถึงเป็นวิธีสำหรับผู้ออกบัตรในการระบุให้ชัดเจนว่า ต้องการจัดเก็บข้อมูลที่จัดเก็บไว้ในข้อมูลประจำตัวสำหรับป้องกัน ผู้ออกใบรับรองสามารถระบุได้ว่าจำเป็นต้องมีการตรวจสอบสิทธิ์ผู้ใช้เพื่อเข้าถึงข้อมูลหรือไม่ และระยะเวลาที่ผู้ใช้จะตรวจสอบสิทธิ์แล้ว อนาคต (ไม่ใช่ ปัจจุบัน) กรณีการใช้งานของฟีเจอร์นี้รวมถึงการจำกัดผู้อ่าน สามารถเข้าถึงเอลิเมนต์ข้อมูลได้ รายละเอียดเกี่ยวกับวิธีจัดรูปแบบการควบคุมการเข้าถึง โปรไฟล์สามารถพบได้ในรูปแบบออบเจ็กต์ข้อมูลเข้าสู่ระบบ
หลักฐานการจัดสรร
ออบเจ็กต์หลักฐานของการจัดสรรคือวิธีที่ผู้ออกบัตรจะทราบว่า จัดเก็บข้อมูลเข้าสู่ระบบภายในข้อมูลประจำตัวเรียบร้อยแล้ว ผู้ออกบัตรควร ไม่ออก MSO เพื่อขอข้อมูลเข้าสู่ระบบจนกว่าจะได้รับและยืนยันหลักฐานของ การจัดสรร จะมีการระบุออบเจ็กต์นี้เพิ่มเติมในเอกสารประกอบของข้อมูลประจำตัว
รูปแบบวัตถุ
ออบเจ็กต์แต่ละรายการนี้ได้รับการเข้ารหัสจากต้นทางถึงปลายทางระหว่างอุปกรณ์และ ผู้ออกบัตร ดังนั้น เซิร์ฟเวอร์ของ Google ไม่มีความสามารถในการทำให้เป็นมาตรฐาน และออบเจ็กต์บางส่วนเหล่านี้อาจอยู่ในรูปแบบที่ต่างจาก ออบเจ็กต์ API ที่เหลือ เช่น ข้อมูลเข้าสู่ระบบอยู่ในรูปแบบ CBOR แทน JSON กว่า JSON ก็ เป็นไปตามที่คาดไว้ในระดับ Android
ข้อมูลเข้าสู่ระบบ
ข้อมูลเข้าสู่ระบบประกอบด้วยองค์ประกอบข้อมูลและวิธีที่ควรเข้าถึง ทั้งนี้
มีออบเจ็กต์หลัก 2 รายการ ได้แก่ provisionedData และ accessControlProfiles
provisionedData มีเนมสเปซทั้งหมดที่เกี่ยวข้องกับแอตทริบิวต์
ซึ่งก็คือ ตัวอย่างเช่น สำหรับใบขับขี่บนอุปกรณ์เคลื่อนที่ จะเป็น
org.iso.18013.5.1 และ org.aamva.18013.5.1 รายการและค่าข้อมูล
ภายในเนมสเปซจะระบุโปรไฟล์ควบคุมการเข้าถึงที่เกี่ยวข้อง นี่คือ
แสดงเป็นรายการรหัส โดยที่รหัสสอดคล้องกับโปรไฟล์ควบคุมการเข้าถึงใน
รายการ accessControlProfiles ในตัวอย่างด้านล่าง [0] ในแต่ละข้อมูล
รายการหมายถึงโปรไฟล์ควบคุมการเข้าถึงที่มีรหัส 0 ไม่ใช่ดัชนี 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
โปรดทราบว่าตัวอย่างด้านบนเป็นแมป CBOR ที่ไม่มีการเข้ารหัส ไม่ใช่ JSON หากสตริง JSON มีการเข้ารหัสเป็น CBOR อุปกรณ์ Android จะไม่ได้รับการแยกวิเคราะห์อย่างถูกต้อง
ออบเจ็กต์การรักษาความปลอดภัยของอุปกรณ์เคลื่อนที่
ISO/IEC 18013-5 จะกำหนด Mobile Security Object (MSO) เพื่อให้แน่ใจว่าใบขับขี่ดิจิทัล (mDL) ข้อมูลดังกล่าวไม่ได้ถูกแก้ไขโดยหน่วยงานที่น่าเชื่อถือ
MSO ประกอบด้วยข้อมูลต่อไปนี้
- ค่าไดเจสต์: ค่าเหล่านี้คือค่าที่ไม่ซ้ำกันที่สร้างขึ้นสำหรับข้อมูลแต่ละรายการ ในข้อมูลเข้าสู่ระบบใบขับขี่ดิจิทัล และใช้เพื่อยืนยันว่าข้อมูล ถูกเปลี่ยนแปลงนับตั้งแต่ที่ 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 รายการ แต่ละรายการมีค่า Null สำหรับพร็อพเพอร์ตี้ elementValue
นอกจากนี้ issuerAuth จะสร้างขึ้นจากการลงชื่อ
MobileSecurityObjectBytes โดยใช้ 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 }
เมื่อเรียกใช้ /provisionMobileSecurityObjects
ปลายทาง StaticAuthDataBytes ได้รับการเข้ารหัสโดยใช้ HPKE และส่ง
เป็นส่วนหนึ่งของการตอบกลับ
ต่อไปนี้คือ ตัวอย่างโค้ด สำหรับการสร้าง MSO และข้อมูลการตรวจสอบสิทธิ์แบบคงที่