Kỹ thuật phát hiện hàm băm số nguyên tự động
(github.com/skeeto)Hash Function Prospector
Công cụ này là một tiện ích nhỏ nhằm tự động khám phá hàm băm số nguyên. Nó tạo ra hàng tỷ hàm băm số nguyên bằng cách chọn ngẫu nhiên trong 9 phép biến đổi khả nghịch. Các hàm đã tạo được biên dịch JIT và hành vi Avalanche được đánh giá. Hiện tại, hàm tốt nhất sẽ được xuất dưới cú pháp C.
- Điểm Avalanche: số bit đầu ra trung bình giữ nguyên khi lật một bit đầu vào duy nhất. Điểm càng thấp càng tốt. Lý tưởng nhất là 0; tức là khi lật một bit đầu vào thì mọi bit đầu ra đều có xác suất 50% bị đảo.
- Prospector có thể tạo cả hàm băm số nguyên 32-bit và 64-bit. Kiểm tra tùy chọn đầy đủ trong hướng dẫn sử dụng (
-h). Do trình biên dịch JIT nên chỉ hỗ trợ x86-64, nhưng các hàm đã được phát hiện có thể dùng ở mọi nơi.
Các hàm băm đã phát hiện
Có hai lớp hàm băm hữu ích đã được phát hiện bởi Prospector và các tiện ích phụ trợ khác ở đây. Cả hai đều dùng cấu trúc xorshift-multiply-xorshift, nhưng khác nhau ở số vòng.
Hàm 2 vòng
TheIronBorn đã dùng tối ưu hóa tổ hợp để tìm các tham số tốt nhất đã biết cho cấu trúc này.
- 2-vòng hoán vị 32-bit này có mức thiên lệch rất thấp, thậm chí còn thắng tiny hơn với finalizer 32-bit nổi tiếng của MurmurHash3.
- Cấu trúc hàm băm này được phát hiện bởi Prospector, các tham số được tinh chỉnh bằng hill climbing và thuật toán di truyền.
Có nhiều hằng số 2 vòng thiên lệch thấp hơn, trong đó một số còn tốt hơn lowbias32.
Hàm 3 vòng
Thêm thêm một vòng multiply-xorshift vào cấu trúc này có thể đạt tới giới hạn thiên lệch lý thuyết với tham số được chọn cẩn trọng. Chẳng hạn, hàm băm này không thể phân biệt với một PRF hoàn hảo.
triple32không chỉ khắc phục vấn đềhash(0) = 0, mà còn giảm thêm thiên lệch.- Có thêm nhiều hằng số 3 vòng thiên lệch thấp hơn.
Đo thiên lệch chính xác
Chế độ -E đánh giá thiên lệch của một hàm băm cụ thể (-p hoặc -l). Mặc định, Prospector dùng các ước lượng để đánh giá nhanh thiên lệch hàm, nhưng các kết quả có tính nhiễu cao và phi quyết định. Dùng tùy chọn -e để đo thiên lệch chính xác một cách toàn diện.
- Có thể định nghĩa hàm cần kiểm tra bằng
-pvà pattern, hoặc với một thư viện dùng chung chứa hàmhash()kết hợp-l. - Kiểm thử đầy đủ chính xác cho hàm băm 64-bit không có vì sẽ tốn quá nhiều thời gian.
Lựa chọn phép biến đổi khả nghịch
Sử dụng các phép biến đổi khả nghịch sau:
x = ~x;x ^= constant;x *= constant | 1;(chỉ hằng số lẻ)x += constant;x ^= x >> constant;x ^= x << constant;x += x << constant;x -= x << constant;x <<<= constant;(xoay trái)x = bswap(x)(đổi chỗ byte cao và byte thấp)
Về mặt kỹ thuật, x = ~x đã được bao phủ bởi x ^= constant; tuy nhiên, ~x khá đặc biệt và đặc biệt hữu ích.
Băm 16-bit
Vì ràng buộc khác nhau của băm 16-bit, nên có một công cụ riêng hp16 để sinh các hàm băm này.
- Khác với Prospector 32-bit/64-bit, bản triển khai này hoàn toàn portable và chạy được trên gần như mọi hệ thống.
- Có thể tạo và đánh giá S-box 128KiB.
- Băm 16-bit có thể cần thiết hơn trên máy không có lệnh nhân nhanh, nên có thể bỏ qua một số phép toán khi dò tìm (
-m,-r).
Một số kết quả thú vị:
- Băm xorshift-multiply 2 vòng
- Băm xorshift-multiply 3 vòng
- Băm không dùng nhân (chỉ dùng xorshift-add)
Một băm xorshift 3 vòng tốt (hp16 -Xn3 qua tìm kiếm ngắn) đã tiệm cận một S-box tốt (hp16 -S).
Khi làm việc với phép toán 16-bit, cần chú ý quy tắc mở rộng kiểu nguyên của C. Chương trình C được công cụ này xuất ra luôn để ý đến việc nâng cấp phép toán 16-bit sang unsigned int khi cần.
Ý kiến của GN⁺
-
An toàn của hàm băm có vai trò rất quan trọng trong mật mã học và bảo mật máy tính, nên các công cụ dò tìm như vậy rất có tiềm năng cho nghiên cứu. Đặc biệt, việc tìm ra hàm băm có thiên lệch thấp bằng tìm kiếm ngẫu nhiên rất đáng chú ý.
-
Tuy nhiên, an toàn của hàm băm không thể bảo đảm chỉ bằng đặc tính thống kê. Hàm băm mật mã cần an toàn trước các tấn công như PreImage Resistance, Second PreImage Resistance, Collision Resistance..., nên cần phân tích thêm các khía cạnh này.
-
Băm 16-bit có vẻ hữu dụng trong các môi trường hạn chế như IoT hoặc hệ thống nhúng. Ấn tượng ở chỗ có thể tạo hàm băm dùng chỉ ADD/XOR/SHIFT để chạy được cả trên CPU không có lệnh nhân.
-
Việc áp dụng các kỹ thuật tìm kiếm heuristic như Hill Climbing hoặc thuật toán di truyền vào thiết kế hàm băm cũng là ý tưởng mới mẻ. Khi việc áp dụng AI vào thiết kế thuật toán mật mã đang ngày càng mạnh, các kỹ thuật tối ưu hóa như vậy có thể sẽ đóng vai trò quan trọng hơn.
-
Tuy nhiên, do giới hạn của hàm băm, dù Avalanche có tốt đến đâu thì cũng khó khẳng định đây là an toàn về mật mã; đây có lẽ là hạn chế của dự án này. Dù vậy, công cụ như vậy vẫn có thể giúp phân tích và cải thiện các điểm yếu của các hàm băm hiện có.
1 bình luận
Ý kiến trên Hacker News
multiply-shift-xorđã tồn tại bền bỉ từ lâu là điều thú vị