[iOS Dev] Protecting Data with Keychain

การเก็บข้อมูลบนเครื่อง iPhone มีหลากหลายวิธี เราจะพูดในเรื่องของความปลอดภัยของข้อมูล
ส่วนใหญ่คนมักจะเลือก NSUserDefault เป็นหลักในการทำเก็บข้อมูล ทำไมน่ะหรือ ? 
เพราะมัน(มัก)ง่าย ซึ่งผมเจอมาหลายครั้งละ อีกอย่างคือ ทำให้ Code มันสะเปะสะปะด้วย
แถมความปลอดภัยแทบจะเป็น 0 เพราะเปิดจาก iFunbox ก็ได้ข้อมูลไปหมดละ 

จาก NSUserDefault ปลอดภัยขึ้นมาหน่อย มีการเข้ารหัสก็มี Entry ที่ผมเคยแนะนำไป 


ซึ่งปลอดภัยในระดับหนึ่ง แต่ก็ยังเก็บข้อมูลลงไฟล์ที่เรารู้ที่อยู่ในเครื่องอยู่ ดังนั้นเหตุการณ์ที่เป็นไปได้ถ้าต้องการข้อมูลจริงๆ ก็คือ เราสามารถทำไฟล์นั้นไปถอดรหัสด้วย Algorithm ต่างๆ จนรู้ได้อยู่ดี แม้จะยาก

เอ๊ะ! แล้วใน iOS มีอะไรที่ปลอดภัยกว่านี้อีกไหม ? Keychain!


Keychain เป็น Database พิเศษตัวหนึ่งที่อยู่ระบบ iOS และเพื่อความปลอดภัยไม่มีใครรู้ว่ามันอยู่ตรงไหน และไม่มีใครที่ดึง Database ตัวนั้นออกมาใช้งาน หรือพยายามแกะข้อมูลจากมันได้ (Protect Against Offline Attack) โดย Keychain API นั้นจะเป็น C API ซึ่งใช้ไม่ค่อยง่ายเท่าไร แต่วันนี้จะมาแนะนำวิธีการใช้งานที่ง่ายกว่านั้น

NSURLCredential เป็น Class ที่ Apple จัดมาให้ตั้งแต่ iOS 2.0 เพื่อเก็บข้อมูลสำคัญลง Keychain โดยข้อมูลที่เก็บมักจะเป็น String สั้นๆ เช่น Username หรือ Password หรือข้อมูลอื่นๆ ที่ Apple อนุญาติให้เก็บ

วิธีการใช้งานก็ไม่เท่าไร เราจะจำลองการทำ Auto-Login ของ App ตัวหนึ่งแล้วกันนะ
เมื่อผู้ใช้ทำการเข้าสู่ระบบ ก็ให้เก็บข้อมูลเข้าสู่ Keychain
* ใน Apple Doc บอกว่า NSURLCredentialPersistencePermanent คือการเลือกเก็บบน Keychain

เมื่อผู้ใช้เปิด App ครั้งต่อไป ก็ให้เช็คก่อนว่าข้อมูลที่เก็บใน Keychain มีหรือไม่ ? ถ้าผู้ใช้ยังไม่ได้ Logout ก็จะมีข้อมูลอยู่ และก็จัดการนำข้อมูลขึ้นมาใช้งาน

ส่วนในกรณีที่ผู้ใช้กดปุ่ม Logout ก็ให้ทำการเคลียร์ Credential ที่ทำการเก็บออกจาก Keychain

Operation หลักๆ เก็บกับการเก็บข้อมูลผ่านสิ่งที่เรียกว่า "Keychain" ก็มีเท่านี้ล่ะครับ :)
สำหรับ Apple's Developer อยากรู้รายละเอียดเพิ่มเติม ไปจัดได้ที่ Session 709: WWDC'13 นะครับ

ถ้า API ด้านบนยังไม่ง่ายพอสำหรับคุณ ยังมี 3rd Patry Lib อีกตัวมาแนะนำ ที่ผมก็เคยใช้เช่นกัน
นั่นคือ SFHFKeychainUtils คนใช้เยอะเหมือนกัน มีบน Cocoapod ด้วยนะ

** (NSURLProtectionSpace)loginProtectionSpace สร้างครั้งเดียว ใช้กับข้อมูลทุกตัวที่จะเก็บนะ

** มีคำแนะนำคือ ถ้าจะเก็บข้อมูลมากกว่านั้น ให้เก็บ String ในรูปแบบของ JSON และเวลาจะนำมาใช้ก็ใช้ NSJSONSerialization แปลงกลับมาเป็น NSDictionary เพื่อใช้งาน :)


Popular posts from this blog

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

[Android Dev] การติดตั้ง Eclipse+AndroidSDK เพื่อพัฒนาโปรแกรมบน Android

5 TED Talk ที่จะช่วยให้คุณทำงานดีขึ้น