1 คะแนน โดย GN⁺ 2024-07-28 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • นี่คือโปรเจ็กต์แฮ็กที่ใส่ บอร์ดทดแทน 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' }

การทำหน้าปัด 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 ความคิดเห็น

 
GN⁺ 2024-07-28
ความคิดเห็นบน Hacker News
  • การกรอก ค่า secret ของ TOTP ลงในเว็บเพจใด ๆ นั้นไม่สะดวก
    บน Linux อาจมีเครื่องมือ base32 และ od ติดตั้งอยู่แล้ว และใน Ubuntu จะอยู่ในแพ็กเกจ coreutils
    นอกเหนือจากนั้น โปรเจกต์นี้ยอดเยี่ยม แต่ดีไซน์นาฬิกาดูขี้เหร่นิดหน่อย

    • ถ้าจำเป็นต้องใช้เว็บแอปจริง ๆ อย่างน้อยก็ควรใช้ CyberChef ซึ่งรันเฉพาะฝั่งไคลเอนต์และใช้กันแพร่หลายในงาน ทดสอบความปลอดภัย
      https://gchq.github.io/CyberChef/
    • เพราะแบบนี้ผมยังคงเก็บ uMatrix ไว้อยู่
      https://i.imgur.com/9MYqLvj.png
      จะได้ปิด XHR ได้อย่างรวดเร็วเพื่อตรวจสอบว่าไม่มีการทำงานฝั่งเซิร์ฟเวอร์ที่ไม่คาดคิด
    • บอร์ดนี้เข้ากันได้กับ A158W และ A171W ด้วย ซึ่งสองรุ่นนั้นดูดีกว่ามาก
    • ผมคิดว่าทำไมต้องเชื่อใจบุคคลที่สาม โดยเฉพาะเว็บไซต์ สำหรับงานง่าย ๆ อย่างการถอดรหัส base-32 หรือการสร้าง TOTP
  • ถ้าเห็น สัญลักษณ์ ⌍ แปลก ๆ ในเดโมเป็นบางครั้ง นั่นคือ “เลข 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

    • oddly specific objects กำลังทำ LCD ทดแทนระดับไฮเอนด์ อยู่
  • ในที่สุดก็มีคอนเทนต์ที่ทำให้ผมเข้ามา 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 ด้วย

  • ถ้าสิ่งนี้ใช้กับ โทเคน SecurID ได้ก็คงดี

  • น่าสนใจมาก
    ผมทำงานที่ Nixon และอยากลองทำอะไรแบบนี้กับ นาฬิกาดิจิทัลของ Nixon บ้าง และถ้าผู้เขียนอยากเขียนบทความคล้าย ๆ กัน ผมน่าจะหานาฬิกาฟรีให้ได้สักสองสามเรือน

  • ทำไมสมาร์ตวอตช์ที่ฉลาดที่สุดของผมถึงใช้สิ่งนี้ไม่ได้กันนะ
    ทำให้อยากกลับไปใช้ Casio รุ่นเก่าเลย

  • อันนี้ดีมาก และผมก็เคยคิดจะลองทำอะไรคล้าย ๆ กันกับสมาร์ตวอตช์แบบโง่ ๆ แต่ในแง่ ความปลอดภัยเชิงปฏิบัติการ ก็สงสัยว่าการที่ TOTP มองเห็นได้ชัดและเข้าถึงง่ายแบบนี้โอเคหรือไม่
    ถ้านาฬิกาหายหรือถูกขโมยจะเป็นอย่างไร

    • ตราบใดที่เจ้าของไม่ได้เที่ยวพูดว่า “นี่คือ ปัจจัยยืนยันตัวตนที่สอง ของฉัน” คนที่ผ่านไปมาก็น่าจะคิดว่าเป็นแค่นาฬิกาเสีย
    • ผมใส่โค้ด TOTP ไว้ใน Pebble และใช้แบบนั้น ซึ่งผมว่าก็โอเค
      ผมติดป้ายกำกับไว้ไม่ให้รู้ทันทีว่าเป็นบริการอะไร
      Pebble แทบไม่มีระบบล็อกหรือความปลอดภัยเลย แต่ยังไงมันก็เป็นแค่ปัจจัยยืนยันตัวตนที่สอง
      ถ้าคุณรู้อยู่แล้วถึงรหัสผ่านที่สุ่มสร้างขึ้นมา ไปสืบมาจนรู้ว่าผมอาจมี TOTP อยู่บนข้อมือ และยังขโมยนาฬิกาของผมได้จริง ๆ ผมก็แพ้ไปแล้ว และผมมองว่าความเสี่ยงระดับนั้นแลกกับความสะดวกได้
    • ถึงอย่างนั้นก็ดูสะดุดตาน้อยกว่า YubiKey ไม่ใช่หรือ?