โทเค็น TOTP บนข้อมือด้วยนาฬิกา dumb watch แบบฉลาด
(blog.singleton.io)- นี่คือโปรเจ็กต์แฮ็กที่ใส่ บอร์ดทดแทน Sensor Watch ลงใน Casio F-91W ยอดนิยม เพื่อดูรหัส 2FA แบบ TOTP สำหรับ Google และ Github ได้จากข้อมือ
- ยังคงใช้ LCD เดิม ปุ่มเดิม และ piezo buzzer เดิมไว้ทั้งหมด โดยเปลี่ยนเฉพาะบอร์ด ARM Cortex M0+ เพื่อรันหน้าปัดนาฬิกาและแอปยูทิลิตีที่โปรแกรมได้โดยไม่ต้องมี Bluetooth
- หน้าปัด TOTP ทำงานโดยดึง Base32 secret จาก QR code แปลงเป็นไบต์ฐานสิบหก แล้วใส่ลงใน
totp_face.cก่อนคอมไพล์movementใหม่ - หน้าปัด ratemeter ที่ทำมาด้วยกันจะคำนวณอัตราต่อนาทีจากช่วงห่างของการกดปุ่ม ALARM โดยแสดง
Hiเมื่อเกิน 500/min และLoเมื่อต่ำกว่า 1/min - อายุแบตเตอรี่หลายเดือน เคส Casio เดิม อีมูเลเตอร์บนเว็บแบบ wasm และ source tree ที่แก้ไขได้ ทำให้ F-91W กลายเป็นแพลตฟอร์มแฮ็กบนข้อมือขนาดเล็กได้
เปลี่ยน Casio F-91W ให้เป็นนาฬิกาที่ตั้งโปรแกรมได้
- Sensor Watch คือ logic board ที่มาแทนชุดกลไกควอตซ์เดิมของ Casio F-91W
- F-91W เป็นนาฬิกาควอตซ์คลาสสิกที่เชื่อว่าขายไปแล้วประมาณ 90 ล้านเรือน
- บอร์ดใหม่นี้ยังใช้ชิ้นส่วนเดิมทั้งหมด
- หน้าจอ LCD เดิม
- ปุ่ม
- piezo buzzer
- บอร์ดนี้ตั้งโปรแกรมได้บนพื้นฐาน ARM Cortex M0+
- โปรเจ็กต์ Sensor Watch มีทั้งหน้าปัดนาฬิกาที่แก้ไขได้ง่ายและแอปยูทิลิตีขนาดเล็กที่เรียกว่า “complications”
- แม้จะไม่มีวิทยุ Bluetooth แต่จุดเด่นคือเคสนาฬิกาที่เบา อายุแบตเตอรี่หลายเดือน และโครงสร้างที่ให้คอมไพล์ใหม่เองได้
ฟีเจอร์ที่ทำเสร็จภายในหนึ่งชั่วโมง
- เปลี่ยนบอร์ด ตั้งค่า 2FA secret และเขียนหน้าปัดใหม่ เสร็จทั้งหมดภายในประมาณ 1 ชั่วโมง
- ตั้งค่าให้ดู รหัส OTP ของบัญชี Google และ Github ได้จากข้อมือ
- เขียนหน้าปัด ratemeter ใหม่ที่ใช้เป็น stroke meter สำหรับการพายเรือหรือ cadence meter ได้
- มีอีมูเลเตอร์แบบ wasm ให้ทดสอบบนคอมพิวเตอร์ได้ง่าย และลองรัน personal build ได้โดยตรงบนหน้าเว็บ
ลำดับหน้าปัดที่นาฬิกาให้มา
- กดปุ่ม MODE หนึ่งครั้งเพื่อไปยังหน้าปัด โทเค็น 2FA
- ที่หน้าปัด 2FA ปุ่ม ALARM ใช้สลับระหว่างโทเค็นของ Google และ Github
- กดปุ่ม MODE อีกครั้งเพื่อไปยังหน้าปัด ratemeter ที่สร้างขึ้นใหม่
- ใน ratemeter ให้กดปุ่ม ALARM เป็นจังหวะสม่ำเสมอเพื่อวัดอัตราต่อนาทีของสิ่งที่กำลังติดตาม
- บิลด์นี้ยังรวมหน้าปัดพื้นฐานอีกหลายแบบไว้ด้วย
- นาฬิกาโลก
- เครื่องคำนวณเวลาพระอาทิตย์ขึ้น/ตก
- ตัวแสดงข้างขึ้นข้างแรม
- เอาต์พุตแบบเรียลไทม์จากเซ็นเซอร์อุณหภูมิภายในนาฬิกา
- ตัวเลือกการตั้งค่า 24 ชั่วโมง
- โหมดตั้งเวลา/วันที่
- ใน source tree ของ Sensor Watch
movementยังมีหน้าปัดอื่น เช่น pulsometer และ orrery - ขั้นตอนอัปเกรดโมดูล F-91W มีบันทึกไว้ใน บล็อกของ John Graham-Cumming
วิธีตั้งค่าหน้าปัด TOTP
- หน้าปัด TOTP สร้าง รหัสผ่านใช้ครั้งเดียวแบบอิงเวลา โดยใช้เวลาปัจจุบันเป็นแหล่งความไม่ซ้ำกัน
- ใช้สร้างรหัสยืนยันแบบสองขั้นตอนสำหรับการล็อกอินเว็บไซต์ต่าง ๆ เช่น Google และ Github ได้
- ใช้ปุ่ม ALARM เพื่อสลับระหว่างเว็บไซต์ที่ตั้งค่าไว้และ TOTP secret ของแต่ละรายการ
- รองรับหลายเว็บไซต์และหลาย secret แต่ต้องดึง secret จาก QR code แล้วใส่ลงใน source code ของหน้าปัดโดยตรง
-
ขั้นตอนการเพิ่ม TOTP secret
- รับ TOTP secret หรือ QR code จากเว็บไซต์ที่ต้องการสร้างรหัส
- หากมีเฉพาะ QR code สามารถดึง secret ได้จาก เว็บไซต์ของ Stefan Sundin
- ผลลัพธ์ที่ดึงออกมาจะเป็นสตริงตัวอักษรและตัวเลขยาวประมาณ 32 ตัวอักษร ซึ่งเป็น TOTP secret ที่เข้ารหัสแบบ Base32
- หากต้องการใส่ secret ลงในโค้ดหน้าปัด ต้องแปลง Base32 เป็นไบต์ฐานสิบหกที่ cryptii.com
- ต้องป้อน TOTP secret เป็น ตัวพิมพ์ใหญ่
- หลังจากเพิ่มไบต์ฐานสิบหกที่แปลงแล้วลงใน source code ของหน้าปัด TOTP ให้คอมไพล์
movementใหม่
-
จุดที่ต้องแก้ใน
totp_face.c- สามารถลบคีย์เดโมออกได้ และหากจะเพิ่มคีย์ใหม่ที่ท้ายรายการให้เพิ่มค่า
num_keysขึ้น 1 - เพิ่มไบต์ฐานสิบหกที่แปลงแล้วไว้ท้ายอาร์เรย์
keys[]- ใส่
0xนำหน้าแต่ละไบต์และคั่นด้วยเครื่องหมายจุลภาค - ต้องเพิ่มเครื่องหมายจุลภาคหลังไบต์สุดท้ายเดิมด้วย
- ใส่
- ที่ท้ายอาร์เรย์
key_sizes[]ให้เพิ่มขนาดของ secret ที่เพิ่มเข้าไป หรือก็คือ จำนวน hex bytes ที่เพิ่งใส่ - ที่ท้ายอาร์เรย์
timesteps[]ให้เพิ่มรายการ30 - เพิ่ม label สำหรับการแสดงผลในอาร์เรย์
labels[][2]- ถ้าเป็นบัญชี Google อาจใช้ label แบบ
{ 'g', 'o' }
- ถ้าเป็นบัญชี Google อาจใช้ label แบบ
- สามารถลบคีย์เดโมออกได้ และหากจะเพิ่มคีย์ใหม่ที่ท้ายรายการให้เพิ่มค่า
การทำหน้าปัด ratemeter
- โค้ดหน้าปัด ratemeter อยู่ใน pull request ที่ส่งเข้าโปรเจ็กต์หลัก
- การทำงานส่วนใหญ่อยู่ใน ฟังก์ชันลูปหลัก ชื่อ
ratemeter_face_loop - ฟังก์ชันนี้จัดการทั้ง event จากการกดปุ่มและ event tick ของนาฬิกา
- หน้าปัดสามารถขอรอบ tick ได้เพื่อใช้วัดช่วงเวลา หรือจัดการแอนิเมชัน
movementมีฟังก์ชันยูทิลิตีwatch_display_string- เป็นฟังก์ชันที่พยายามแสดงสตริงตัวอักษรและตัวเลขบนองค์ประกอบ 7+ segment ที่มีข้อจำกัดของจอ Casio
- ปัญหาในการแมปสตริงตามอำเภอใจลงบนหน้าจอที่จำกัด และข้อยกเว้นต่าง ๆ ถูกรวบรวมไว้ในเอกสาร
-
การทำงานตาม event
EVENT_ACTIVATE- เมื่อหน้าปัดถูกเปิดใช้งาน จะแสดง
RAในพื้นที่แสดงวันในสัปดาห์
- เมื่อหน้าปัดถูกเปิดใช้งาน จะแสดง
EVENT_MODE_BUTTON_UP- เมื่อกดปุ่ม MODE จะไปยังหน้าปัดถัดไป
EVENT_LIGHT_BUTTON_DOWN- เมื่อกดปุ่ม LIGHT จะเปิดไฟ LED
EVENT_ALARM_BUTTON_DOWN- เมื่อกดปุ่ม ALARM จะคำนวณ อัตราต่อนาที จากช่วงห่างระหว่างการกดครั้งนี้กับครั้งก่อน
- รีเซ็ตตัวนับ tick ที่เก็บไว้ในสถานะของหน้าปัด
- ขอรอบ tick แบบเร็วด้วย
RATEMETER_FACE_FREQUENCY - ค่าคงที่นี้ถูกกำหนดเป็น 1/16 วินาที
EVENT_TICK- แสดงอัตราปัจจุบันบนหน้าจอ
- ถ้าอัตราเป็น 0 จะแสดงเพียง
ra - ถ้าเร็วกว่า 500/min จะแสดง
ra Hi - ถ้าช้ากว่า 1/min จะแสดง
ra Lo - นอกเหนือจากนั้นจะแสดงอัตราที่คำนวณได้ในรูปแบบ
ra %-3d pn - จากนั้นเพิ่มตัวนับ tick
ข้อมูลการซื้อและความเกี่ยวข้องเชิงธุรกิจ
- สามารถหา Sensor Watch ได้จาก Oddly Specific Objects
- ไม่มีความเกี่ยวข้องทางธุรกิจกับ Oddly Specific Objects
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
การกรอก ค่า secret ของ TOTP ลงในเว็บเพจใด ๆ นั้นไม่สะดวก
บน Linux อาจมีเครื่องมือ
base32และodติดตั้งอยู่แล้ว และใน Ubuntu จะอยู่ในแพ็กเกจcoreutilsนอกเหนือจากนั้น โปรเจกต์นี้ยอดเยี่ยม แต่ดีไซน์นาฬิกาดูขี้เหร่นิดหน่อย
https://gchq.github.io/CyberChef/
https://i.imgur.com/9MYqLvj.png
จะได้ปิด XHR ได้อย่างรวดเร็วเพื่อตรวจสอบว่าไม่มีการทำงานฝั่งเซิร์ฟเวอร์ที่ไม่คาดคิด
ถ้าเห็น สัญลักษณ์ ⌍ แปลก ๆ ในเดโมเป็นบางครั้ง นั่นคือ “เลข 7 ตัวเล็ก”
เพราะนาฬิกานี้ผูกเซกเมนต์บนและล่างของตัวเลขหลักที่หนึ่งและสาม หรือก็คือเซกเมนต์ A กับ D เข้าด้วยกัน
https://joeycastillo.github.io/Sensor-Watch-Documentation/wi...
น่าทึ่งจริง ๆ ว่าพวกเขายัดประสิทธิภาพเข้าไปในจอแสดงผลนี้ได้มากขนาดไหน
ในการใช้งานทั่วไป ตำแหน่งเหล่านี้ต้องแสดงแค่ 0~5 และตัวเลขหลักแรกสำหรับนาฬิกาต้องใช้แค่ 0, 1, 2 แต่โครโนมิเตอร์นับได้ถึง 59:59.99
ตัวเลขเหล่านี้ไม่จำเป็นต้องแยกเซกเมนต์ A กับ D และตามทฤษฎีแล้วแม้โครโนมิเตอร์จะไปถึง 69:59.99 ก็ไม่น่ามีปัญหา แต่ดูเหมือนเขามองว่า “หนึ่งชั่วโมง” ก็พอแล้ว
เลข 8 กับ 9 ก็เปิดทั้งเซกเมนต์บนและล่างอยู่แล้ว ดังนั้นที่มีปัญหาจริง ๆ มีแค่เลข 7
ในที่สุดก็มีคอนเทนต์ที่ทำให้ผมเข้ามา HN
F-91W น่าจะมีฟอร์มแฟกเตอร์เดียวกับ A158W[1] และ A158W เป็นนาฬิกาที่หน้าตาดีอย่างเหลือเชื่อเมื่อเทียบกับราคา
ใส่เข้ากับทุกอย่าง ดูมีสไตล์แต่ไม่เด่นเกินไป จนทำให้ผมหยิบมาใส่บ่อยกว่านาฬิกาที่แพงกว่า
ถ้ากังวลว่าสายโลหะจะดึงขนแขน ตลอด 1 ปีเกิดขึ้นแค่ประมาณสองครั้ง และน้อยกว่าสายโลหะราคาถูกอื่น ๆ มาก
ถ้าอยากได้ทางเลือกแบบ “สโมกกี้” A168WGG[2] มีสีเทากันเมทัลที่สาย หน้าปัดทำเป็นสีดำ และไฟ Illuminator ส่องสว่างเฉพาะตัวอักษร
แต่ A168 ใหญ่กว่า A158 เพียงเล็กน้อย จึงไม่แน่ใจว่าโมดูลภายในจะใส่ได้เหมือนกันหรือไม่ แต่ถ้าใหญ่กว่า พื้นที่ก็น่าจะมากกว่า จึงน่าจะเป็นไปได้
พูดถึงนาฬิกาต่อ สำหรับนาฬิกาสายดำไว้ใส่ทำงาน ผมใช้ GA-B2100-1AJF[3]
มันค่อนข้างมีสไตล์สำหรับ G-Shock และแม้ไม่ใช่สมาร์ตวอตช์ก็มีฟังก์ชันเยอะ
รุ่น Bluetooth มีสีหน้าปัดและคอนทราสต์ของโทนดีกว่ารุ่นที่ถูกกว่า จึงจับคู่กับเสื้อผ้าได้ง่ายกว่า
[1] https://www.amazon.com/Casio-A158WA-1-Water-Resistant-Digita... [2] https://www.amazon.com/dp/B08195YQLQ/ [3] https://www.amazon.com/dp/B09YG8F41Y/
บอร์ด Sensor Watch ต้องใช้ชิ้นส่วนที่บริจาคมาจาก โมดูล 593 ของ Casio แท้
ดูรายชื่อนาฬิกาที่เข้ากันได้ได้ที่นี่
https://www.sensorwatch.net/docs/
นาฬิกาที่แม้จะมีปุ่ม 3 ปุ่มแบบเดียวกัน แต่ใช้ movement อื่นจึงใช้ไม่ได้: A168W, A700W, LA680W, B650W
โดยทั่วไป ถ้าเป็น Casio ดิจิทัล 3 ปุ่มที่มีไฟแบ็กไลต์ “illuminator” ดี ๆ แทนไฟด้านข้าง ก็ไม่ใช่ 593 ดังนั้นจึงใช้ไม่ได้
ผมชอบโปรเจกต์นี้มาก และใช้มันทุกวันจริง ๆ
เมื่อไม่นานมานี้ ผมได้ทำอินเทอร์เฟซใหม่สำหรับกำหนด โค้ด TOTP ในซอร์สโค้ด ซึ่งทำให้คำอธิบายในบทความนี้ไม่ตรงอีกต่อไป
ตอนนี้มันทำงานประมาณนี้
static totp_t credentials[] = {CREDENTIAL(2F, "JBSWY3DPEHPK3PXP", SHA1, 30),CREDENTIAL(AC, "JBSWY3DPEHPK3PXP", SHA1, 30),};https://github.com/joeycastillo/Sensor-Watch/blob/main/movem...
ผมยังเพิ่ม การปรับเทียบโดยผู้ใช้ เพื่อให้ใช้เครื่องวัดชีพจรเป็นเครื่องวัดอัตราการหายใจสำหรับผู้ป่วยหอบหืดได้ด้วย และมันก็ช่วยชีวิตคนได้แล้ว
มีฟีเจอร์การปรับเทียบและการชดเชยอุณหภูมิ ซึ่งช่วยเพิ่มความแม่นยำของนาฬิกาให้อยู่ที่ประมาณ 10 วินาทีต่อปี
ชุมชนก็กำลังเติบโต และมีหลายคนเข้ามาแฮ็กเฟิร์มแวร์
ล่าสุดมีคนทำเกมวิ่งไม่รู้จบสำหรับนาฬิกานี้
https://github.com/joeycastillo/Sensor-Watch/pull/419
ผู้ดูแลก็เป็นคนดีมากจริง ๆ
ถ้ากำลังมองหาโปรเจกต์โอเพนซอร์สยอดเยี่ยมที่คุ้มค่ากับเวลาของคุณ นี่แหละใช่เลย
ในเอกสารผมหาไม่เจอ
ถ้าต้องคอมไพล์และแฟลชนาฬิกาข้อมือใหม่ การใช้งานสำหรับ TOTP ก็คงค่อนข้างจำกัด
เจ๋งดี
ผมหวังมาตลอดว่าจะมีใครทำแบบนี้สำหรับนาฬิกาเครื่องคิดเลขของ Casio ด้วย
https://www.casio-intl.com/asia/en/calc/products/SL-760LC-BK...
ถ้าสิ่งนี้ใช้กับ โทเคน SecurID ได้ก็คงดี
น่าสนใจมาก
ผมทำงานที่ Nixon และอยากลองทำอะไรแบบนี้กับ นาฬิกาดิจิทัลของ Nixon บ้าง และถ้าผู้เขียนอยากเขียนบทความคล้าย ๆ กัน ผมน่าจะหานาฬิกาฟรีให้ได้สักสองสามเรือน
ทำไมสมาร์ตวอตช์ที่ฉลาดที่สุดของผมถึงใช้สิ่งนี้ไม่ได้กันนะ
ทำให้อยากกลับไปใช้ Casio รุ่นเก่าเลย
https://github.com/ch1bo/garmin-otp-authenticator
อันนี้ดีมาก และผมก็เคยคิดจะลองทำอะไรคล้าย ๆ กันกับสมาร์ตวอตช์แบบโง่ ๆ แต่ในแง่ ความปลอดภัยเชิงปฏิบัติการ ก็สงสัยว่าการที่ TOTP มองเห็นได้ชัดและเข้าถึงง่ายแบบนี้โอเคหรือไม่
ถ้านาฬิกาหายหรือถูกขโมยจะเป็นอย่างไร
ผมติดป้ายกำกับไว้ไม่ให้รู้ทันทีว่าเป็นบริการอะไร
Pebble แทบไม่มีระบบล็อกหรือความปลอดภัยเลย แต่ยังไงมันก็เป็นแค่ปัจจัยยืนยันตัวตนที่สอง
ถ้าคุณรู้อยู่แล้วถึงรหัสผ่านที่สุ่มสร้างขึ้นมา ไปสืบมาจนรู้ว่าผมอาจมี TOTP อยู่บนข้อมือ และยังขโมยนาฬิกาของผมได้จริง ๆ ผมก็แพ้ไปแล้ว และผมมองว่าความเสี่ยงระดับนั้นแลกกับความสะดวกได้