1 điểm bởi GN⁺ 2024-07-28 | 1 bình luận | Chia sẻ qua WhatsApp
  • Đây là một dự án hack đưa bo mạch thay thế Sensor Watch vào chiếc Casio F-91W quen thuộc để xem mã 2FA TOTP cho Google và Github ngay trên cổ tay
  • Vẫn giữ nguyên LCD, nút bấm và còi piezo hiện có, chỉ thay bo mạch ARM Cortex M0+ để chạy các mặt đồng hồ và ứng dụng tiện ích có thể lập trình mà không cần Bluetooth
  • Mặt đồng hồ TOTP hoạt động bằng cách trích xuất Base32 secret từ mã QR, đổi sang byte hex rồi chèn vào totp_face.c, sau đó build lại movement
  • Mặt đồng hồ ratemeter đi kèm tính tốc độ theo phút từ khoảng cách giữa các lần nhấn nút ALARM, và hiển thị Hi nếu vượt quá 500/phút, Lo nếu dưới 1/phút
  • Thời lượng pin kéo dài nhiều tháng, vỏ Casio nguyên bản, trình giả lập wasm trên web và cây mã nguồn có thể chỉnh sửa kết hợp lại để biến F-91W thành một nền tảng hack đeo tay cỡ nhỏ

Biến Casio F-91W thành đồng hồ có thể lập trình

  • Sensor Watchbo mạch logic thay thế bộ máy quartz gốc của Casio F-91W
  • F-91W là mẫu đồng hồ quartz kinh điển được cho là đã bán khoảng 90 triệu chiếc
  • Bo mạch mới tận dụng lại các linh kiện sẵn có
    • Màn hình LCD gốc
    • Các nút bấm
    • Còi piezo
  • Bo mạch có thể lập trình, dựa trên ARM Cortex M0+
  • Dự án Sensor Watch cung cấp một bộ các mặt đồng hồ dễ chỉnh sửa và các ứng dụng tiện ích nhỏ gọi là “complications”
  • Không có radio Bluetooth, nhưng bù lại có ưu điểm là vỏ đồng hồ nhẹ, pin dùng được nhiều tháng và cấu trúc có thể tự build lại

Các tính năng làm trong chưa đầy một giờ

  • Việc thay bo mạch, thiết lập 2FA secret và viết mặt đồng hồ mới được hoàn thành trong khoảng 1 giờ
  • Đã thiết lập để có thể xem mã OTP cho tài khoản Google và Github ngay trên cổ tay
  • Cũng viết thêm mặt đồng hồ ratemeter để dùng như stroke meter cho chèo thuyền hoặc cadence meter
  • Có trình giả lập dựa trên wasm nên dễ thử nghiệm trên máy tính, và có thể chạy trực tiếp các bản build cá nhân trên trang web

Luồng các mặt đồng hồ mà đồng hồ cung cấp

  • Nhấn nút MODE một lần để chuyển sang mặt đồng hồ token 2FA
  • Ở mặt đồng hồ 2FA, nút ALARM dùng để chuyển qua lại giữa token Google và Github
  • Nhấn MODE thêm lần nữa để chuyển sang mặt đồng hồ ratemeter tự tạo
  • Trong ratemeter, nhấn nút ALARM theo chu kỳ để đo tốc độ theo phút của đối tượng đang theo dõi
  • Bản build này cũng kèm nhiều mặt đồng hồ mặc định khác
    • Đồng hồ thế giới
    • Trình tính giờ mặt trời mọc/lặn
    • Bộ hiển thị pha mặt trăng
    • Xuất thời gian thực từ cảm biến nhiệt độ bên trong đồng hồ
    • Bộ chọn cài đặt 24 giờ
    • Chế độ cài đặt giờ/ngày
  • Cây mã nguồn movement của Sensor Watch còn có các mặt đồng hồ khác như pulsometer và orrery
  • Quá trình nâng cấp mô-đun F-91W được ghi lại trong blog của John Graham-Cumming

Cách thiết lập mặt đồng hồ TOTP

  • Mặt đồng hồ TOTP tạo ra mật khẩu dùng một lần theo thời gian dùng thời gian hiện tại làm nguồn tạo tính duy nhất
  • Có thể dùng để tạo mã xác thực hai bước khi đăng nhập vào nhiều website như Google, Github
  • Dùng nút ALARM để chuyển giữa các website đã thiết lập và TOTP secret tương ứng
  • Hỗ trợ nhiều website và secret, nhưng cần trích xuất secret từ mã QR rồi chèn trực tiếp vào mã nguồn của mặt đồng hồ
  • Quy trình thêm TOTP secret

    • Lấy TOTP secret hoặc mã QR từ website mà bạn muốn tạo mã
    • Nếu chỉ có mã QR, có thể trích xuất secret tại website của Stefan Sundin
    • Kết quả trích xuất là một chuỗi chữ và số dài khoảng 32 ký tự, chính là TOTP secret được mã hóa theo Base32
    • Để đưa secret vào mã mặt đồng hồ, cần chuyển Base32 sang byte hex tại cryptii.com
    • TOTP secret phải được nhập bằng chữ hoa
    • Sau khi thêm các byte hex đã chuyển đổi vào mã nguồn mặt đồng hồ TOTP, hãy biên dịch lại movement
  • Vị trí cần sửa trong totp_face.c

    • Có thể xóa khóa demo, và nếu muốn thêm khóa mới ở cuối danh sách thì tăng giá trị num_keys lên 1
    • Thêm các byte hex đã chuyển đổi vào cuối mảng keys[]
      • Mỗi byte thêm tiền tố 0x và phân tách bằng dấu phẩy
      • Cần thêm cả dấu phẩy sau byte cuối cùng hiện có
    • Ở cuối mảng key_sizes[], thêm kích thước của secret vừa thêm, tức số byte hex vừa chèn
    • Ở cuối mảng timesteps[], thêm mục 30
    • Trong mảng labels[][2], thêm nhãn hiển thị
      • Với tài khoản Google, có thể dùng nhãn như { 'g', 'o' }

Cách triển khai mặt đồng hồ ratemeter

  • Mã mặt đồng hồ ratemeter nằm trong pull request đã gửi lên dự án chính
  • Phần lớn việc triển khai nằm trong hàm vòng lặp chính ratemeter_face_loop
  • Hàm này xử lý sự kiện nhấn nút và sự kiện tick của đồng hồ
  • Mặt đồng hồ có thể yêu cầu chu kỳ tick để đo khoảng thời gian hoặc xử lý hoạt ảnh
  • movement cung cấp hàm tiện ích watch_display_string
    • Đây là hàm cố gắng hiển thị chuỗi chữ và số trên các phần tử 7+ đoạn hạn chế của màn hình Casio
    • Vấn đề ánh xạ chuỗi tùy ý lên màn hình giới hạn cùng các ngoại lệ được tổng hợp trong tài liệu
  • Hành vi theo từng sự kiện

    • EVENT_ACTIVATE
      • Khi mặt đồng hồ được kích hoạt, hiển thị RA ở vùng hiển thị thứ trong tuần
    • EVENT_MODE_BUTTON_UP
      • Khi nhấn nút MODE, chuyển sang mặt đồng hồ tiếp theo
    • EVENT_LIGHT_BUTTON_DOWN
      • Khi nhấn nút LIGHT, bật đèn LED
    • EVENT_ALARM_BUTTON_DOWN
      • Khi nhấn nút ALARM, tính tốc độ theo phút từ khoảng thời gian giữa lần nhấn này và lần nhấn trước
      • Đặt lại bộ đếm tick được lưu trong trạng thái của mặt đồng hồ
      • Yêu cầu chu kỳ tick nhanh với RATEMETER_FACE_FREQUENCY
      • Hằng số này được định nghĩa là 1/16 giây
    • EVENT_TICK
      • Hiển thị tốc độ hiện tại lên màn hình
      • Nếu tốc độ là 0 thì chỉ hiển thị ra
      • Nếu nhanh hơn 500/phút thì hiển thị ra Hi
      • Nếu chậm hơn 1/phút thì hiển thị ra Lo
      • Ngoài ra thì hiển thị tốc độ đã tính theo định dạng ra %-3d pn
      • Cuối cùng tăng bộ đếm tick lên

Thông tin mua hàng và liên kết

  • Có thể mua Sensor Watch tại Oddly Specific Objects
  • Không có quan hệ liên kết với Oddly Specific Objects

1 bình luận

 
GN⁺ 2024-07-28
Ý kiến trên Hacker News
  • Việc nhập giá trị bí mật TOTP vào một trang web bất kỳ là điều khá bất tiện
    Trên Linux, các công cụ base32od có thể đã được cài sẵn, và theo Ubuntu thì chúng nằm trong gói coreutils
    Ngoài chuyện đó ra thì dự án rất tuyệt, nhưng thiết kế chiếc đồng hồ hơi xấu

    • Nếu nhất định phải dùng ứng dụng web, thì ít nhất nên dùng CyberChef, công cụ chỉ chạy phía client và được dùng rộng rãi trong kiểm thử bảo mật
      https://gchq.github.io/CyberChef/
    • Vì thế nên tôi vẫn giữ uMatrix
      https://i.imgur.com/9MYqLvj.png
      Có thể nhanh chóng tắt XHR để kiểm tra xem có hành vi phía máy chủ nào ngoài dự kiến hay không
    • Bo mạch này cũng tương thích với A158WA171W, mà hai mẫu đó trông đẹp hơn nhiều
    • Cứ có cảm giác là tại sao lại phải tin bên thứ ba, lại còn là một website, cho những việc đơn giản như giải mã base-32 hay tạo TOTP
  • Nếu trong bản demo đôi lúc bạn thấy ký hiệu lạ lạ, thì đó là “số 7 nhỏ”
    Lý do là chiếc đồng hồ này có các đoạn trên và dưới của chữ số thứ nhất và thứ ba, tức các đoạn A và D, được nối chung với nhau
    https://joeycastillo.github.io/Sensor-Watch-Documentation/wi...
    Thật sự rất ấn tượng với mức độ tối ưu mà họ nhồi vào màn hình này
    Trong cách dùng thông thường, các vị trí đó chỉ cần hiển thị từ 0 đến 5, còn chữ số đầu tiên trên đồng hồ chỉ cần 0, 1, 2, nhưng đồng hồ bấm giờ thì lên tới 59:59.99
    Các chữ số này không cần phân biệt đoạn A và D, và về lý thuyết thì kể cả đồng hồ bấm giờ chạy đến 69:59.99 cũng không thành vấn đề, nhưng có vẻ họ cho rằng “một giờ” là đủ rồi
    8 và 9 cũng bật cả đoạn trên lẫn dưới, nên trên thực tế chỉ có số 7 là gây vấn đề

    • oddly specific objects đang làm LCD thay thế cao cấp
  • Cuối cùng cũng có nội dung khiến tôi phải vào HN
    F-91W có lẽ cùng form factor với A158W[1], và A158W là một chiếc đồng hồ đẹp một cách phi lý so với giá tiền
    Nó hợp với mọi thứ, vừa phong cách vừa không phô trương, nên tôi đeo nó thường xuyên hơn cả những chiếc đồng hồ đắt tiền hơn
    Nếu bạn lo dây kim loại sẽ kẹp lông tay, thì trong một năm tôi chỉ bị khoảng hai lần, ít hơn hẳn so với các loại dây kim loại giá rẻ khác
    Nếu muốn một lựa chọn thay thế kiểu “smoky”, thì A168WGG[2] có dây màu xám gunmetal, mặt số được xử lý màu đen, và đèn illuminator chỉ chiếu phần chữ
    Tuy nhiên A168 lớn hơn A158 một chút xíu nên tôi không rõ mô-đun bên trong có vừa y hệt không, nhưng nếu lớn hơn thì cũng có thêm không gian, nên chắc là được
    Nói thêm về đồng hồ, tôi dùng GA-B2100-1AJF[3] làm đồng hồ đen để lao động
    So với chuẩn G-Shock thì nó khá phong cách, và có rất nhiều tính năng dù không phải smartwatch
    Bản Bluetooth có màu sắc và độ tương phản trên mặt số tốt hơn bản rẻ hơn, nên dễ phối đồ hơn
    [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/

    • Tiếc là không tương thích
      Bo mạch Sensor Watch cần các linh kiện được lấy tặng từ mô-đun 593 chính hãng của Casio
      Bạn có thể xem danh sách đồng hồ tương thích ở đây
      https://www.sensorwatch.net/docs/
      Những mẫu đồng hồ không chạy được dù có cùng bố cục 3 nút vì dùng bộ máy khác: A168W, A700W, LA680W, B650W
      Nói chung, nếu đó là Casio kỹ thuật số 3 nút và có đèn nền “illuminator” tử tế thay vì đèn cạnh bên, thì nó không phải 593 và sẽ không chạy
  • Tôi thật sự rất thích dự án này, và đúng nghĩa là dùng nó mỗi ngày
    Gần đây tôi đã triển khai một giao diện mới để định nghĩa mã TOTP ngay trong mã nguồn, nên phần mô tả trong bài viết này không còn chính xác nữa
    Bây giờ nó hoạt động như thế này
    static totp_t credentials[] = {
    CREDENTIAL(2F, "JBSWY3DPEHPK3PXP", SHA1, 30),
    CREDENTIAL(AC, "JBSWY3DPEHPK3PXP", SHA1, 30),
    };
    https://github.com/joeycastillo/Sensor-Watch/blob/main/movem...
    Tôi cũng đã thêm hiệu chuẩn do người dùng thực hiện để máy đo nhịp có thể dùng như công cụ đo nhịp thở cho người hen suyễn, và nó đã giúp cứu người rồi
    Nó cũng có hiệu chuẩn và bù nhiệt độ để nâng độ chính xác của đồng hồ lên khoảng 10 giây mỗi năm
    Cộng đồng cũng đang phát triển, và nhiều người đã tham gia để hack firmware
    Gần đây còn có người làm cả game chạy vô tận cho chiếc đồng hồ này
    https://github.com/joeycastillo/Sensor-Watch/pull/419
    Những người bảo trì dự án cũng thực sự rất tuyệt
    Nếu bạn đang tìm một dự án mã nguồn mở tuyệt vời đáng để bỏ thời gian vào, thì đây chính là nó

    • Có vẻ nó chạy bằng pin đồng hồ thông thường, nên tôi tò mò thời lượng pin cỡ nào
      Tôi không tìm thấy trong tài liệu
  • Nếu phải biên dịch lại và flash lại đồng hồ đeo tay, thì trường hợp dùng TOTP có vẻ sẽ khá hạn chế

  • Quá hay
    Tôi luôn mong ai đó cũng làm thứ tương tự cho đồng hồ máy tính Casio

  • Sẽ rất hay nếu cái này cũng chạy được với token SecurID

  • Thật sự rất thú vị
    Tôi làm ở Nixon, và muốn thử làm chuyện này trên cả đồng hồ kỹ thuật số Nixon; nếu tác giả muốn viết một bài tương tự thì có lẽ tôi có thể kiếm vài chiếc đồng hồ miễn phí

  • Tại sao chiếc smartwatch thông minh nhất của tôi lại không dùng được thứ này nhỉ
    Khiến tôi muốn quay lại với Casio ngày xưa

  • Cái này thực sự hay, và tôi cũng từng nghĩ đến việc làm thứ tương tự với một chiếc smartwatch ngu ngốc, nhưng về mặt an toàn vận hành, tôi không rõ việc để TOTP hiện rõ và dễ truy cập như vậy có ổn không
    Nếu làm mất hoặc bị trộm đồng hồ thì sao

    • Trừ khi chủ nhân đi khắp nơi rao lên rằng “đây là phương thức xác thực thứ hai của tôi”, chứ người qua đường chắc chỉ nghĩ đó là một chiếc đồng hồ bị hỏng thôi
    • Tôi dùng Pebble với mã TOTP lưu sẵn và thấy ổn
      Tôi gắn nhãn để không lộ ngay đó là dịch vụ nào
      Pebble thực ra gần như không có khóa hay bảo mật gì, nhưng dù sao nó cũng chỉ là phương thức xác thực thứ hai
      Nếu ai đó đã biết mật khẩu ngẫu nhiên tôi tạo, lại còn điều tra ra rằng tôi có thể để TOTP trên cổ tay, và còn thực sự trộm được đồng hồ của tôi, thì coi như tôi đã thua rồi, và mức đó đủ đáng để đánh đổi lấy sự tiện lợi
    • Dù sao thì nó cũng ít lộ liễu hơn YubiKey, đúng không?