TOTP token trên cổ tay với chiếc đồng hồ ngu mà thông minh
(blog.singleton.io)- Đâ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ạimovement - 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ị
Hinếu vượt quá 500/phút,Lonế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 Watch là bo 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
movementcủ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_keyslê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ố
0xvà 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ó
- Mỗi byte thêm tiền tố
- Ở 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ục30 - 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' }
- Với tài khoản Google, có thể dùng nhãn như
- 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ị
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
movementcung cấp hàm tiện íchwatch_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
- Khi mặt đồng hồ được kích hoạt, hiển thị
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
Ý 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ụ
base32vàodcó thể đã được cài sẵn, và theo Ubuntu thì chúng nằm trong góicoreutilsNgoài chuyện đó ra thì dự án rất tuyệt, nhưng thiết kế chiếc đồng hồ hơi xấu
https://gchq.github.io/CyberChef/
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
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 đề
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/
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ó
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
https://www.casio-intl.com/asia/en/calc/products/SL-760LC-BK...
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
https://github.com/ch1bo/garmin-otp-authenticator
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
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