পরিচয় শংসাপত্র
Android ডিভাইসগুলি ডিভাইসে শংসাপত্রগুলি সুরক্ষিতভাবে পরিচালনা করতে আইডেন্টিটি ক্রেডেনশিয়াল লাইব্রেরি ব্যবহার করে৷ আইডেন্টিটি ক্রেডেনশিয়াল লাইব্রেরি বেশ কয়েকটি নিরাপত্তা বৈশিষ্ট্য অফার করে যা ইস্যুকারীর দ্বারা Google এর সাথে তাদের সংহতকরণ যতটা সম্ভব নিরাপদ তা নিশ্চিত করতে ব্যবহার করা উচিত৷
স্বাক্ষরিত ননস
RegisterDeviceRequest এ ইস্যুকারীর কাছে পাঠানো ডিভাইস আইডেন্টিটি সার্টিফিকেট পুনরুদ্ধার করার সময় আইডেন্টিটি ক্রেডেনশিয়াল লাইব্রেরি একটি " চ্যালেঞ্জ " নেয় (এই API-তে ননস হিসাবে উল্লেখ করা হয়েছে)। এই ননসটি ডিভাইসের পরিচয় শংসাপত্রের প্রত্যয়ন এক্সটেনশনে স্বাক্ষরিত এবং এমবেড করা আছে। এটি ইস্যুকারীকে শংসাপত্র এবং প্রত্যয়নের নতুনত্বের উপর আস্থা রাখতে দেয় এবং এটি যোগাযোগের মাঝখানে সার্ভার দ্বারা পুনরায় চালানো হচ্ছে না।
অ্যাক্সেস কন্ট্রোল প্রোফাইল
অ্যাক্সেস কন্ট্রোল প্রোফাইলগুলি হল ইস্যুকারীর কাছে সুনির্দিষ্টভাবে নির্দিষ্ট করার একটি উপায় যে তারা কীভাবে আইডেন্টিটি শংসাপত্রের মধ্যে সংরক্ষণ করা ডেটা সুরক্ষিত করতে চায়৷ ইস্যুকারী ডেটা উপাদান অ্যাক্সেস করার জন্য ব্যবহারকারীর প্রমাণীকরণের প্রয়োজন কিনা এবং ব্যবহারকারীকে কতক্ষণ প্রমাণীকরণ করতে হবে তা নির্দিষ্ট করতে সক্ষম। ভবিষ্যত (বর্তমানে সমর্থিত নয়) এই বৈশিষ্ট্যের ব্যবহারের ক্ষেত্রে পাঠকরা ডেটা উপাদান অ্যাক্সেস করতে পারবেন তা সীমিত করা অন্তর্ভুক্ত। অ্যাক্সেস কন্ট্রোল প্রোফাইলগুলি কীভাবে ফর্ম্যাট করবেন তার বিশদ বিবরণ শংসাপত্র অবজেক্ট ফর্ম্যাটে পাওয়া যাবে।
প্রভিশন এর প্রমাণ
প্রভিশনিং অবজেক্টের প্রমাণ হল ইস্যুকারীদের জানার একটি উপায় যে শংসাপত্রটি আইডেন্টিটি শংসাপত্রের মধ্যে সফলভাবে সংরক্ষণ করা হয়েছে। একটি ইস্যুকারীকে শংসাপত্রের জন্য MSO ইস্যু করা উচিত নয় যতক্ষণ না তারা প্রভিশনের প্রমাণ না পায় এবং যাচাই না করে। এই বস্তুটি আইডেন্টিটি ক্রেডেনশিয়াল ডকুমেন্টেশনে আরও নথিভুক্ত করা হয়েছে।
অবজেক্ট ফরম্যাট
এই বস্তুগুলির প্রতিটি ডিভাইস এবং ইস্যুকারীর মধ্যে এন্ড-টু-এন্ড এনক্রিপ্ট করা হয়। ফলস্বরূপ, Google-এর সার্ভারগুলিতে এই বস্তুগুলিকে স্বাভাবিক করার ক্ষমতা নেই, এবং এই বস্তুগুলির মধ্যে কিছু এপিআই অবজেক্টের থেকে ভিন্ন ফর্ম্যাটে থাকতে পারে৷ উদাহরণস্বরূপ, শংসাপত্রটি JSON-এর পরিবর্তে CBOR-এ ফর্ম্যাট করা হয়েছে, কারণ Android স্তরে এটি প্রত্যাশিত।
শংসাপত্র
শংসাপত্রে ডেটা উপাদান রয়েছে এবং সেগুলি কীভাবে অ্যাক্সেস করা উচিত। এটিতে দুটি প্রাথমিক অবজেক্ট রয়েছে, provisionedData এবং accessControlProfiles । provisionedData শংসাপত্রের ধরন যাই হোক না কেন তার সাথে প্রাসঙ্গিক সমস্ত নামস্থান রয়েছে। উদাহরণস্বরূপ, মোবাইল ড্রাইভারের লাইসেন্সের জন্য, এটি হবে org.iso.18013.5.1 এবং org.aamva.18013.5.1 । নেমস্পেসের ভিতরের ডেটা এন্ট্রি এবং মানগুলি প্রাসঙ্গিক অ্যাক্সেস কন্ট্রোল প্রোফাইলগুলি নির্দিষ্ট করে। এটি আইডিগুলির একটি তালিকা হিসাবে করা হয়, যেখানে আইডিটি অ্যাক্সেস accessControlProfiles তালিকার একটি অ্যাক্সেস নিয়ন্ত্রণ প্রোফাইলের সাথে মিলে যায়। নীচের উদাহরণে, প্রতিটি ডেটা এন্ট্রিতে [0] আইডি 0 সহ অ্যাক্সেস কন্ট্রোল প্রোফাইলকে বোঝায়, সূচক 0 নয়।
নীচে একটি unencoded 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 একটি মোবাইল সিকিউরিটি অবজেক্ট (এমএসও) সংজ্ঞায়িত করে যাতে নিশ্চিত করা হয় যে mDL ডেটার সাথে কোনো টেম্পার করা হয়নি এবং এটি একটি বিশ্বস্ত কর্তৃপক্ষ দ্বারা জারি করা হয়েছে।
MSO এর মধ্যে নিম্নলিখিতগুলি রয়েছে:
- ডাইজেস্ট মান : এগুলি অনন্য মান যা mDL শংসাপত্রের প্রতিটি ডেটা উপাদানের জন্য তৈরি করা হয়। এমএসও স্বাক্ষরিত হওয়ার পর থেকে ডেটা পরিবর্তন করা হয়নি তা যাচাই করতে এগুলি ব্যবহার করা হয়।
- ডিভাইস কী : এটি একটি অনন্য কী যা শংসাপত্র সংরক্ষণ করে এমন প্রতিটি মোবাইল ডিভাইসের জন্য তৈরি করা হয়। এটি 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 সম্পত্তির জন্য একটি শূন্য মান থাকে। উপরন্তু, COSE_Sign1 ব্যবহার করে MobileSecurityObjectBytes স্বাক্ষর করার মাধ্যমে issuerAuth তৈরি করা হয়।
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 এবং স্ট্যাটিক অথ ডেটা তৈরির জন্য একটি কোড নমুনা রয়েছে।