Smart card: บัตรประชาชนยุคดิจิตอล

patda9
horganice
Published in
2 min readJul 18, 2018

ไม่ว่าในอดีตหรือปัจจุบันเราคงจะปฎิเสธไม่ได้ว่า การใช้ข้อมูลในบัตรประจำตัวประชาชนไม่ว่าจะด้วยการถ่ายเอกสาร หรือเทคโนโลยี smart card ที่เพิ่งจะเอามาใช้กันจริงๆเมื่อไม่นานมานี้ เป็นของจำเป็นในการทำธุรกรรมแทบทุกอย่าง

source: http://seminar4u.blogspot.com/2009/08/smart-card.html

สิ่งหนึ่งที่มีเหมือนกันไม่ว่าจะในกระดาษสำเนาหรือ บัตร smart card ก็คือข้อมูล เมื่อโลกเข้าสู่ยุคดิจิตอลของทุกอย่างเริ่มปรับตัวมีขนาดเล็กลง ทีนี้ข้อมูลก็อ่านได้จากบัตรโดยตรง ไม่ต้องพิมพ์ใส่กระดาษเหมือนเมื่อก่อน

เครื่องอ่านบัตร (Smart card reader):

เวลาเราอ่านตัวหนังสือบนบัตร เราก็จะอ่านเข้าใจแค่ภาษาที่เรารู้ เครื่องอ่านบัตรเวลาที่อ่านแถบแม่เหล็กก็เหมือนกัน มันก็ต้องมีอ่านสิ่งที่มันอ่านออก ถึงจะได้ข้อมูลออกมามันเลยมีมาตรฐานหนึ่งเกิดขึ้นมาคือ ISO/IEC 7816–4 ซึ่งใจความสำคัญของมันคือระเบียบการและความปลอดภัยในการแลกเปลี่ยนข้อมูลในบัตร smart card

source: https://en.wikipedia.org/wiki/Smart_card

APDU (Application Protocol Data Unit):

APDU คือมาตราฐานในการสื่อสารของ smart card ที่ถูกกำหนดใน ISO/IEC 7816–4 โดยมี 2 ประเภท

  • APDU command:
    เป็นคำสั่งส่งไปเพื่อให้ smart card ทำงานตามที่ต้องการ ชุดคำสั่งมี 2 ส่วน คือ header และ body (header เป็นส่วนที่ต้องมี แต่ body ไม่มีก็ได้)
source: https://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit
  • APDU response:เป็นข้อมูลที่ส่งกลับมาโดย smart card
    data field คือข้อมูลที่บัตรส่งกลับมา ขนาดไม่แน่นอน หรือไม่มีเลย
    SW1 และ SW2 มีขนาด 1 byte เป็นข้อมูลบอกสถานะการทำงานของ APDU command ที่ส่งไป

เช่น SW1 และ SW2 ที่ทำงานเสร็จโดยไม่มีปัญหา ก็คือ 90 00 แล้วยังมี code อื่นที่ใช้บอกสถานะด้วย เช่น อ่านเสร็จแล้วแต่ได้ข้อมูล x byte ฯลฯ

source: https://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit

ดังนั้น บัตรประชาชนไทยก็ต้องมี 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

source: https://github.com/chakphanu/ThaiNationalIDCard/blob/master/APDU.md

สรุป

หมดนี้เป็นพื้นฐานของการสื่อสารของบัตร 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

--

--