التوقيع والتحقق من وشفاء وفك التشفير باستخدام جيب آمن على iOS و MacOS.
يدعم FaceId و TouchID و CORPART الجهاز وكلمة مرور التطبيق.
يمكن أن يكون استخدام إطار الأمان مربكًا بعض الشيء. لهذا السبب قمت بإنشاء هذا. يمكنك استخدامه كمثال على رمز وتوجيهات أو يمكنك استخدامه كإطار عمل صغير.
لقد وجدت أنه من الصعب معرفة كيفية استخدام SecKeyRawVerify و SecKeyGeneratePair و SecItemCopyMatching C في Swift 3 ، لكن التنفيذ مستقيم تمامًا بفضل ميزات Swift الرائعة.
ما عليك سوى سحب Sources/EllipticCurveKeyPair.swift and Sources/SHA256.swift file في مشروع Xcode الخاص بك.
pod EllipticCurveKeyPair github "agens-no/EllipticCurveKeyPair" هناك الكثير من الاحتمالات الرائعة مع جيب آمن. فيما يلي بعض الأمثلة
متوفر فقط على iOS 10 وما فوق
يمكن أن تكون حالة الاستخدام
لمزيد من الأمثلة ، انظر التطبيق التجريبي.
struct KeyPair {
static let manager : EllipticCurveKeyPair . Manager = {
let publicAccessControl = EllipticCurveKeyPair . AccessControl ( protection : kSecAttrAccessibleAlwaysThisDeviceOnly , flags : [ ] )
let privateAccessControl = EllipticCurveKeyPair . AccessControl ( protection : kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly , flags : [ . userPresence , . privateKeyUsage ] )
let config = EllipticCurveKeyPair . Config (
publicLabel : " payment.sign.public " ,
privateLabel : " payment.sign.private " ,
operationPrompt : " Confirm payment " ,
publicKeyAccessControl : publicAccessControl ,
privateKeyAccessControl : privateAccessControl ,
token : . secureEnclave )
return EllipticCurveKeyPair . Manager ( config : config )
} ( )
}يمكنك أيضًا التراجع بأمان لاستخدام سلسلة المفاتيح إذا لم يتوفر جيب آمن باستخدام أعلام التحكم في الوصول المختلفة:
let privateAccessControl = EllipticCurveKeyPair . AccessControl ( protection : kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly , flags : {
return EllipticCurveKeyPair . Device . hasSecureEnclave ? [ . userPresence , . privateKeyUsage ] : [ . userPresence ]
} ( ) ) في هذه الحالة ، يجب أن تتذكر تعيين متغير token في كائن Config إلى .secureEnclaveIfAvailable .
do {
let key = try KeyPair . manager . publicKey ( ) . data ( ) . DER // Data
} catch {
// handle error
}انظر التطبيق التجريبي لعمل مثال
do {
let key = try KeyPair . manager . publicKey ( ) . data ( ) . PEM // String
} catch {
// handle error
} do {
let digest = " some text to sign " . data ( using : . utf8 ) !
let signature = try KeyPair . manager . sign ( digest , hash : . sha256 )
} catch {
// handle error
}يمكنك أيضًا تمرير كائن lacontext عند التوقيع
do {
let digest = " some text to encrypt " . data ( using : . utf8 ) !
let encrypted = try KeyPair . manager . encrypt ( digest , hash : . sha256 )
} catch {
// handle error
}يمكنك أيضًا تشفير جهاز/نظام تشغيل/نظام أساسي مختلف باستخدام المفتاح العام. إذا كنت ترغب في معرفة كل التفاصيل حول كيفية تشفيرها في تنسيق يفهمه Enclave Secure ، فأنت بحاجة بالتأكيد إلى قراءة هذه الكتابة الرائعة بواسطة ddchuetz!
https://darthnull.org/security/2018/05/31/secure-enclave-ecies/
do {
let encrypted = ...
let decrypted = try KeyPair . manager . decrypt ( encrypted , hash : . sha256 )
let decryptedString = String ( data : decrypted , encoding : . utf8 )
} catch {
// handle error
}يمكنك أيضًا تمرير كائن lacontext عند فك التشفير
الشيء الأكثر شيوعًا هو التقاط الخطأ المتعلق بـ
مع do/catch :
do {
let decrypted = try KeyPair . manager . decrypt ( encrypted )
} catch EllipticCurveKeyPair . Error . underlying ( _ , let underlying ) where underlying . code == errSecUnimplemented {
print ( " Unsupported device " )
} catch EllipticCurveKeyPair . Error . authentication ( let authenticationError ) where authenticationError . code == . userCancel {
print ( " User cancelled/dismissed authentication dialog " )
} catch {
print ( " Some other error occurred. Error ( error ) " )
} مع if let :
if case let EllipticCurveKeyPair . Error . underlying ( _ , underlying ) = error , underlying . code == errSecUnimplemented {
print ( " Unsupported device " )
} else if case let EllipticCurveKeyPair . Error . authentication ( authenticationError ) , authenticationError . code == . userCancel {
print ( " User cancelled/dismissed authentication dialog " )
} else {
print ( " Some other error occurred. Error ( error ) " )
} من أجل فحص الاستعلامات التي تعود ذهابًا وإيابًا إلى سلسلة المفاتيح ، يمكنك الطباعة لتعزية كل طفرة تقوم بها هذه المكتبة على سلسلة المفاتيح مثل هذا
EllipticCurveKeyPair . logger = { print ( $0 ) } في التطبيق التجريبي ، سترى أنه في كل مرة تقوم فيها بإنشاء توقيع يتم تسجيل بعض المعلومات المفيدة إلى وحدة التحكم.
مثال الإخراج
#! /bin/sh
echo 414243 | xxd -r -p > dataToSign.dat
echo 3046022100842512baa16a3ec9b977d4456923319442342e3fdae54f2456af0b7b8a09786b022100a1b8d762b6cb3d85b16f6b07d06d2815cb0663e067e0b2f9a9c9293bde8953bb | xxd -r -p > signature.dat
cat > key.pem << EOF
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdDONNkwaP8OhqFTmjLxVcByyPa19
ifY2IVDinFei3SvCBv8fgY8AU+Fm5oODksseV0sd4Zy/biSf6AMr0HqHcw==
-----END PUBLIC KEY-----
EOF
/usr/local/opt/openssl/bin/openssl dgst -sha256 -verify key.pem -signature signature.dat dataToSign.datمن أجل تشغيل هذا البرنامج النصي يمكنك
verify.shchmod u+x verify.sh./verify.shثم يجب أن ترى
Verified OKملاحظة: سيقوم هذا البرنامج النصي بإنشاء 4 ملفات في دليلك الحالي.
إطار الأمن ، Swift 3 ، Swift 4 ، Swift ، SeckeyRawVerify ، Seckeygenerypair ، SecitemCopymatching ، Secp256R1 ، Cerve Curve الإهليلجي ، ECDSA ، ECDH ، ASN.1 ، Apple ، iOS ، MAC OS ، KSECATTREKETKEPEECSECPRIMERANM Ksecattrokenidsecureenclave ، lacontext ، محلي ، الوجه ، معرف الوجه ، اللمس ، معرف اللمس ، كلمة مرور التطبيق ، دبوس الجهاز ، DevicePin
نشرت TrailofBits بعض الكود الهدف-C لفترة من الوقت والتي كانت مساعدة كبيرة! شكرا لمشاركة Tidas و SecureenClaveCrypto. كما حصلوا على بعض المشاريع الأكثر إثارة للاهتمام. تحقق منها!
شارك SOM رؤى قيمة للغاية فيما يتعلق بتصدير المفتاح العام بتنسيق DER X.509 المناسب.
تم العثور على فئة SHA256 (في الأصل SHA2.swift ) في مكتبة التشفير التي لا تقدر بثمن من قبل Marcin Krzyżanowski. تم تغيير الفصل بشكل كبير من أجل تجريده إلى الحد الأدنى لما نحتاجه في هذا المشروع.
لماذا لا يُطلب مني مع معرف اللمس / دبوس الجهاز على جهاز المحاكاة؟
لا يمتلك جهاز المحاكاة أي جيب آمن ، وبالتالي فإن محاولة الوصول إليه سيؤدي إلى أخطاء. إذا قمت بتعيين
fallbackToKeychainIfSecureEnclaveIsNotAvailableإلىtrue، فسيتم تخزين المفتاح الخاص في سلسلة المفاتيح على محاكاة مما يجعل من السهل اختبار تطبيقك على المحاكاة أيضًا.
أين يمكنني معرفة المزيد؟
تحقق من هذا الفيديو على WWDC 2015 حول الأمان بشكل عام أو انقر هنا لتخطي مباشرة إلى القسم الخاص بالجيب الآمن.
لماذا يتم لفه في التعداد؟
أحاول موازنة السحب والإفلات من الملفات التي تحتاجها في Xcode ودعم مديري التبعية مثل Carthage و Cocoapods في نفس الوقت. إذا كان لديك أفكار أفضل أو لا توافق على هذا القرار ، فأنا سعيد بمناقشة البدائل :)
هل نود؟ لسماع رأيك في هذه المكتبة. إذا كنت تحب أو لا. يرجى تقديم مشكلة إذا كان هناك شيء ترغب في رؤيته محسّن. يمكنك الوصول إلي كـ hfossli على Twitter وأماكن أخرى. ؟