פרטי כניסה לזהות
מכשירי Android משתמשים בפרטי הכניסה לזהות הספרייה כדי לנהל באופן מאובטח את פרטי הכניסה במכשיר. פרטי הכניסה לזהות מציעה מספר תכונות אבטחה שהמנפיק צריך להשתמש בהן כדי שהשילוב שלהם עם Google יהיה מאובטח ככל האפשר.
הצופן החתום
הספרייה 'פרטי כניסה' מקבלת 'אתגר' (נקרא בממשק API זה צופן חד-פעמי (nonce)) באחזור אישור הזהות של המכשיר, שנשלח למנפיק ב-RegisterDeviceRequest. הצופן הזה חתום ומוטמע בתוסף האימות של המכשיר תעודת זהות. כך המנפיק יכול להרגיש ביטחון לגבי המועד האחרון. של האישור והאימות, ושהוא לא מופעל מחדש על ידי שרת. באמצע התקשורת.
פרופילים של בקרת גישה
פרופילים של בקרת גישה מאפשרים למנפיק לציין בדיוק איך הם רוצה להגן על הנתונים שמאוחסנים בפרטי הכניסה לאימות הזהות. המנפיק יכול לציין אם נדרש אימות משתמש כדי לגשת לנתונים וכמה זמן יש למשתמש לבצע אימות. עתיד (לא נתמכים כרגע) לשימוש בתכונה הזו, כולל הגבלה של הקוראים יכולים לגשת לרכיב הנתונים. פרטים על הפורמט של בקרת הגישה הפרופילים נמצאים בפורמט האובייקט של פרטי הכניסה.
הוכחה להקצאת הרשאות ידנית
האובייקט להוכחת ההקצאה מאפשר למנפיקים לדעת פרטי הכניסה אוחסנו בהצלחה בתוך 'פרטי כניסה'. מנפיק צריך לא ינפיק MSO עבור מסמך כניסה עד שהוא יקבל ויאמת את ההוכחה הקצאה. האובייקט הזה מתועד יותר במסמכי התיעוד של פרטי הכניסה.
פורמטים של אובייקטים
כל אחד מהאובייקטים האלה מוצפן מקצה לקצה בין המכשיר של מנפיק הכרטיס. כתוצאה מכך, לשרתים של Google אין אפשרות לנרמל של האובייקטים האלה, וחלק מהאובייקטים האלה עשויים להיות בפורמטים שונים את שאר האובייקטים של ה-API. לדוגמה, המסמך לאימות בפורמט CBOR במקום מאשר JSON, כי זה מצופה ברמת Android.
פרטי כניסה
פרטי הכניסה מכילים את רכיבי הנתונים ואת אופן הגישה אליהם. הוא
מכיל שני אובייקטים ראשיים: 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 מוגדר אובייקט אבטחה בנייד (MSO) כדי לוודא שה-mDL שאין לשנות אותם ושהם הונפקו על ידי רשות מהימנה.
MSO מכיל:
- ערכי תקציר (digest): ערכים ייחודיים שנוצרים לכל נתונים בפרטי הכניסה של ה-mDL. הם משמשים כדי לאמת שהנתונים לא השתנה מאז שה-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 ונתוני אימות סטטי.