trí tuệ chung
Như một chút khôn ngoan chung, việc kết hợp các mã nguyên thủy hiếm khi là một chiến thắng trực tiếp. Nó có thể tăng cường một số thuộc tính nếu được thực hiện đúng, nhưng làm suy yếu các thuộc tính khác.Vì vậy, nó chỉ nên được thực hiện nếu nó củng cố các thuộc tính mà bạn quan tâm và không làm suy yếu các thuộc tính mà bạn quan tâm.
kết hợp H và F là một phương pháp phổ biến để giữ an toàn khi một trong số chúng trở nên không an toàn, nhưng có nhiều ý kiến trái chiều về việc liệu sự kết hợp đó có an toàn như MAX(H, F) hay MIN(H, F) về mặt an toàn, hầu như không ai đề xuất hơn mức an toàn sẽ cao hơn hoặc thấp hơn mức này.
Bạn đã tìm thấy nhiều ý kiến trái chiều bởi vì nó phụ thuộc vào cách bạn thực hiện sự kết hợp. (Điều đó, hoặc vì mọi người không hiểu rõ. Nó xảy ra.)
Tôi cũng có một số suy nghĩ cá nhân về điều này, bắt nguồn từ toán học ở trường. Tôi thấy rõ ràng rằng nếu f:A -> B
và rất nhiều |A| > |B|
và g:B -> C
và rất nhiều |B| > |C|
sau đó g(f(x))
nên có nhiều va chạm hơn f hoặc g.
Đếm va chạm là không liên quan. Điều quan trọng là khó khăn trong việc tìm kiếm chúng. MD5(x)||SHA1(x)
là hàm băm 288 bit và có thể có ít xung đột hơn trên chuỗi 257 bit so với SHA256(x)
trên thực tế, điều đó hợp lý MD5(x)||SHA1(x)
hoàn toàn không có xung đột trên chuỗi 257 bit, trong khi SHA256(x)
phải có va chạm theo nguyên tắc chuồng bồ câu. Nhưng chúng tôi biết cách tìm va chạm trên MD5(x)||SHA1(x)
đối với các chuỗi dài hơn một chút trong thời gian dài nhưng có thể thực hiện được (nó chỉ đắt hơn một chút so với các xung đột SHA1), trong khi chúng tôi hoàn toàn không biết cách tìm các xung đột SHA256.
Nhưng cũng có một thực tế là chúng ta kết hợp 2 hàm phức tạp nên hơi khó "phá" hơn.
Không, đây không phải là sự thật. Nó hoàn toàn phụ thuộc vào những gì bạn đang kết hợp và làm thế nào.
Soạn hai giá trị băm
Về băm và chống va chạm, soạn hai hàm băm làm giảm tính bảo mật. Nói cách khác, $H \circF$ ít va chạm hơn so với $H$ hoặc $F$ của riêng mình.
Dễ thấy rằng nếu $F$ có một vụ va chạm, sau đó cũng vậy $H \circF$: nếu $F(x_1 = F(x_2)$ với $x_1 \ne x_2$ sau đó $(H \circ F)(x_1) = H(F(x_1)) = H(F(x_2)) = (H \circ F)(x_2)$. Điều này một mình có nghĩa là việc soạn thảo hai giá trị băm, tốt nhất, là vô ích nếu điều bạn quan tâm là khả năng chống va chạm: bạn cũng có thể chỉ cần sử dụng $F$.
Khả năng chống va chạm của $H \circF$ có thể tốt hơn so với $H$ một mình. Nếu $H$ có va chạm $H(y_1) = H(y_2)$ với $y_1 \ne y_2$, để sử dụng thực tế này để tìm một va chạm cho $H \circF$, bạn cần tìm một hình ảnh trước cho cả hai $y_1$ và $y_2$. Vì vậy, bạn tự tin rằng $F$ chống va chạm và chống tạo ảnh trước, sau đó $H \circF$ có thể an toàn hơn $H$ về khả năng chống va chạm. Tuy nhiên, vì nó không an toàn hơn $F$, lý do duy nhất để sử dụng cấu trúc này là nếu nó cải thiện một số thuộc tính khác.
Nếu $H \circF$ có va chạm, tức là nếu $H(F(x_1)) = H(F(x_2))$ với $x_1 \ne x_2$, thì một trong hai $F(x_1) = F(x_2)$ và đây là một vụ va chạm cho $F$, hoặc $F(x_1) \ne F(x_2)$ và đây là một vụ va chạm cho $H$. Vì vậy, thành phần không tệ hơn thành phần kém nhất trong hai thành phần, về khả năng chống va chạm.
Tổng hợp hai giá trị băm có thể cải thiện khả năng chống tạo ảnh trước. Để tận dụng cấu trúc của $H \circF$ khi tìm kiếm một hình ảnh trước, cả hai bạn phải tìm một hình ảnh trước thông qua $H$ và sau đó là một tiền đề của điều đó thông qua $F$. Tuy nhiên, không có hàm băm mật mã nào mà tôi đủ điều kiện coi là chủ đạo đã từng bị phá vỡ khả năng chống ảnh hưởng trước, vì vậy đây không phải là mối lo ngại thực tế.
Kháng tiền ảnh là một mối quan tâm đối với mật khẩu mở khóa hàm băm. Nhưng mà các hàm băm mật khẩu là một loại mật mã nguyên thủy hoàn toàn khác với các hàm băm âthông thườngâ. Chúng có các tham số khác nhau và các mục tiêu bảo mật khác nhau. Khả năng chống va chạm không liên quan đến việc băm mật khẩu. Soạn hai hàm băm mật khẩu có thể hợp lý, nhưng bạn cần cẩn thận: chắc chắn là có thể làm sai.
Việc tổng hợp hai giá trị băm cũng có thể cải thiện các thuộc tính bảo mật khác với các thuộc tính xác định hàm băm mật mã. Băm thường được sử dụng như tiên tri ngẫu nhiênvà các giá trị băm thường được sử dụng (chẳng hạn như họ SHA-2) được biết là không hoàn hảo như các lời tiên tri ngẫu nhiên do một tấn công mở rộng chiều dài. Soạn hai giá trị băm, thậm chí cùng chức năng, như trong SHA256d(x) = SHA256(SHA256(x))
, loại bỏ cuộc tấn công mở rộng độ dài và không tự đưa ra một điểm yếu đã biết khác. (âRiêng riêngâ rất quan trọng: nếu bạn kết hợp SHA256d và SHA256 trên cùng một dữ liệu, kết quả có thể rất tai hại.)
Nối hai giá trị băm
Một cách đơn giản khác để kết hợp hai giá trị băm là nối chúng: $H(x) || F(x)$. Đây là một cải tiến rõ ràng về khả năng chống va chạm: nếu có va chạm trong $H || F$, nó cũng là một vụ va chạm cho $H$ và $F$. Kết nối cũng cải thiện điện trở tiền ảnh thứ hai: nếu bạn biết $H(x_1) || F(x_1)$ và bạn muốn tìm $x_2 \ne x_1$ như vậy mà $H(x_1) || F(x_1) = H(x_2) || F(x_2)$, bạn cần tìm tiền ảnh thứ hai cho cả hai $F$ và $H$. Đối với cả khả năng chống va chạm và khả năng chống ảnh hưởng thứ hai, sự ghép nối ít nhất mạnh bằng sự yếu hơn của cả hai và có thể mạnh hơn.
Một ví dụ trong đó phép nối được sử dụng trong giao thức trong thế giới thực là các phiên bản cũ hơn của Giao thức SSL/TLS, cho đến phiên bản 1.1. Họ đã sử dụng MD5(x)||SHA1(x)
đối với chữ ký bắt tay, trong đó mối quan tâm bảo mật thiết yếu là khả năng chống ảnh hưởng thứ hai. TLS 1.2 đã thay thế điều này bằng một hàm băm duy nhất, có thể tùy chỉnh (thường là SHA-256 hoặc SHA-384): độ phức tạp bổ sung không đáng (và dù sao thì cũng không có hàm băm phổ biến hợp lý nào để kết hợp với SHA-256 vào thời điểm đó).
Kết hợp không phải là một chiến thắng rõ ràng. Ví dụ, nó làm giảm điện trở tiền ảnh đầu tiên đến chức năng yếu hơn trong hai chức năng: nếu bạn biết $H(x) || F(x)$ sau đó bạn có thể tìm thấy $x$ nếu bạn biết cách thực hiện việc này thông qua $H(x)$ hoặc thông qua $F(x)$.
Xoring hai giá trị băm
Tuy nhiên, một cách khác để kết hợp hai giá trị băm là xor chúng: $H(x) \oplus F(x)$. Các thuộc tính bảo mật của kết quả phụ thuộc vào sự lựa chọn của các chức năng. Điều này rõ ràng có khả năng dẫn đến sai lầm khủng khiếp: trường hợp đặc biệt $H = F$ kết quả là đầu ra hoàn toàn không có bit. Mặt khác, nếu $H$ và $F$ độc lập thì $H \oplus F$ ít nhất cũng tốt bằng cái mạnh hơn trong số hai cái như một lời tiên tri ngẫu nhiên. Tôi không chắc liệu có một điều kiện hợp lý nào có thể đảm bảo khả năng chống va chạm hay không.