Điểm:3

Thành phần của các hàm băm mật mã

lá cờ tr

Tôi đã vấp phải nhiều ý kiến, vì vậy tôi tự hỏi về chúng.

Để cho $H(x)$$F(x)$ là các hàm băm.

  • $H(F(x))$ hoặc $F(H(x))$ An toàn hơn $H(x)$ hoặc $F(x)$
  • $H(F(x))$ hoặc $F(H(x))$ an toàn khi $H(x)$ hoặc $F(x)$ trở nên dễ bị tổn thương
  • $H(H(x))$ An toàn hơn $H(x)$

Lý lịch

Thực hiện nghiên cứu của riêng tôi, tôi đã tìm thấy những tuyên bố gợi ý rằng việc kết hợp hF là một thực tế 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ư TỐI ĐA(H, F) hoặc TỐI THIỂU(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.

Tôi cũng phát hiện ra rằng một số thuật toán liên quan đến việc sử dụng mật khẩu SHA256d, về cơ bản là SHA256(SHA256(x))và về lý thuyết, việc sử dụng nhiều vòng hơn sẽ tăng độ an toàn của hàm băm, điều này không còn xa với việc kết hợp hàm băm với chính nó.

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|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. 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.

Vì vậy, trực giác của riêng tôi là g(f(x)) có nhiều va chạm hơn, nhưng khó tìm ra phương pháp tìm va chạm có mục đích và trong trường hợp các chức năng như SHA hoặc BLACK sự gia tăng va chạm không phải là một vấn đề, nhưng lợi ích bảo mật là xứng đáng.

poncho avatar
lá cờ my
Trong thực tế, nếu chúng ta muốn dựa vào nhiều hàm băm (và đang tìm kiếm khả năng chống va chạm hoặc khả năng chống ảnh hưởng thứ hai), chúng ta sẽ sử dụng $F(x) | H(x)$ (trong đó $|$ là phép nối); thật dễ dàng để chỉ ra rằng (giả sử $F$ hoặc $H$ có đầu ra có độ dài cố định) kết quả là khả năng chống va chạm/tiền ảnh thứ hai nếu $F$ hoặc $H$ có khả năng chống va chạm/tiền ảnh thứ hai
kelalaka avatar
lá cờ in
Tất cả vì điều này? [Làm cách nào để băm mật khẩu một cách an toàn?](https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords)
Kuba Chrabański avatar
lá cờ tr
Tôi tin rằng bạn vẫn cố gắng hiểu ý nghĩa từ toàn bộ câu hỏi của tôi, khi không có gì cả. Tôi có một số việc phải làm, hoàn toàn riêng biệt, mà tôi đã chia nhỏ thành các câu hỏi nhỏ, sau đó tôi sắp xếp lại thành một số câu hỏi lớn hơn
Kuba Chrabański avatar
lá cờ tr
Tôi hỏi về các trường hợp cụ thể để xây dựng một số trực giác, trong tương lai có thể giảm bớt tập hợp các giải pháp để kiểm tra.
kelalaka avatar
lá cờ in
Mật mã học không phải là sự phân chia, giải quyết và kết hợp đặc biệt dành cho người mới bắt đầu. Ma quỷ trong chi tiết và kết hợp hai an toàn có thể tạo ra các thiết kế không an toàn. Tôi chỉ đơn giản nói rằng hãy dừng lại một chút và dành thời gian xác định vấn đề thực tế của bạn, bao gồm cả những gì bạn tìm thấy ở đó và ở đây trong bài đăng câu hỏi.
Điểm:7
lá cờ ru

Thành phần không phải là cách tốt nhất để kết hợp các hàm băm, nhưng rủi ro là câu hỏi về thuộc tính bảo mật nào bạn yêu cầu.

Đối với khả năng chống va chạm, tìm va chạm trên $H(F(X))$ không khó hơn việc tìm ra một va chạm của $F(X)$ và vì vậy nếu $F$ là va chạm bị tổn hại, sau đó như vậy là $H(F(X))$. Để thấy điều này, hãy $m_1$$m_2$ là hai đầu vào riêng biệt sao cho $F(m_1)=F(m_2)$ sau đó bởi vì $H$ là một chức năng chúng ta có $H(F(m_1))=H(F(m_2))$. trong trường hợp cụ thể $F=H$, $H(H(X))$ không có khả năng chống va chạm hơn $H(X)$.

Tương tự, nếu $H(X)$ là va chạm bị tổn hại và $F(X)$ bị xâm phạm trước hình ảnh (bị xâm phạm cực kỳ nghiêm trọng để hình ảnh trước mất ít thời gian hơn so với công việc sinh nhật), chúng tôi có thể thỏa hiệp do va chạm $H(F(X))$ bằng cách tìm một va chạm trên $H$ và sau đó tìm hình ảnh trước cho cả hai thông điệp xung đột.

Lưu ý sự khác biệt trong các chức năng bên trong và bên ngoài. Chúng tôi hiện có thể tìm thấy tin nhắn $m_1$$m_2$ như vậy mà $\mathrm{SHA3}(\mathrm{SHA1}(m_1))=\mathrm{SHA3}(\mathrm{SHA1}(m_2))$, nhưng chúng tôi không thể tìm thấy $m_3$$m_4$ như vậy mà $\mathrm{SHA1}(\mathrm{SHA3}(m_3))=\mathrm{SHA1}(\mathrm{SHA3}(m_4))$.

Tương tự như vậy đối với khả năng chống tiền hình ảnh thứ hai nếu chức năng bên trong bị ảnh hưởng trước hình ảnh thứ hai, thì bố cục cũng vậy.

Đối với khả năng chống lại hình ảnh trước đầy đủ, chắc chắn chúng tôi có thể tìm thấy hình ảnh trước đầy đủ cho bố cục nếu chúng tôi có thể tìm thấy hình ảnh trước đầy đủ cho cả hai $H$$F$. Thỏa hiệp trước hình ảnh của một hàm băm duy nhất là không đủ: hãy xem xét một hàm băm tuyến tính $L(X)$ đó là hình ảnh trước bị hỏng tầm thường. Đối với một mục tiêu $Y$, chúng ta không thể tìm thấy $X$ như vậy mà $\mathrm{SHA3}(L(X))=Y$ cũng không $L(\mathrm{SHA3}(X))=Y$.

Điểm:6
lá cờ cn

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|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ămchố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$$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$ $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$$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$$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.

Kuba Chrabański avatar
lá cờ tr
"Khả năng chống ảnh trước là mối quan tâm đối với các chức năng băm mật khẩu." Đó là những gì tôi mong đợi, được rồi, nhưng điện trở tiền ảnh thứ hai có quan trọng ở đây không? Tôi tin là không, ít nhất là không theo cách thẳng thắn như: "thiếu khả năng chống tiền giả có nghĩa là không có khả năng chống tiền giả thứ hai" và nó áp dụng theo một hướng
Gilles 'SO- stop being evil' avatar
lá cờ cn
@ KubaChrabaÅski Thật vậy, đối với mật khẩu, khả năng chống tạo ảnh thứ hai cũng không liên quan như khả năng chống va chạm. Nếu kẻ thù biết một tiền đề, công việc của anh ta đã hoàn thành.
Kuba Chrabański avatar
lá cờ tr
Được rồi, cảm ơn bạn, câu trả lời rất tốt và toàn diện!
Điểm:4
lá cờ in

Bảo mật mục tiêu của các hàm băm mật mã như SHAx, BLAKE, v.v. là khả năng chống va chạm. Chi phí tấn công va chạm chung cổ điển là $\mathcal{O}(2^{n/2})$-thời gian do cuộc tấn công sinh nhật.

Bây giờ, hãy xem xét các thành phần băm của bạn một cách chi tiết;

  • $H(F(x))$ hoặc $F(H(x))$ An toàn hơn $H(x)$ hoặc $F(x)$
  • Cuộc tấn công mở rộng chiều dài;

Băm kép được đề xuất bởi Bruce Schneier để giảm thiểu tấn công mở rộng chiều dài của các hàm băm dựa trên MD. Tấn công mở rộng chiều dài được thực hiện đối với bí mật tiền tố $H(bí mật||thông điệp)$. Băm đôi được thiết kế như $H(H(x))$Bitcoin sử dụng SHA256d để khai thác chậm. Tuy nhiên, trường hợp của bạn thì khác, cuộc tấn công này chỉ hoạt động nếu bạn muốn sử dụng hàm băm này để xây dựng MAC với cấu trúc bí mật tiền tố. Trong hàm băm kép, những kẻ tấn công không thể mở rộng hàm băm bên trong, vì vậy sẽ an toàn trước việc mở rộng độ dài ngay cả khi các hàm băm đơn lẻ không hoạt động. Tuy nhiên, việc sử dụng SHA3, SHA-512/256, BLAKE2, Shake tốn thời gian đã được bảo mật theo cách này ngay cả đối với máy tính lượng tử mã hóa có thể.

Bất kỳ hàm băm mật mã nào với cuộc tấn công mở rộng độ dài không phải là Oracle ngẫu nhiên. Do đó, SHA3 và BLAKE2 gần với các lời tiên tri ngẫu nhiên hơn.

  • **

  • va chạm

Sức cản**

Nếu băm nội bộ $H$ hoặc $F$ không chống va chạm thì các giá trị băm kết hợp $H(F(x))$ hoặc $F(H(x))$ sẽ không có khả năng chống va chạm. Được cho $x,y$ với $x\neq y$, nếu $H(x)=H(y)$ sau đó $F((H(x))=F(H(y))$ là va chạm đối với thành phần, và tương tự đối với $H(F(\cdot))$ trường hợp.

Nếu bạn muốn giảm thiểu cuộc tấn công va chạm của hàm băm nội bộ, câu trả lời đơn giản; không sử dụng nó.

  • Điện trở hình ảnh trước

    Điện trở tiền ảnh thứ nhất và thứ hai có cùng một vấn đề, bỏ qua ở đây.

  • $H(F(x))$ hoặc $F(H(x))$ an toàn khi $H(x)$ hoặc $F(x)$ trở nên dễ bị tổn thương

Khi nào $F(x)$ có một vụ va chạm sau đó $H(F(x))$ có một vụ va chạm nhỏ được trả lời trong phần đầu tiên.

Để cho $F(x)$ an toàn (không xung đột, không mở rộng độ dài, không hình ảnh trước) nhưng không $H(x)$ thì sao $H(F(x))$? Đây là một chút khó khăn, để sử dụng cuộc tấn công va chạm của $H$ chúng ta cần tìm hình ảnh trước của $F$ vì vậy điều này là an toàn hơn.

  • $H(H(x))$ An toàn hơn $H(x)$

một chút có; $H(H(x))$ là an toàn chống lại cuộc tấn công mở rộng chiều dài. Nếu có sự va chạm của $H$, $H(x)=H(y)$ với $x \neq y$ sau đó nó là một vụ va chạm cho đôi $H(H(x)) = H(H(y))$, quá.

Tôi cũng phát hiện ra rằng một số thuật toán liên quan đến mật khẩu sử dụng SHA256d, về cơ bản là SHA256(SHA256(x)) và về lý thuyết, sử dụng nhiều vòng hơn sẽ tăng độ an toàn của hàm băm, điều này không quá xa so với việc tự kết hợp hàm băm với chính nó.

Bất cứ ai sử dụng SHA256d để băm mật khẩu đều không biết gì về chúng. Băm mật khẩu yêu cầu thời gian, bộ nhớ và tiêu thụ chuỗi để giảm thiểu các tìm kiếm lớn bằng CPU, GPU hoặc ASIC.

SHA256d được sử dụng trong Bitcoin để có khai thác chậm. Bất kỳ hệ thống mới nào được thiết kế để băm mật khẩu nên sử dụng ít nhất Scrypt hoặc Argon2 tốt hơn và các hệ thống cũ phải được di chuyển càng sớm càng tốt.


Để có kết quả chi tiết về học thuật trên bộ kết hợp băm, hãy bắt đầu đọc từ

Và, thậm chí chúng có thể tạo ra nhiều va chạm;

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.