บทนำ (Overview)
“Keychain” ในเครื่อง “iOS” เป็นที่จัดเก็บข้อมูลอย่างปลอดภัย ซึ่งสามารถจัดเก็บพวกข้อมูลสำคัญ (Sensitive information) อย่างเช่นพวก “usernames” “password” หรือ “Tokens” ต่าง ๆ สำหรับการพิสูจน์ตัวตนได้ โดยปกติแล้วเครื่อง “iOS” จะใช้ “keychain” จัดเก็บรหัสผ่านของ “WiFi” และเราสามารถเข้าถึงและเปิดอ่านโดยใช้โปรแกรมจำพวก “SQLite Browser” โดยเข้าไปที่โฟลเดอร์ “/private/var/Keychains” จากนั้นหาไฟล์ที่ชื่อ “keychain-2.db” แต่ข้อมูลส่วนใหญ่ก็เข้ารหัสเสียหมด
ในเชิงการเขียนโปรแกรมการใช้งาน “Key-chain” ไม่ต่างจาก “NSUserdefaults” (สามารถติดตามได้ที่บทความ How to test insecure data storage – NSUserDefaults) ดังนี้
การเขียนค่า
PDKeychainBindings *bindings = [PDKeychainBindings sharedKeychainBindings]; [bindings setObject:@"value" forKey:@“authToken”];
การดึงค่า
//initWithIdentifier เป็น id ที่ใช้อ้างอิงในการดึงข้อมูล PDKeychainBindings *bindings = [PDKeychainBindings sharedKeychainBindings]; NSString *value = [bindings objectForKey:@“authToken”]; NSLog(@"%@",value);
“Keychain” สามารถถูกแชร์ร่วมกันระหว่างโปรแกรมได้ อย่างไรก็ตามวิธีการใช้ “Keychain” ให้ปลอดภัยควรเรียกใช้ผ่าน “KeychainItemWrapper” ที่ทาง Apple ได้กำหนดเอาไว้ ตัวอย่างการใช้งานเริ่มต้นการสร้าง “Instance” จาก “Class” ของ “KeychainItemWrapper” ดังนี้
//accessGroup ใช้กำหนดว่า Group ใดบ้างสามารถเข้าถึง Keychain นี้ //และ Application ใด อยู่ใน Group นี้จะเข้าถึง Keychain นี้ได้หมด //จากตัวอย่างเป็น nil เราไม่ได้กำหนด Group ใด ๆ KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@“authToken” accessGroup:nil];
ตัวอย่างการกำหนด Group เช่น
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@“authToken” accessGroup:@“”];
ในการเขียนค่า เราจะเรียกใช้ Method ชื่อ setObject:forKey: method
//จาก instance ที่ชื่อ wrapper เราสามารถเขียนข้อมูลลง keychain ได้ในรูปแบบต่าง ๆ ดังนี้ [keychainItemWrapper setObject:kSecClassGenericPassword forKey:(id)kSecClass]; [wrapper setObject:@"username" forKey:(id)kSecAttrAccount]; [keychainItemWrapper setObject:@"password"forKey:(id)kSecValueData]; [wrapper setObject:(id)kSecAttrAccessibleAlwaysThisDeviceOnly forKey:(id)kSecAttrAccessible];
เราสามารถใช้ Keychain_dumper สำหรับดึงข้อมูลออกมาตรวจสอบได้แล้ว (How to test insecure data storage – Keychain data) โปรแกรม “Snoop-it” ก็ทำได้เช่นกัน
ขั้นตอน (Steps)
- เครื่องต้องผ่าน “Jailbreak” มาแล้ว (ติดตามตัวอย่างการ Jailbreak ได้ที่ How to jailbreak iOS – “PP Jailbreak”)
- ติดตั้ง “Sources” สำหรับ “Cydia” ต่าง ๆ เรียบร้อยแล้ว (ติดตามได้จากบทความ How to add Soures of Cydia)
- ติดตั้งโปรแกรม “Snoop-it” เรียบร้อยแล้ว (ติดตามได้ที่บทความ How to install Snoop-it)
- การใช้งานเบื้องต้นของ “Snoop-it” (สามารถติดตามได้ที่บทความ How to reverse engineering (Snoop-it))
- ไปที่โปรแกรม “DVIA” เลือก “Menu > Keychain”
- แล้วพิมพ์ “p@ssword” ลงในช่อง จากนั้นกด “Save in Keychain”
- ไปที่ “Snoop-it” เลือก “Monitoring > Keychain”
- ให้ตรวจเวลาที่ “Save” และตรวจสอบตรง “Action” ที่เป็น “New”
- เราจะพบค่า “Keychain” ที่ได้บันทึกเข้าไป