Cryptile का सुरक्षा ढाँचा, परत दर परत
Cryptile हर फ़ाइल, थंबनेल और इंडेक्स को AES-256-GCM से एन्क्रिप्ट करता है, उन कुंजियों से जो आपके बनाए पैटर्न से आपके फ़ोन पर बनती हैं। कोई खाता नहीं है और कोई सर्वर नहीं है, और डेवलपर के पास कुंजियाँ कभी नहीं होतीं।
सरल सारांश सुरक्षा पेज पर है।
मुझे क्या जानना चाहिए?
- आपका पैटर्न हर कुंजी का स्रोत है। इसके बिना कुछ भी पढ़ने लायक रूप में नहीं रखा जाता।
- आकार और वॉल्ट की संख्या धुंधली की जाती है। फ़ाइलें पैड की जाती हैं और डिकॉय स्लॉट छिपाते हैं कि कितने वॉल्ट मौजूद हैं।
- आप इसे जाँच सकते हैं। एन्क्रिप्शन कोर ऑडिट के लिए प्रकाशित है (source-available), थ्रेट मॉडल और टेस्ट वेक्टर के साथ: github.com/jasonbrelsford/cryptile-core।
पैटर्न कुंजी कैसे बनता है?
- पैटर्न को ग्रिड के आकार और उसके बाद आपके छुए सेल के क्रम के रूप में लिखा जाता है।
- इसे 32-बाइट के एक डिवाइस सीक्रेट के साथ मिलाया जाता है, जो सिर्फ़ इसी डिवाइस के लिए iPhone के Keychain में रखा होता है।
- इस पर PBKDF2-HMAC-SHA512 600,000 बार चलता है। हर अनुमान में इतना ही काम लगता है।
- HKDF-SHA256 परिणाम को एक लुकअप कुंजी और एक रैप कुंजी में बाँटता है।
- लुकअप कुंजी वॉल्ट की इंडेक्स फ़ाइल का नाम तय करती है। रैप कुंजी उसे खोलती है।
इंडेक्स के अंदर वॉल्ट की रैंडम 256-बिट मास्टर कुंजी होती है। HKDF उससे फ़ाइलों, थंबनेल और इंडेक्स के लिए अलग-अलग सबकुंजियाँ बनाता है। कोई भी कुंजी दो कामों के लिए इस्तेमाल नहीं होती।
फ़ाइलें कैसे एन्क्रिप्ट होती हैं?
छोटे आइटम, जैसे थंबनेल और इंडेक्स, AES-256-GCM और एक रैंडम nonce से एक ही टुकड़े में सील किए जाते हैं।
बड़ी फ़ाइलें 1 MB के टुकड़ों में STREAM लेआउट इस्तेमाल करती हैं। हर टुकड़े का अपना nonce होता है और वह अपनी स्थिति दर्ज करता है और यह भी कि वह आख़िरी है या नहीं। टुकड़े काटने, उनका क्रम बदलने या उन्हें अदला-बदली करने से डिक्रिप्शन विफल हो जाता है।
GCM हर हेडर को प्रमाणित भी करता है, इसलिए बदली गई फ़ाइल दिखाई जाने के बजाय अस्वीकार कर दी जाती है।
आकार और वॉल्ट की संख्या कैसे छिपाई जाती है?
हर छोटा ब्लॉब और हर फ़ाइल का आख़िरी टुकड़ा 64 KiB के गुणज तक पैड किया जाता है। कॉपी करने वाले को मोटे-मोटे आकार दिखते हैं, सटीक नहीं।
वॉल्ट की कोई सूची नहीं है। ऐप कम से कम 8 इंडेक्स जैसे स्लॉट रखता है, असली और डिकॉय, और हर लिखाई पर डिकॉय फिर से बदल देता है। जो पैटर्न किसी स्लॉट का नाम नहीं बनाता, वह एक खाली वॉल्ट खोलता है।
रिकवरी कैसे काम करती है?
हर वॉल्ट को 9 शब्दों का एक रिकवरी वाक्यांश मिलता है, जो 96 बिट की रैंडमनेस है। यह वॉल्ट की एक अलग रिकवरी कॉपी खोलता है, जो वाक्यांश से बनी कुंजी से सील होती है।
iCloud बैकअप एन्क्रिप्टेड फ़ाइलों को जैसी हैं वैसी ही कॉपी करता है। डिफ़ॉल्ट रूप से डिवाइस सीक्रेट उसमें नहीं होता, इसलिए सिर्फ़ बैकअप से पैटर्न का अनुमान नहीं लगाया जा सकता।
क्या एन्क्रिप्टेड है, और क्या नहीं?
एन्क्रिप्टेड: फ़ोटो, वीडियो, फ़ाइलें, नोट्स, थंबनेल, नाम, फ़ोल्डर, पसंदीदा, पहचाना गया टेक्स्ट और फ़ोटो की लोकेशन। डिकॉय और मुफ़्त प्लान की गिनती रखने वाली छोटी फ़ाइल एक डिवाइस कुंजी से सील होती है।
Cryptile द्वारा एन्क्रिप्टेड नहीं:
- सेटिंग्स। ऑटो-लॉक का समय, क्रम और बैकअप स्विच में कोई रहस्य नहीं होता।
- जोड़े जाने का इंतज़ार कर रहे शेयर किए आइटम। वे वॉल्ट खोलने तक iOS की फ़ाइल सुरक्षा के तहत रहते हैं।
- कंटेनर का कुल आकार और लिखने के समय। 10 GB का वॉल्ट 10 MB जैसा नहीं दिखता।
- जो कुछ आप एक्सपोर्ट करते हैं। Photos या Files में सेव की गई कॉपी वॉल्ट से बाहर है।
यह किससे बचाता है?
- आपके Keychain के बिना ऐप की फ़ाइलें कॉपी करने वाले से। उन्हें सिफ़रटेक्स्ट मिलता है और वे पैटर्न आज़मा नहीं सकते।
- Apple से, या Apple में किसी सेंधमारी से। iCloud में सिफ़रटेक्स्ट है, कोई कुंजी नहीं।
- छेड़छाड़ से। बदला गया या क्रम बदला गया डेटा डिक्रिप्ट नहीं होता।
- हमसे। हम कोई सर्वर नहीं चलाते और कोई कुंजी नहीं रखते, इसलिए हम एक्सेस रीसेट नहीं कर सकते।
यह किससे नहीं बचाता?
- छोटे पैटर्न से। पैटर्न पासफ़्रेज़ से कमज़ोर है। आपकी फ़ाइलों और आपके Keychain के साथ, 4×4 ग्रिड पर 6 सेल का पैटर्न GPU पर कुछ मिनटों में टूट जाता है। 8 या ज़्यादा सेल इस्तेमाल करें।
- अनलॉक फ़ोन पर मैलवेयर से। वॉल्ट खुला रहने के दौरान मेमोरी पढ़ने वाला कोड किसी भी ऐप की पहुँच से बाहर है।
- आपको पैटर्न बनाते देखने वाले से। ऐसी जगह बनाएँ जहाँ कोई आपका हाथ न देख सके।
- फ़ोन और वाक्यांश दोनों खो देने से। वॉल्ट चला जाता है। कोई रीसेट नहीं है।
Plus का पैनिक पैटर्न डिवाइस सीक्रेट नष्ट कर देता है, इसलिए फ़ोन का कोई वॉल्ट रिस्टोर किए जाने तक नहीं खुलता।