Đóng gói và nén không phải là một
Hai việc khác nhau thường bị gộp chung dưới hai chữ “file nén”. Đóng gói là gom nhiều file vào một file, giữ nguyên tên và thư mục của chúng. Nén là làm cho dữ liệu nhỏ đi. TAR chỉ đóng gói — một file .tar nặng bằng tổng mọi thứ bên trong cộng lại. Gzip chỉ nén, và mỗi lần chỉ nén một luồng, đó là lý do .tar.gz ra đời: đóng gói trước, rồi nén cả gói. ZIP làm cả hai cùng lúc, cho từng file, và giữ một bảng mục lục những gì có bên trong.
Sự khác biệt đó quyết định định dạng hoạt động ra sao khi bạn dùng. Vì ZIP lưu mục lục ở cuối file và nén riêng từng file, nó có thể liệt kê một file nén mười gigabyte ngay lập tức và lấy ra một file ở giữa mà không đụng tới phần còn lại — đó chính xác là cách trình đọc ZIP của chúng tôi hoạt động, không giải nén gì cho đến khi bạn yêu cầu. Một file nén solid nén mọi thứ thành một luồng liên tục, nên phần lặp lại giữa các file được phát hiện và kết quả nhỏ hơn, đôi khi nhỏ hơn rất nhiều với nhiều file nhỏ giống nhau như mã nguồn hay file log. Cái giá phải trả là không có cách nào nhanh để lấy một file ở giữa: mọi thứ phía trước nó phải được giải nén trước. TAR.GZ vốn là solid, 7z nén theo từng khối solid, còn RAR ở đây được đọc tuần tự từ đầu chứ không qua mục lục.
Nội dung đã nén thì không nén thêm được nữa. JPEG, PNG, MP3, MP4, PDF và mọi file Office hiện đại đều đã được nén sẵn, và thuật toán deflate tốn thời gian với chúng mà chẳng được gì — đôi khi còn thêm vài byte. Vì vậy file zip một thư mục ảnh ra đúng bằng dung lượng thư mục, và người ta tưởng công cụ bị hỏng. Tạo file ZIP nhận ra các định dạng này và lưu nguyên như cũ thay vì giả vờ nén, nên nó xong ngay với ảnh chụp và mất thời gian hơn với văn bản.
Siêu dữ liệu trong file nén không giống siêu dữ liệu trên ổ đĩa của bạn. ZIP lưu thời gian sửa đổi theo định dạng MS-DOS, có độ chính xác hai giây và không biểu diễn được ngày trước năm 1980 hay sau năm 2099 — ở đây, ngày nằm ngoài khoảng đó được đưa về giới hạn gần nhất thay vì để cả file nén bị lỗi, và đó là lỗi thật chúng tôi đã gặp khi chuyển những file RAR mang ngày bằng không. TAR lưu quyền truy cập Unix, chủ sở hữu và liên kết tượng trưng. Trình duyệt không đọc được thông tin nào trong số đó từ ổ đĩa của bạn và cũng không ghi lại được, nên Tạo file TAR ghi một chế độ quyền mặc định hợp lý, còn các công cụ giải nén của chúng tôi chỉ liệt kê quyền và liên kết chứ không khôi phục chúng. Nếu file nén là bản sao lưu cần được khôi phục đúng y như lúc tạo, nó phải được tạo và khôi phục bằng tar trên chính máy đó.
Mã hóa ZIP có hai loại và chỉ một loại đáng giá. Cơ chế ZipCrypto nguyên thủy đã bị phá tới mức chỉ còn để trang trí — một cuộc tấn công bản rõ đã biết khôi phục nội dung trong vài giây trên phần cứng thông thường, vậy mà phần lớn phần mềm vẫn mặc định dùng nó. AES-256, được bổ sung sau, là mã hóa thực sự và không phá được. Ở đây không có loại nào: chúng tôi sẽ không cung cấp loại đã bị phá, còn loại hiện đại thì không có bản triển khai sẵn trong trình duyệt nào mà chúng tôi dùng được theo giấy phép mở. Dù sao cũng nên biết: ZIP không bao giờ mã hóa tên file, nên ai cũng đọc được mục lục của một file nén đã mã hóa. “Hoa-don/2024/Thanh-ly-mat.pdf” vẫn hiện ra mà không cần mật khẩu.
File nén là loại file duy nhất mà nội dung bên trong có thể tấn công chính chương trình mở nó. Một file bên trong có thể được đặt tên “../../.bashrc” để thoát ra khỏi thư mục giải nén, và vài kilobyte có thể được chế tạo để bung ra thành hàng terabyte, làm sập tab trình duyệt. Cả hai đều được xử lý trước khi bạn thấy bất cứ thứ gì: tên độc hại — leo lên thư mục cha, đường dẫn tuyệt đối, ký tự ổ đĩa Windows, tên thiết bị dành riêng, ký tự vô hình dùng để ngụy trang phần mở rộng — đều được chỉnh lại và mọi thay đổi được liệt kê, còn tỷ lệ bung nén được đo trước và bị từ chối thay vì cứ thế thực hiện. Liên kết tượng trưng trong file nén được hiển thị nhưng không bao giờ được đi theo.
Khi nào trình duyệt thực sự không phải công cụ phù hợp
Các công cụ này được tạo ra để giữ file nén của bạn riêng tư, và điều đó có cái giá của nó. Chúng tôi muốn nói rõ ở đây hơn là để bạn phát hiện ra giữa chừng.
File nén rất lớn. Mọi thứ được giữ trong bộ nhớ thiết bị của bạn, nên giới hạn là bộ nhớ mà tab được dùng chứ không phải giới hạn của gói dịch vụ nào. Liệt kê một file ZIP lớn thì nhẹ vì mục lục được đọc riêng, nhưng giải nén thì không: một file nén vài gigabyte sẽ chật vật trên điện thoại và có thể thất bại trên laptop. 7-Zip, GNU tar và bsdtar đọc dần từ ổ đĩa và không quan tâm file lớn đến đâu.
Tạo file RAR hoặc 7z. Cả hai đều không làm được ở đây, vì những lý do khác nhau. Thuật toán nén RAR là độc quyền, và giấy phép của đoạn mã duy nhất tạo được RAR cấm dùng nó để làm một chương trình nén khác, nên không công cụ trình duyệt nào có thể thật lòng cung cấp tính năng này — trang Chuyển ZIP sang RAR tồn tại chính là để giải thích điều đó. Với 7z, việc đọc làm được nhờ một bản triển khai được viết độc lập, còn việc ghi thì chưa có con đường tương tự. Nếu cần, WinRAR tạo được RAR, còn 7-Zip — miễn phí, và làm việc này tốt hơn mọi trang web — tạo được 7z.
Mọi thứ có mã hóa. Chúng tôi không tạo được file nén có mật khẩu và cũng không mở được. 7-Zip với AES-256 là lựa chọn miễn phí để tạo file nén có mật khẩu, và nó còn một lợi thế hơn mọi trang web: bạn gõ mật khẩu vào chương trình do chính bạn cài đặt, chứ không phải vào một ô văn bản trên internet.
Sao lưu trung thực. Quyền truy cập, chủ sở hữu, liên kết tượng trưng và liên kết cứng, thuộc tính mở rộng, file thưa và dấu thời gian chính xác là những thứ một bản sao lưu cần giữ, và trình duyệt không truy cập được thứ nào trong số đó. GNU tar và bsdtar miễn phí, có sẵn trên macOS và Linux, và là công cụ phù hợp.
Tự động hóa và nén thật mạnh. Các công cụ này chạy khi có người bấm. Nén một thư mục mỗi đêm là việc của dòng lệnh — tar, zip, 7z và zstd đều miễn phí. Và nếu dung lượng là điều quan trọng, deflate là thuật toán từ những năm 1990: zstd ở mức cao hay xz sẽ cho kết quả nhỏ hơn đáng kể so với ZIP của cùng các file, đổi lại là một định dạng mà người nhận có thể không mở được.
Chọn giữa những công cụ nghe na ná nhau
Giải nén ZIP, Giải nén RAR, Giải nén 7Z hay Giải nén TAR. Trên thực tế, bạn vào trang nào cũng được. Mỗi trang nhận diện file qua vài byte đầu tiên chứ không qua phần mở rộng, nên cả bốn đều mở được mọi định dạng và cho bạn biết file thực ra là gì — điều này quan trọng, vì chuyện đổi tên RAR thành .zip để lọt qua bộ lọc email là rất phổ biến. Điều thực sự khác nhau là định dạng, không phải trang: ZIP liệt kê ngay lập tức từ mục lục, còn RAR phải được đọc qua một lượt rồi mới cho biết bên trong có gì.
Tạo file ZIP hay Tạo file TAR. Chọn ZIP nếu người mở là một con người — nó chạy trên mọi máy tính mà không cần cài gì. Chọn TAR.GZ nếu người mở là một cỗ máy hay người dùng Linux, hoặc nếu bạn có nhiều file nhỏ giống nhau, khi đó nén cả gói thành một luồng cho kết quả nhỏ hơn rõ rệt so với nén riêng từng file. TAR thuần, không nén gì, chỉ đáng chọn khi nội dung đã được nén sẵn hoặc sẽ có khâu sau lo việc nén.
Chuyển RAR sang ZIP hay Chuyển ZIP sang RAR. Một bên là công cụ chuyển đổi, bên kia là trang giải thích. Chuyển RAR sang ZIP thực sự đọc file RAR của bạn và ghi ra file ZIP, sao chép các file sang nguyên vẹn từng byte chứ không mã hóa lại. Chuyển ZIP sang RAR là trang cho bạn biết vì sao không ai làm được việc đó, vì nếu không, cụm từ tìm kiếm này sẽ thuộc về những trang web hoặc đưa file của bạn lên máy chủ của họ, hoặc trả lại cho bạn một file ZIP bị đổi tên.
Tạo file ZIP hay nén ZIP để tiết kiệm dung lượng. Đó là hai mục tiêu khác nhau. Gom nhiều file thành một để gửi đi thì dùng được với mọi thứ. Làm một file lớn nhỏ đi thì thường là không, vì những file lớn người ta muốn thu nhỏ — video, ảnh chụp, PDF — đều đã được nén sẵn. Với chúng, các công cụ nén ảnh, nén video và nén PDF trên trang này mã hóa lại nội dung, và đó là cách duy nhất thực sự làm chúng nhỏ đi.