ไม่ว่าในอดีตหรือปัจจุบันเราคงจะปฎิเสธไม่ได้ว่า การใช้ข้อมูลในบัตรประจำตัวประชาชนไม่ว่าจะด้วยการถ่ายเอกสาร หรือเทคโนโลยี smart card ที่เพิ่งจะเอามาใช้กันจริงๆเมื่อไม่นานมานี้ เป็นของจำเป็นในการทำธุรกรรมแทบทุกอย่าง
สิ่งหนึ่งที่มีเหมือนกันไม่ว่าจะในกระดาษสำเนาหรือ บัตร smart card ก็คือข้อมูล เมื่อโลกเข้าสู่ยุคดิจิตอลของทุกอย่างเริ่มปรับตัวมีขนาดเล็กลง ทีนี้ข้อมูลก็อ่านได้จากบัตรโดยตรง ไม่ต้องพิมพ์ใส่กระดาษเหมือนเมื่อก่อน
เครื่องอ่านบัตร (Smart card reader):
เวลาเราอ่านตัวหนังสือบนบัตร เราก็จะอ่านเข้าใจแค่ภาษาที่เรารู้ เครื่องอ่านบัตรเวลาที่อ่านแถบแม่เหล็กก็เหมือนกัน มันก็ต้องมีอ่านสิ่งที่มันอ่านออก ถึงจะได้ข้อมูลออกมามันเลยมีมาตรฐานหนึ่งเกิดขึ้นมาคือ ISO/IEC 7816–4 ซึ่งใจความสำคัญของมันคือระเบียบการและความปลอดภัยในการแลกเปลี่ยนข้อมูลในบัตร smart card
APDU (Application Protocol Data Unit):
APDU คือมาตราฐานในการสื่อสารของ smart card ที่ถูกกำหนดใน ISO/IEC 7816–4 โดยมี 2 ประเภท
- APDU command:
เป็นคำสั่งส่งไปเพื่อให้ smart card ทำงานตามที่ต้องการ ชุดคำสั่งมี 2 ส่วน คือ header และ body (header เป็นส่วนที่ต้องมี แต่ body ไม่มีก็ได้)
- APDU response:เป็นข้อมูลที่ส่งกลับมาโดย smart card
data field คือข้อมูลที่บัตรส่งกลับมา ขนาดไม่แน่นอน หรือไม่มีเลย
SW1 และ SW2 มีขนาด 1 byte เป็นข้อมูลบอกสถานะการทำงานของ APDU command ที่ส่งไป
เช่น SW1 และ SW2 ที่ทำงานเสร็จโดยไม่มีปัญหา ก็คือ 90 00 แล้วยังมี code อื่นที่ใช้บอกสถานะด้วย เช่น อ่านเสร็จแล้วแต่ได้ข้อมูล x byte ฯลฯ
ดังนั้น บัตรประชาชนไทยก็ต้องมี APDU เป็นของตัวเอง บัตรประชาชนที่อื่นก็ต้องมี APDU เป็นของตัวเอง บัตรเครดิตก็ต้องมี APDU เป็นของตัวเอง
smart card ที่ต่างกัน เสียบแล้วได้ข้อมูลไม่เหมือนกัน เพราะการรับส่งข้อมูลไม่เหมือนกัน
ตาราง APDU ของบัตรประชาชนไทย
ตารางด้านล่างนี้ใช้อ้างอิงเวลาเขียนโปรแกรมรับส่งข้อมูลบัตร ปกติแล้วคำสั่งจะมาในรูปของ array ของ command ส่งไปก่อน 1 รอบเพื่อบอก smart card ว่ากำลังจะรับส่งข้อมูลอะไร
รอบ 2 ที่ส่ง เป็นการขอข้อมูลจากบัตร ก็จะทำเหมือนรอบที่ 1 แต่ส่ง array ของ get response และมี le ต่อท้าย โดยที่ le เป็น byte สุดท้ายของข้อมูล
ถ้าเราเริ่มจาก p2 ที่ 0x11 (17) ไปจนถึง 0xd1 (209)
ส่ง command ครั้งที่ 1 — [0x80, 0xb0, 0x00, 0x04, 0x02, 0x00, 0xd1]
ส่ง command ครั้งที่ 2 — [0x00, 0xc0, 0x00, 0x00, 0xd1]
จะได้ข้อมูล
TH-full name 0x64 (100) bytes,
EN-full name 0x64 (100) bytes,
Date of birth 8 bytes,
และ Gender 1 byte
รวมเป็น 0xd1 (209) bytes
สรุป
หมดนี้เป็นพื้นฐานของการสื่อสารของบัตร smart card แต่เครื่องอ่านบัตรในตลาดมี interface ไม่เหมือนกัน ดังนั้นเอกสารและ documentation ของอุปกรณ์สำคัญมากก
แล้วเดี๋ยวถ้ามีเวลา จะลองเขียนอธิบาย code ภาษา python ที่ใช้กับเครื่องอ่านบัตรแบบ CID interface ครับ
อ้างอิง (Reference):
https://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit
http://www.somkiat.cc/learn-smart-card-apdu/
http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_5_basic_organizations.aspx