Một cấu hình VPN cung cấp Blowfish với khóa 448 bit, và ai đó đề xuất dùng khóa dài nhất để giữ lại mật mã. Độ dài khóa là có thật, nhưng đó là con số sai để tối ưu hóa. Blowfish biến đổi các khối 64 bit bất kể khóa dài bao nhiêu, và độ rộng khối mới là thứ giới hạn lượng lưu lượng mà một khóa có thể bảo vệ an toàn. Hãy chạy các kiểm tra bên dưới theo thứ tự và dừng ở kiểm tra đầu tiên giải tỏa dịch vụ, vì bước sau không thể sửa được bước trước.

Kiểm tra xem các bên thực sự thương lượng điều gì

Đọc mật mã của kênh dữ liệu từ cả hai đầu, không phải từ cấu hình bạn định triển khai. Cấu hình máy khách có thể liệt kê nhiều mật mã, và mật mã được chọn là kết quả thương lượng giữa hai bản triển khai và phiên bản của chúng. Tăng mức chi tiết nhật ký trên một kết nối thử và đọc dòng kênh dữ liệu, dòng này nêu mật mã và kích thước khóa thực sự được khởi tạo.

Nếu mật mã đã thương lượng là AES-GCM hoặc ChaCha20-Poly1305, hãy dừng ở đây. Các cấu trúc đó dùng khối 128 bit và xác thực tải trọng, nên lập luận về va chạm 64 bit bên dưới không áp dụng cho chúng.

Tách độ dài khóa khỏi độ rộng khối

Blowfish chấp nhận khóa từ 32 đến 448 bit, và tài liệu của tác giả thuật toán ghi hai con số này riêng rẽ. Khóa là bí mật; khối là đơn vị biến đổi. Bí mật dài hơn khiến việc đoán khó hơn và không làm gì với độ rộng của khối mà mật mã xử lý.

Ở chế độ CBC, mật mã được áp dụng cho các khối có độ rộng cố định, móc xích với khối bản mã trước đó và được đệm ở cuối. Với Blowfish, độ rộng đó là 64 bit, tức tám byte. Lịch khóa có thể lớn tùy ý; chuỗi vẫn tiến tám byte mỗi lần.

Đó là lý do tăng độ dài khóa không phải là biện pháp giảm thiểu. Nó giải quyết tấn công vét cạn vào khóa, trong khi rủi ro va chạm bên dưới là thuộc tính của độ rộng khối và chế độ.

Áp dụng số học sinh nhật cho kích thước khối

Một khối 64 bit có thang sinh nhật khoảng 2^32 khối được mã hóa dưới một khóa trước khi va chạm trở nên khả dĩ. Mỗi khối mang tám byte, nên cùng thang đó là khoảng 2^35 byte, tức 32 GiB dữ liệu dưới một khóa duy nhất.

Hãy coi đó là thang đo, không phải hạn ngạch. Va chạm mang tính xác suất, và việc một va chạm có làm lộ gì không phụ thuộc vào chế độ, kiểu lưu lượng và việc kẻ tấn công có nhận ra hoặc tác động được vào bản rõ xung quanh hay không. Byte đầu tiên vượt quá 32 GiB không phải là sự kiện giải mã, và 32 GiB đầu tiên không được chứng nhận là an toàn.

Các nhà nghiên cứu Sweet32 đã trình diễn năm 2016 các cuộc tấn công thực tế nhắm vào mật mã khối 64 bit, trong đó có một kịch bản OpenVPN, với các điều kiện đòi hỏi quan sát và tạo lưu lượng. Các giá trị mặc định và phiên bản phần mềm họ công bố là bối cảnh lịch sử, không phải mô tả việc triển khai của bạn.

Quyết định xem việc dùng lại CBC có quan trọng ở đây không

Trong CBC, một khối bản mã lặp lại nghĩa là hai khối bản rõ khác nhau theo một quan hệ đã biết, vì phép XOR móc xích triệt tiêu. Kẻ tấn công có thể quan sát bản mã và biết hoặc tác động được vào một trong các bản rõ có thể thu hồi thông tin về bản còn lại. Khóa Blowfish không bao giờ cần cho việc đó.

Vậy các câu hỏi liên quan là khóa tồn tại trong dịch vụ bao lâu, bao nhiêu lưu lượng đi qua nó và liệu có ai quan sát và điều khiển được lưu lượng đó không. Việc đổi khóa làm giảm số khối trên mỗi khóa, nhưng khoảng thời gian không phải là giới hạn byte: một đường hầm bận rộn có thể chuyển nhiều dữ liệu hơn hẳn một đường hầm nhàn rỗi trong cùng một giờ. Nếu bạn giữ một mật mã cũ, hãy suy ra giới hạn từ cấu trúc và khối lượng thực tế, không phải từ một con số tròn.

Nếu khối lượng đo được trên mỗi khóa vẫn thấp hơn nhiều so với thang sinh nhật, mức phơi nhiễm nhỏ hơn. Nó vẫn không bằng không và vẫn là lý do để lên kế hoạch di chuyển thay vì ngừng lo lắng.

Thay mật mã, không thay khóa

Chuyển dịch vụ sang một mật mã AEAD được hỗ trợ và xác nhận rằng cả hai bên, phiên bản của họ và phần phụ trợ mật mã của họ có thể thương lượng được nó. Khóa Blowfish dài hơn không thay đổi điều gì quan trọng, và đoán một chỉ thị mới trên một máy khách là cách một đường hầm đang hoạt động trở nên hỏng. Hãy thử thay đổi trên một máy khách và một máy chủ trước khi động đến phần còn lại của đội. Giữ cấu hình cũ sẵn sàng để quay lại cho đến khi mật mã mới vượt qua một chu kỳ kết nối đầy đủ.

Duy trì xác minh chứng chỉ và xác thực tài khoản trong khi thay đổi. Chúng trả lời những câu hỏi khác nhau: một lần đăng nhập thành công không thể làm rộng khối, và một mật mã dữ liệu tốt hơn không miễn trừ việc tin nhầm máy chủ.

Kết thúc kiểm tra bằng cách đọc lại mật mã đã thương lượng trên một kết nối mới, rồi xác nhận rằng mật mã cũ không còn được chấp nhận. Nếu một bên vẫn cung cấp nó, việc di chuyển chưa xong, bất kể cấu hình phía bên kia nói gì.

Bài viết liên quan