Tôi đã xây dựng một công cụ truyền tệp mà gián điệp không thể theo dõi ngay cả khi nó muốn
Security·Dev.to·0 lượt xem

Tôi đã xây dựng một công cụ truyền tệp mà gián điệp không thể theo dõi ngay cả khi nó muốn

I built a file transfer tool that can’t spy on you even if it wanted to

AI Summary

Tác giả đã phát triển `phntm.sh`, một công cụ chia sẻ file sử dụng mã hóa AES ở phía client, với khóa giải mã được nhúng ngay trong URL fragment. Thiết kế này đảm bảo server hoàn toàn không thể truy cập được dữ liệu gốc, giải quyết vấn đề về độ tin cậy với các dịch vụ hiện có. Đây là một phương pháp đáng cân nhắc cho các dev muốn xây dựng các công cụ tập trung vào quyền riêng tư. Đồng thời, việc kiểm tra (audit) các script bên thứ ba là vô cùng quan trọng, bởi ngay cả những script analytics tưởng chừng vô hại cũng có thể gây ảnh hưởng đến các cam kết bảo mật, đặc biệt là khi xử lý dữ liệu nhạy cảm như khóa giải mã. Dự án này cũng được mở (open-source) để mọi người có thể kiểm tra kiến trúc zero-knowledge của nó.

Tôi cảm thấy mệt mỏi khi phải giải thích các chính sách về quyền riêng tư cho mọi người. Mỗi lần cần gửi file cho ai đó, tôi phải chọn một dịch vụ và ngầm tin tưởng vào nó. Hãy tin rằng nó không đọc được tập tin của tôi. Hãy tin tưởng rằng nó...

Tôi cảm thấy mệt mỏi khi phải giải thích chính sách quyền riêng tư cho mọi người.

Mỗi lần cần gửi file cho ai đó, tôi phải chọn một dịch vụ và ngầm tin tưởng vào nó. Hãy tin rằng nó không đọc được tập tin của tôi. Hãy tin rằng nó không đào tạo mô hình trên tài liệu của tôi. Hãy tin rằng khi nó nói “chúng tôi không xem đồ của bạn” thì điều đó thực sự có ý nghĩa như vậy.

Tôi không thể xác minh bất kỳ điều gì trong số đó. Bạn cũng vậy.
Vì vậy tôi đã xây dựng phntm.sh. Và tôi muốn thành thật về nó là gì, không phải là gì và nó vẫn còn khó khăn ở đâu.

Ý tưởng cốt lõi

Không có kiến thức có nghĩa là máy chủ thực sự không thể đọc được tệp của bạn. Không phải “sẽ không”. Không thể.

Đây là cách nó hoạt động. Khi bạn thả tệp vào phntm, trình duyệt của bạn sẽ tạo khóa AES 256 bit. Tệp được mã hóa phía máy khách bằng AES-256-GCM trước khi một byte rời khỏi máy của bạn. Chỉ có bản mã đi đến máy chủ. Khóa giải mã được nhúng vào đoạn URL, phần sau #.

Đây là phần quan trọng. Trình duyệt không bao giờ đưa đoạn này vào yêu cầu HTTP. Nó có trong thông số kỹ thuật. RFC 3986. Khi bạn chia sẻ liên kết phntm, trình duyệt của người nhận sẽ tải xuống bản mã và giải mã cục bộ bằng khóa từ đoạn đó. Máy chủ của tôi không bao giờ nhìn thấy chìa khóa. Chưa bao giờ.

Tôi lưu trữ tiếng ồn. Nếu không có khóa, bản mã sẽ vô dụng về mặt toán học.

Tại sao nguồn mở

Bởi vì “hãy tin tưởng chúng tôi” không phải là một kiến trúc.

Tôi đã cấp nguồn mở cho cả ứng dụng web và CLI để bạn có thể tự mình xác minh các xác nhận quyền sở hữu. Đừng tin lời tôi. Đọc lớp mật mã. Kiểm tra xem khóa không bao giờ được gửi đi đâu cả. Đó là điều trung thực duy nhất cần làm khi bạn đưa ra các tuyên bố về bảo mật.

Các cạnh thô ráp, và ý tôi là vậy

Tôi thành thật ở đây vì đây là sự kiện được xây dựng công khai chứ không phải buổi ra mắt sản phẩm.

Mã hóa đệm toàn bộ tập tin trong bộ nhớ. Đối với các tệp lớn thì đó là một vấn đề. Tôi biết. Nó có trong danh sách.

Việc phân tích cờ CLI là cơ bản. Tôi đã tự mình triển khai nó thay vì sử dụng thư viện. Đây là một bài tập học tập tốt nhưng có nghĩa là nó không mạnh mẽ như mong đợi.

Tôi đã có Vercel Analytics trên trang này. Một người bình luận đã gắn cờ nó và họ đã đúng. RFC giữ nguyên. trình duyệt không gửi các đoạn trong yêu cầu HTTP. Nhưng Vercel Analytics đọc phía máy khách location.href, bao gồm hàm băm và gửi nó tới điểm cuối của chúng. Đó là vấn đề khi hàm băm là khóa giải mã của bạn.

Đã sửa lỗi bằng hook beforeSend để loại bỏ phân đoạn trước khi sự kiện diễn ra. Bài học rút ra: kiểm tra mọi tập lệnh của bên thứ ba khi bạn đưa ra các tuyên bố về bảo mật, bao gồm cả những tập lệnh bạn đã thêm mà không cần suy nghĩ.

Hiện tại nó có ích gì

Gửi tệp cho người chưa cài đặt bất kỳ công cụ nào. Họ nhận được một liên kết, họ nhấp vào nó, nó giải mã trong trình duyệt của họ, nó tải xuống. Không có tài khoản. Không có ứng dụng. Không cần đăng ký.

Tệp sẽ tự hủy khi hết giờ. Không có gì để vi phạm sau đó.

Những gì tôi học được khi xây dựng cái này

Tôi đã xây dựng CLI trong Go như dự án Go thực sự đầu tiên của mình. Không phải là một dự án hướng dẫn. Thứ mà tôi thực sự muốn sử dụng.

Điều khiến tôi chú ý đến mô hình I/O của Go là gói io.Reader để xây dựng thanh tiến trình. Máy khách HTTP thực hiện io.Copy và thanh tự cập nhật khi byte truyền qua. Chuyện nhỏ nhưng nó đã thay đổi cách tôi nghĩ về khả năng kết hợp.

Toàn bộ CLI chỉ có stdlib. Không có phụ kiện bên ngoài. Đó là sự lựa chọn có chủ ý và cũng là sự hạn chế tốt cho việc học tập.

Nơi nó sống
https://phntm.sh
https://github.com/aliirz/phntm.sh
https://github.com/aliirz/phntm-cli

Chào mừng phản hồi. Đặc biệt là trên lớp mật mã.

Tác giả: Ali Raza

#opensource#go#webdev