Điều gì làm cho một thuật toán băm có thể bảo mật?


19

Sau khi đọc câu hỏi thú vị này , tôi cảm thấy như mình có một ý tưởng tốt về thuật toán băm không an toàn mà tôi sẽ sử dụng nếu tôi cần, nhưng không biết tại sao tôi có thể sử dụng thuật toán an toàn thay thế.

Vậy phân biệt là gì? Không phải đầu ra chỉ là một số ngẫu nhiên đại diện cho điều băm sao? Điều gì làm cho một số thuật toán băm an toàn?


8
Câu hỏi này phù hợp hơn cho trang web IT Security SE.
Bernard

@Bernard Nếu đó là trường hợp thì tôi vẫn ổn với điều đó, nhưng câu hỏi của tôi không thực sự là về cách sử dụng hàm băm an toàn hay khi nào, nhưng điều gì phân biệt thuật toán băm an toàn với thuật toán băm không an toàn. Điều đó có vẻ giống như một câu hỏi lập trình với tôi, nhưng tôi không duyệt IT Security SE nên có lẽ nó cũng hoạt động ở đó.
CodexArcanum

2
Một câu hỏi tương tự đã được đặt ra trên Bảo mật CNTT
ChrisF

Câu trả lời:


34

Có ba thuộc tính mà một người muốn từ mọi hàm băm mật mã H:

  • kháng tiền đề : Được đưa ra h, thật khó để tìm thấy bất kỳ giá trị nào xvới h = H(x).

  • Kháng tiền đề thứ hai : Được đưa ra x1, rất khó để tìm thấy x2 != x1với H(x1) = H(x2).

  • khả năng chống va chạm : Thật khó để tìm thấy hai giá trị x1 != x2với H(x1) = H(x2).

Với các hàm băm như được sử dụng trong các ngôn ngữ lập trình phổ biến cho các bảng băm (của chuỗi), thông thường không có hàm nào trong số này được đưa ra, chúng chỉ cung cấp cho:

  • khả năng chống va chạm yếu : Đối với các giá trị được chọn ngẫu nhiên (hoặc "thông thường") của miền, khả năng va chạm là nhỏ. Điều này không nói gì về một kẻ tấn công cố tình tạo ra va chạm, hoặc cố gắng tìm kiếm các tiền đề.

Ba thuộc tính trên là (trong số) các mục tiêu thiết kế cho mọi hàm băm mật mã. Đối với một số chức năng (như MD4, SHA-0, MD5), người ta biết rằng điều này không thành công (ít nhất là một phần). Thế hệ hiện tại (SHA-2) được coi là an toàn và thế hệ tiếp theo ("Thuật toán băm an toàn 3") hiện đang trong quá trình chuẩn hóa , sau một cuộc thi .

Đối với một số mục đích sử dụng (như băm mật khẩu và dẫn xuất khóa từ mật khẩu), miền của các giá trị thực sự được sử dụng xrất nhỏ đến mức buộc vũ trụ này trở nên khả thi với các hàm băm an toàn (nhanh) thông thường và đây là khi chúng ta cũng muốn:

  • thực thi chậm : Cho trước x, phải mất một lượng tài nguyên tối thiểu (tốt nhất là có thể định cấu hình) để tính giá trị H(x).

Nhưng đối với hầu hết các mục đích sử dụng khác, điều này không muốn, thay vào đó, người ta muốn:

  • thực hiện nhanh : Cho trước x, tính toán giá trị H(x)càng nhanh càng tốt (trong khi vẫn an toàn).

Có một số cấu trúc (như PBKDF2 và scrypt) để tạo ra hàm băm chậm từ tốc độ nhanh bằng cách lặp lại thường xuyên.

Để biết thêm chi tiết, hãy xem thẻ băm trên trang web trao đổi mật mã của trang web chị em của chúng tôi.


3

Bảo mật có nghĩa là ai đó muốn khiến bạn gặp lỗi bằng cách sử dụng xung đột (nghĩa là thực tế là hai nguồn được băm đến cùng một giá trị) sẽ gặp khó khăn.

Một số đặc điểm:

  • biết băm, xây dựng một tệp băm đến giá trị đó là khó khăn (biến thể, một phần của tệp mới được đưa ra cũng như băm mong muốn)

  • xây dựng hai tệp khác nhau mà băm đến cùng một giá trị là khó khăn (biến thể, một phần của các tệp được đưa ra)


3

Sự khác biệt chính là khá đơn giản: một hàm băm bình thường có nghĩa là để giảm thiểu số lượng va chạm ngẫu nhiên, đến mức có thể mà không làm chậm rất nhiều trong quá trình.

Băm an toàn, nó nhằm ngăn chặn va chạm, ngay cả khi ai đó cố hết sức để gây ra sự cố. Bạn thường không muốn đánh đổi bất kỳ khả năng va chạm nào để hoạt động nhanh hơn. Trong thực tế, làm cho hoạt động cố ý chậm có một số lợi ích bảo mật, ngay cả khi không làm cho việc tìm kiếm va chạm trở nên khó khăn hơn.

Ví dụ về điều sau: nếu tính toán băm mất 50 ms, nó sẽ không ảnh hưởng đến tài liệu đăng nhập của người dùng thông thường (nghĩa là hầu hết người dùng sẽ không nhận thấy sự khác biệt 50ms khi họ đăng nhập). Đồng thời, nếu kẻ tấn công muốn thực hiện một cuộc tấn công từ điển, việc chỉ có thể tạo ra 20 băm một giây là một bất lợi nghiêm trọng . Nói cách khác, trong một số loại lý do, để băm an toàn, chậm hơn là tốt hơn.


3
Trong miền của các hàm băm mật mã, có hai nhóm con quan trọng: nhóm nhanh (được sử dụng để xác thực thư, chữ ký và tương tự) và nhóm chậm - được sử dụng để lấy mã khóa và băm mật khẩu. Đừng trộn lẫn những thứ này, có những ứng dụng cho cả hai.
Paŭlo Ebermann

Trên thực tế, cũng có các hàm băm được thiết kế để tối đa hóa các va chạm: Soundex là một ví dụ. Rõ ràng, điều này làm cho nó một hàm băm an toàn rất nhảm nhí.
Jörg W Mittag

@ JörgWMittag: Không chỉ crappy như một hàm băm an toàn, mà còn khá kém khi sử dụng với bảng băm. Sau đó, một lần nữa, trong khi chắc chắn giống như hàm băm, tôi ngần ngại gọi Soundex là hàm băm, đơn giản vì mục đích và cách sử dụng của nó quá khác biệt so với các hàm băm thông thường.
Jerry Coffin

@JerryCoffin: Tôi đoán nó phụ thuộc vào định nghĩa. Ví dụ, trang Wikipedia tiếng Anh chỉ đơn giản nói rằng hàm băm là bất kỳ thuật toán hoặc chương trình con nào ánh xạ một tập hợp các giá trị tùy ý (có khả năng vô hạn) lớn hơn thành một tập hợp nhỏ hơn (thường là vô hướng). Trong khi đó trang Wikipedia tiếng Đức nói rằng "băm" (tiếng Đức: "zerhacken") là một phần không thể thiếu, tức là việc tránh va chạm và phân phối các giá trị được ánh xạ là chìa khóa. Soundex đáp ứng rất nhiều định nghĩa đầu tiên nhưng không phải là thứ hai.
Jörg W Mittag

3

Đọc này http://www.codinghorror.com/blog/2012/04/speed-hashing.html nó sẽ giải thích mọi thứ tốt hơn nhiều so với tôi có thể giải thích nó. Dưới đây là hai tiêu đề quan trọng nhất trong bài viết trực tiếp giải quyết câu hỏi của bạn:

  • Băm an toàn được thiết kế để chống giả mạo
    • thay đổi hoàn toàn đầu ra của nó với các thay đổi bit đơn nhỏ cho dữ liệu đầu vào
  • Băm an toàn được thiết kế để được chậm

Phần TL; DR của anh ấy ở cuối:

Nếu bạn là người dùng:

Đảm bảo tất cả mật khẩu của bạn có 12 ký tự trở lên, lý tưởng hơn rất nhiều. Tôi khuyên bạn nên áp dụng các cụm mật khẩu, không chỉ dễ nhớ hơn nhiều so với mật khẩu (nếu không gõ) mà còn an toàn một cách lố bịch đối với vũ phu buộc hoàn toàn do độ dài của chúng.

Nếu bạn là nhà phát triển:

Sử dụng bcrypt hoặc PBKDF2 dành riêng để băm bất cứ thứ gì bạn cần để bảo mật. Các giá trị băm mới này được thiết kế đặc biệt khó thực hiện trên GPU. Không sử dụng bất kỳ hình thức băm khác. Hầu như mọi kế hoạch băm phổ biến khác đều dễ bị tấn công bởi các mảng GPU hàng hóa, chúng chỉ nhanh hơn và song song hơn và dễ lập trình hơn cho mỗi năm.


4
Jeff đã sai ở đây ở điểm thứ hai ... trong khi đối với một số cách sử dụng (như băm mật khẩu và dẫn xuất khóa từ mật khẩu) bạn muốn bị chậm, đối với các mục đích sử dụng khác (như xác thực thư, chữ ký, v.v.) nhanh chóng (bảo mật) hàm băm là tốt.
Paŭlo Ebermann

Bạn đúng Paŭlo. Hiệu suất của hàm băm phụ thuộc vào ứng dụng của hàm băm. Tuy nhiên, băm chậm luôn an toàn hơn so với băm nhanh. Lý do bạn sẽ sử dụng hàm băm nhanh là nếu bạn ổn khi hy sinh bảo mật cho hiệu suất.
Nate

2
@Nate, An toàn hơn. Có rất nhiều ứng dụng trong đó tốc độ của hàm băm là không liên quan.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles bạn có thể cho một ví dụ? Điều đó thực sự nghe có vẻ đúng với tôi, nhưng chi tiết cụ thể hơn sẽ hữu ích.
Nate

2
@Nate Ứng dụng băm rõ ràng nhất là xác minh tính toàn vẹn của một phần dữ liệu: truyền hàm băm qua kênh băng thông an toàn nhưng có thể có băng thông thấp, truyền tải trọng lớn có thể qua kênh không an toàn, sau đó kiểm tra xem tải trọng nhận được có như mong đợi không băm. Băm cũng nổi bật trong các phương thức ký (nơi bạn không chỉ xác minh tính toàn vẹn mà còn cả người đã gửi dữ liệu cho bạn). Băm mật khẩu là ngoại lệ.
Gilles 'SO- ngừng trở nên xấu xa'

2

Băm "an toàn" là một hàm băm được cho là khó "giả mạo" theo cách có thể lặp lại theo công thức mà không có kiến ​​thức trước về thông điệp được sử dụng để tạo ra hàm băm. Vì thông tin đó nói chung là bí mật, do đó cần có hàm băm, đây là một đặc tính tốt của hàm băm dành cho sử dụng trong xác thực.

Hàm băm thường được coi là "an toàn" nếu, được đưa ra một thông báo M, hàm băm hàm băm () và giá trị băm H được tạo bởi hàm băm (M) với độ dài tính bằng bit L, không có cách nào dưới đây có thể được thực hiện dưới Thời gian O (2 L ):

  • Cho băm () và H, tạo ra M. (kháng preimage)
  • Cho hàm băm () và M, tạo ra M 2 khác nhau sao cho hàm băm (M 2 ) == H. (khả năng chống va chạm yếu)
  • Cho hàm băm (), tạo ra bất kỳ M 1 và M 2 sao cho hàm băm (M 1 ) == băm (M 2 ). (khả năng chống va chạm mạnh)

Ngoài ra, hàm băm "an toàn" phải có độ dài băm L sao cho 2 Lkhông phải là một số bước khả thi để máy tính thực hiện phần cứng hiện tại. Băm số nguyên 32 bit chỉ có thể có 2,1 tỷ giá trị; trong khi một cuộc tấn công tiền tố (tìm một thông điệp tạo ra một hàm băm cụ thể H) sẽ mất một thời gian, nó không khả thi đối với nhiều máy tính, đặc biệt là các máy tính trong tay các cơ quan chính phủ được điều lệ với việc phá mã. Ngoài ra, theo thuật toán xác suất, thuật toán tạo và lưu trữ các tin nhắn ngẫu nhiên và băm của chúng sẽ có 50% trong việc tìm kiếm một hàm băm trùng lặp với mỗi tin nhắn mới sau khi chỉ thử 77.000 tin nhắn và có 75% cơ hội trúng nhân đôi chỉ sau 110.000. Ngay cả băm 64 bit vẫn có 50% cơ hội va chạm sau khi chỉ thử khoảng 5 tỷ giá trị. Đó là sức mạnh của cuộc tấn công sinh nhật vào băm nhỏ. Ngược lại,số thập phân (1,5 * 10 34 ).

Hầu hết các cuộc tấn công được chứng minh vào băm mật mã là các cuộc tấn công va chạm và đã chứng minh khả năng tạo ra các tin nhắn va chạm trong thời gian chưa đến 2 L (hầu hết vẫn là thời gian theo cấp số nhân, nhưng giảm một nửa số mũ là giảm độ phức tạp đáng kể vì nó tạo ra sự phức tạp hàm băm 256 bit dễ giải quyết như 128 bit, 128 bit dễ giải quyết như 64 bit, v.v.).

Ngoài kích thước băm nhỏ, các yếu tố khác có thể khiến băm không an toàn là:

Công việc thấp - một hàm băm được thiết kế để sử dụng bởi hàm băm hoặc cho các mục đích "tổng kiểm tra" khác thường được thiết kế để tính toán không tốn kém. Điều đó làm cho một cuộc tấn công vũ phu dễ dàng hơn nhiều.

"Trạng thái dính" - Hàm băm thiên về các mẫu đầu vào trong đó giá trị băm hiện tại của tất cả các đầu vào cho đến nay không thay đổi khi được cung cấp thêm một byte đầu vào cụ thể. Có "trạng thái dính" giúp dễ dàng tìm thấy các xung đột, bởi vì một khi bạn xác định được một thông báo tạo ra hàm băm "trạng thái dính", việc tạo ra các thông điệp khác có cùng hàm băm bằng cách nối thêm các byte đầu vào giữ cho băm ở trạng thái "dính" ".

Khuếch tán - Mỗi byte đầu vào của tin nhắn nên được phân phối giữa các byte của giá trị băm theo cách phức tạp như nhau. Các hàm băm nhất định tạo ra các thay đổi có thể dự đoán được đối với các bit nhất định trong hàm băm. Điều này một lần nữa làm cho sự va chạm tạo ra tầm thường; đưa ra một thông điệp tạo ra một hàm băm, các xung đột có thể được tạo ra dễ dàng bằng cách đưa ra các giá trị mới cho thông điệp chỉ ảnh hưởng đến các bit thay đổi có thể dự đoán được.


0

Sử dụng thuật toán phù hợp cho nhiệm vụ trong tầm tay.

CRC được sử dụng để phát hiện / sửa lỗi.

Các thông báo mã hóa như SHA2 được sử dụng như một khối xây dựng cho các cấu trúc mã hóa (chữ ký số, MAC, các hàm băm / mật khẩu khóa) và các giao thức bảo mật.

Trong bảng băm / từ điển / bản đồ sử dụng SipHash .

Những gì bạn gọi là thuật toán băm không an toàn không nên được sử dụng trong các bảng băm , như đã được chứng minh bằng các mục CVE sau: CVE-2003-0364, CVE-2011-4461, CVE-2011-4838, CVE-2011-4885, CVE-2011- 4462, CVE-2011-4815, CVE-2012-0840, CVE-2012-5371 , CVE-2012-5374, CVE-2012-5375

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.