क्या एक चाबी का गुच्छा आइटम अद्वितीय बनाता है (आईओएस में)?


104

मेरा सवाल iOS (iPhone, iPad, ...) में कीचेन की चिंता करता है। मुझे लगता है (लेकिन मुझे यकीन नहीं है) कि मैक ओएस एक्स के तहत किचेन का कार्यान्वयन एक ही प्रश्न के साथ एक ही प्रश्न उठाता है।


iOS किचेन आइटम के पांच प्रकार (कक्षाएं) प्रदान करता है। kSecClassप्रकार निर्धारित करने के लिए आपको उन पांच मानों में से एक को चुनना होगा :

kSecClassGenericPassword  used to store a generic password
kSecClassInternetPassword used to store an internet password
kSecClassCertificate      used to store a certificate
kSecClassKey              used to store a kryptographic key
kSecClassIdentity         used to store an identity (certificate + private key)

सेब के दस्तावेज़ीकरण, ब्लॉग और फ़ोरम-प्रविष्टियों को पढ़ने के लंबे समय के बाद, मुझे पता चला कि प्रकार का एक चाबी का गुच्छा आइटम kSecClassGenericPasswordविशेषताओं से अपनी विशिष्टता प्राप्त करता है kSecAttrAccessGroup, kSecAttrAccountऔर kSecAttrService

यदि अनुरोध 1 में वे तीन विशेषताएँ अनुरोध 2 के समान हैं, तो आप किसी भी अन्य विशेषताओं की परवाह किए बिना समान जेनेरिक पासवर्ड कीचेन आइटम प्राप्त करते हैं। यदि इस विशेषता में से एक (या दो या सभी) इसके मूल्य को बदलते हैं, तो आपको अलग-अलग आइटम मिलते हैं।

लेकिन kSecAttrServiceकेवल प्रकार की वस्तुओं के लिए ही उपलब्ध है kSecClassGenericPassword, इसलिए यह किसी अन्य प्रकार की वस्तु की "अद्वितीय कुंजी" का हिस्सा नहीं हो सकता है, और ऐसा कोई प्रलेखन नहीं लगता है जो स्पष्ट रूप से इंगित करता है जो विशिष्ट रूप से एक चाबी का गुच्छा आइटम निर्धारित करता है।

"GenericKeychain" के "KeychainItemWrapper" वर्ग में नमूना कोड kSecAttrGenericएक अद्वितीय आइटम बनाने के लिए विशेषता का उपयोग करता है , लेकिन यह एक बग है। इस उदाहरण में दो प्रविष्टियाँ केवल दो अलग-अलग प्रविष्टियों के रूप में संग्रहीत की जाती हैं, क्योंकि उनका kSecAttrAccessGroupअंतर अलग है (एक के पास एक्सेस समूह सेट है, दूसरा इसे मुफ्त देता है)। यदि आप एक पहुंच समूह के बिना 2 पासवर्ड जोड़ने की कोशिश करते हैं KeychainItemWrapper, तो Apple का उपयोग करके , आप असफल हो जाएंगे।

तो, कृपया, मेरे प्रश्नों का उत्तर दें:

  • यह, सच है कि के संयोजन kSecAttrAccessGroup, kSecAttrAccountऔर kSecAttrServiceकीचेन आइटम जिसकी kSecClass है की "अद्वितीय कुंजी" है kSecClassGenericPassword?
  • यदि नहीं kSecClassहै तो कौन सी विशेषता एक किचेन आइटम को अद्वितीय बनाती है kSecClassGenericPassword?

जवाबों:


179

प्राथमिक कुंजियाँ निम्नानुसार हैं (Apple से ओपन सोर्स फाइल्स से ली गई हैं , स्कीमा। एम। 4 , कीसकेम.एम्। ​​4 और सिकिटैम.कैप देखें ):

  • वर्ग के एक चाबी का गुच्छा आइटम के लिए kSecClassGenericPassword, प्राथमिक कुंजी का संयोजन है kSecAttrAccountऔर kSecAttrService
  • वर्ग के एक कीचेन आइटम के लिए kSecClassInternetPassword, प्राथमिक कुंजी का संयोजन है kSecAttrAccount, kSecAttrSecurityDomain, kSecAttrServer, kSecAttrProtocol, kSecAttrAuthenticationType, kSecAttrPortऔर kSecAttrPath
  • वर्ग के एक चाबी का गुच्छा आइटम के लिए kSecClassCertificate, प्राथमिक कुंजी का संयोजन है kSecAttrCertificateType, kSecAttrIssuerऔर kSecAttrSerialNumber
  • वर्ग के एक कीचेन आइटम के लिए kSecClassKey, प्राथमिक कुंजी का संयोजन है kSecAttrApplicationLabel, kSecAttrApplicationTag, kSecAttrKeyType, kSecAttrKeySizeInBits, kSecAttrEffectiveKeySize, और निर्माता, शुरू जो अभी तक SecItem द्वारा उजागर नहीं कर रहे हैं और समाप्ति तिथि।
  • वर्ग के एक चाबी का गुच्छा आइटम के लिए kSecClassIdentityमुझे ओपन सोर्स फ़ाइलों में प्राथमिक कुंजी फ़ील्ड पर जानकारी नहीं मिली है, लेकिन एक पहचान के रूप में एक निजी कुंजी और एक प्रमाण पत्र का संयोजन है, मुझे लगता है कि प्राथमिक कुंजी प्राथमिक कुंजी का संयोजन है के लिए खेतों kSecClassKeyऔर kSecClassCertificate

जैसा कि प्रत्येक किचेन आइटम एक किचेन एक्सेस समूह से संबंधित है, ऐसा लगता है कि किचेन एक्सेस ग्रुप (फ़ील्ड kSecAttrAccessGroup) इन सभी प्राथमिक कुंजियों के लिए एक अतिरिक्त फ़ील्ड है।


एक बहुत अच्छा जवाब की तरह लगता है! धन्यवाद! मैं इसकी जांच करूंगा और अन्य उपयोगकर्ताओं से अतिरिक्त टिप्पणियों के लिए एक या दो दिन इंतजार करना चाहता हूं, लेकिन आप इनाम से +50 अंक के लिए एक गर्म उम्मीदवार हैं।
ह्यूबर्ट श्लोनास्ट

3
बहुत बढ़िया जवाब! मैं प्रमाण पत्र और निजी कुंजी के लिए जेनेरिक किचेन आवरण लागू करने पर कुछ दिनों के लिए काम कर रहा हूं। यह Apple के सैंपल कोड से बहुत भिन्न है जो केवल स्ट्रिंग क्रेडेंशियल (उपयोगकर्ता नाम / पासवर्ड) संग्रहीत करता है। हालाँकि, मुझे पता चला है कि जब आप सेट करते kSecClassहैं kSecClassCertificateया kSecClassKeyकिचेन चेक करते हैं तो भी कि एंट्री (ए value) पहले से स्टोर है। यह एक ही प्रमाण पत्र या कुंजी को दो बार जोड़ने से रोकता है। इसके अलावा अगर आप kSecAttrApplicationTagएक कुंजी के लिए एक अलग निर्दिष्ट करते हैं (जो अद्वितीय होना चाहिए, तो उपरोक्त पोस्ट के बारे में) यह विफल हो जाएगा।
क्रिस

1
यह तालिका के नाम केkSecClass रूप में विशेषता के बारे में सोचने में मदद कर सकता है , और ऊपर दिए गए निर्दिष्ट मान केवल संबंधित तालिका के रूप में। primary key
बोब्बोबो

2
का अर्थ विज्ञान क्या है kSecAttrAccountऔर kSecAttrService? - या प्रोग्रामर अपने द्वारा तय किए गए किसी भी शब्दार्थ को चुन सकता है?
वॉकेचर

1
kSecAttrServiceसेवा के भंडारण के लिए है, kSecAttrAccountखाता नाम के भंडारण के लिए है। आप उनमें अलग-अलग चीजें स्टोर कर सकते हैं, लेकिन यह भ्रामक हो सकती है।
टैमो फ्रीज

9

मैं दूसरे दिन (आईओएस 7.1 पर) एक बग मार रहा था जो इस सवाल से संबंधित है। मैं SecItemCopyMatchingएक kSecClassGenericPasswordआइटम को पढ़ने के लिए उपयोग कर रहा था और यह errSecItemNotFound(-25300) वापस लौटा रहा था kSecAttrAccessGroup, kSecAttrAccountऔर kSecAttrServiceसभी किचेन में आइटम का मिलान कर रहे थे।

आखिरकार मुझे लगा कि kSecAttrAccessibleमैच नहीं हुआ। किचेन में मूल्य pdmn = dk ( kSecAttrAccessibleAlways) आयोजित किया गया था, लेकिन मैं उपयोग कर रहा था kSecAttrAccessibleWhenUnlocked

बेशक इस मूल्य के लिए पहली जगह में की जरूरत नहीं है SecItemCopyMatching, लेकिन OSStatusनहीं था errSecParamऔर न ही errSecBadReqलेकिन सिर्फ errSecItemNotFound(-25,300) जो यह थोड़ा मुश्किल लगता है बनाया है।

के लिए SecItemUpdateमैं एक ही समस्या आ रही है, लेकिन इस पद्धति में भी उपयोग करते हुए एक ही kSecAttrAccessibleमें queryपैरामीटर काम नहीं किया। केवल इस विशेषता को पूरी तरह से हटाकर इसे ठीक कर दिया।

मुझे उम्मीद है कि यह टिप्पणी आप में से कुछ के लिए कुछ कीमती डिबगिंग क्षणों को बचाएगा।


4

@ टैमो फ्रायस द्वारा दिया गया उत्तर सही प्रतीत होता है (लेकिन सभी प्राथमिक कुंजियों का उल्लेख नहीं है)। मैं प्रलेखन में कुछ सबूत खोज रहा था। आख़िरकार मिल गया:

Apple दस्तावेज़ीकरण प्रत्येक वर्ग के लिए प्राथमिक कुंजियों का उल्लेख करता है (नीचे उद्धरण):

सिस्टम किसी दिए गए कीचेन के लिए एक डुप्लिकेट मानता है जब किचैन पहले से ही समग्र प्राथमिक कुंजी के समान सेट के साथ एक ही वर्ग का एक आइटम है। किचेन आइटम के प्रत्येक वर्ग में प्राथमिक कुंजी का एक अलग सेट होता है, हालांकि कुछ विशेषताओं का उपयोग सभी वर्गों में आम तौर पर किया जाता है। विशेष रूप से, जहां लागू हो, kSecAttrSynchronizable और kSecAttrAccessGroup प्राथमिक कुंजी के सेट का हिस्सा हैं । अतिरिक्त प्रति-वर्ग प्राथमिक कुंजियाँ नीचे सूचीबद्ध हैं:

  • जेनेरिक पासवर्ड के लिए, प्राथमिक कुंजी में kSecAttrAccount और kSecAttrService शामिल हैं।
  • इंटरनेट पासवर्ड के लिए, प्राथमिक कुंजी में kSecAttrAccount, kSecAttrSecurityDomain, kSecAttrServer, kSecAttrProtocol, kSecAttrAuthenticationType, kSecAttrPort, और kSecAttrPath शामिल हैं।
  • प्रमाणपत्रों के लिए, प्राथमिक कुंजियों में kSecAttrCertificateType, kSecAttrIssuer और kSecAttrSerialNumber शामिल हैं।
  • प्रमुख वस्तुओं के लिए, प्राथमिक कुंजियों में kSecAttrKeyClass, kSecAttrKeyType, kSecAttrApplicationLabel, kSecAttrApplicationTag, kSecAttrKeySizeInBits, और kSecAttrEffectiveKeySize शामिल हैं।
  • पहचान की वस्तुओं के लिए, जो एक प्रमाण पत्र है और एक निजी कुंजी एक साथ बंडल है, प्राथमिक कुंजी एक प्रमाण पत्र के लिए समान हैं क्योंकि एक निजी कुंजी को एक से अधिक बार प्रमाणित किया जा सकता है, प्रमाण पत्र की विशिष्टता पहचान का निर्धारण करती है।

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक हिस्सों को यहां शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। - रिव्यू से
pwc

सहमत, हालांकि इस मामले में इसका मतलब पूरे लिंक की नकल करना था।
जूलियन क्राल

0

यहाँ एक चाबी का गुच्छा आइटम की विशिष्टता के बारे में उपयोगी जानकारी का एक और टुकड़ा है, जो इस ऐप्पल डॉक्स पृष्ठ के "सुनिश्चित स्थिरता" अनुभाग में पाया गया है ।

बाद में आइटम खोजने में सक्षम होने के लिए, आप इसकी विशेषताओं के अपने ज्ञान का उपयोग करने जा रहे हैं। इस उदाहरण में, सर्वर और खाता आइटम की विशिष्ट विशेषताएं हैं। निरंतर विशेषताओं (यहां, सर्वर) के लिए, लुकअप के दौरान समान मान का उपयोग करें। इसके विपरीत, खाता विशेषता गतिशील है, क्योंकि यह उपयोगकर्ता द्वारा रनटाइम पर प्रदान किया गया मान रखता है। जब तक आपका ऐप अलग-अलग विशेषताओं के साथ समान आइटम नहीं जोड़ता है (जैसे कि एक ही सर्वर पर अलग-अलग खातों के लिए पासवर्ड), आप इन डायनामिक विशेषताओं को खोज मापदंडों के रूप में छोड़ सकते हैं और इसके बजाय उन्हें आइटम के साथ पुनर्प्राप्त कर सकते हैं। नतीजतन, जब आप पासवर्ड देखते हैं, तो आपको संबंधित उपयोगकर्ता नाम भी मिलता है।

यदि आपका ऐप अलग-अलग गतिशील विशेषताओं के साथ आइटम जोड़ता है, तो आपको पुनर्प्राप्ति के दौरान उनके बीच चयन करने का एक तरीका होगा। एक विकल्प दूसरे तरीके से वस्तुओं के बारे में जानकारी रिकॉर्ड करना है। उदाहरण के लिए, यदि आप एक कोर डेटा मॉडल में उपयोगकर्ताओं के रिकॉर्ड रखते हैं, तो आप पासवर्ड फ़ील्ड को संग्रहीत करने के लिए किचेन सेवाओं का उपयोग करने के बाद उपयोगकर्ता नाम को स्टोर करते हैं। बाद में, आप पासवर्ड की खोज करने के लिए अपने डेटा मॉडल से खींचे गए उपयोगकर्ता नाम का उपयोग करते हैं।

अन्य मामलों में, यह अधिक विशेषताओं को जोड़कर आइटम को आगे चिह्नित करने के लिए समझ में आ सकता है। उदाहरण के लिए, आप kSecAttrLabelमूल ऐड क्वेरी में विशेषता को शामिल कर सकते हैं , एक स्ट्रिंग प्रदान करते हैं जो विशेष उद्देश्य के लिए आइटम को चिह्नित करता है। फिर आप बाद में अपनी खोज को कम करने के लिए इस विशेषता का उपयोग कर सकेंगे।

क्लास kSecClassInternetPasswordका आइटम उदाहरण में इस्तेमाल किया गया था, लेकिन एक नोट है जो कहता है:

किचेन सेवाएं संबंधित kSecClassGenericPassword आइटम वर्ग भी प्रदान करता है। जेनेरिक पासवर्ड इंटरनेट पासवर्ड के लिए सभी मामलों में समान हैं, लेकिन उनके पास रिमोट एक्सेस के लिए विशिष्ट विशेषताओं का अभाव है (उदाहरण के लिए, उनके पास kSecAttrServer विशेषता नहीं है)। जब आपको इन अतिरिक्त विशेषताओं की आवश्यकता नहीं होती है, तो इसके बजाय एक सामान्य पासवर्ड का उपयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.