Băm mật khẩu bằng cách sử dụng NP hoàn thành vấn đề


16

Các thuật toán băm mật khẩu thường được sử dụng hoạt động như thế này ngày nay: Muối mật khẩu và đưa nó vào một KDF. Ví dụ: sử dụng PBKDF2-HMAC-SHA1, quá trình băm mật khẩu là DK = PBKDF2(HMAC, Password, Salt, ...). Bởi vì HMAC là một hàm băm 2 vòng với các phím được đệm và SHA1 là một chuỗi các hoán vị, dịch chuyển, xoay và hoạt động theo bit, về cơ bản, toàn bộ quá trình là một số thao tác cơ bản được tổ chức theo một cách nhất định. Về cơ bản, điều đó không rõ ràng về việc họ thực sự khó tính toán như thế nào. Đó có lẽ là lý do tại sao các hàm một chiều vẫn là một niềm tin và chúng ta đã thấy một số hàm băm mật mã quan trọng trong lịch sử trở nên không an toàn và không được dùng nữa.

Tôi đã tự hỏi liệu có thể tận dụng các vấn đề hoàn chỉnh của NP để băm mật khẩu theo cách hoàn toàn mới hay không, hy vọng sẽ mang lại cho nó một nền tảng lý thuyết vững chắc hơn. Ý tưởng chính là, giả sử P! = NP (nếu P == NP thì không có OWF nên các sơ đồ hiện tại cũng bị phá vỡ), là một vấn đề NPC có nghĩa là câu trả lời dễ xác minh nhưng khó tính toán. Khách sạn này phù hợp với các yêu cầu băm mật khẩu. Nếu chúng tôi xem mật khẩu là câu trả lời cho vấn đề NPC, thì chúng tôi có thể lưu trữ sự cố NPC dưới dạng hàm băm của mật khẩu để chống lại các cuộc tấn công ngoại tuyến: Thật dễ dàng để xác minh mật khẩu, nhưng khó bị bẻ khóa.

Hãy cẩn thận, cùng một mật khẩu có thể được ánh xạ tới nhiều trường hợp của một vấn đề NPC, có lẽ không phải tất cả chúng đều khó giải quyết. Bước đầu tiên trong nghiên cứu này, tôi đã cố gắng diễn giải một chuỗi nhị phân như là một câu trả lời cho vấn đề 3-SAT và để xây dựng một trường hợp của vấn đề 3-SAT mà chuỗi nhị phân là một giải pháp. Ở dạng đơn giản nhất, chuỗi nhị phân có 3 bit: x_0, x_1, x_2. Sau đó, có 2 ^ 3 == 8 mệnh đề:

000 (    (x_0) v    (x_1) v    (x_2) )
--------------------------------------
001 (    (x_0) v    (x_1) v NOT(x_2) )
010 (    (x_0) v NOT(x_1) v    (x_2) )
011 (    (x_0) v NOT(x_1) v NOT(x_2) )
100 ( NOT(x_0) v    (x_1) v    (x_2) )
101 ( NOT(x_0) v    (x_1) v NOT(x_2) )
110 ( NOT(x_0) v NOT(x_1) v    (x_2) )
111 ( NOT(x_0) v NOT(x_1) v NOT(x_2) )

Giả sử chuỗi nhị phân là 000. Sau đó, chỉ có 1 trong 8 mệnh đề là sai (đầu tiên). Nếu chúng ta loại bỏ mệnh đề đầu tiên và AND 7 mệnh đề còn lại, thì 000 là một giải pháp của công thức kết quả. Vì vậy, nếu chúng tôi lưu trữ công thức, sau đó chúng tôi có thể xác minh 000.

Vấn đề là, đối với chuỗi 3 bit, nếu bạn thấy 7 mệnh đề khác nhau ở đó, thì bạn sẽ biết ngay cái nào bị thiếu và điều đó sẽ tiết lộ các bit.

Vì vậy, sau đó tôi quyết định loại bỏ 3 trong số chúng, chỉ giữ 4 số được đánh dấu bởi 001, 010, 100 và 111. Điều này đôi khi đưa ra các va chạm nhưng làm cho việc giải quyết vấn đề trở nên ít tầm thường hơn. Các va chạm không phải lúc nào cũng xảy ra, nhưng liệu chúng chắc chắn sẽ biến mất khi đầu vào có nhiều bit hơn chưa được biết.

Biên tập. Trong trường hợp chung trong đó chuỗi nhị phân có thể là bất kỳ (000, 001, ..., 111), vẫn còn 8 mệnh đề trong đó 7 mệnh đề đúng và 1 là sai. Chọn 4 mệnh đề cho giá trị thật (001, 010, 100, 111). Điều này được phản ánh trong việc thực hiện nguyên mẫu dưới đây.

Biên tập. Như câu trả lời được hiển thị bởi @DW bên dưới, phương pháp chọn mệnh đề này vẫn có thể dẫn đến quá nhiều mệnh đề trên một tập hợp các biến đã cho, có thể nhanh chóng thu hẹp giá trị của chúng. Có các phương pháp khác nhau để chọn các mệnh đề trong tổng số các mệnh đề 7 * C (n, 3). Ví dụ: Chọn một số mệnh đề khác nhau từ một tập hợp các biến đã cho và chỉ thực hiện điều đó cho các biến liền kề ((x_0, x_1, x_2), (x_1, x_2, x_3), (x_2, x_3, x_4), .. .) và do đó tạo thành một chu kỳ thay vì một cụm. Phương pháp này có thể không hoạt động tốt vì theo trực giác, bạn có thể thử các bài tập sử dụng cảm ứng để kiểm tra xem tất cả các mệnh đề có thể được thỏa mãn hay không. Vì vậy, để làm cho nó đơn giản giải thích cấu trúc tổng thể, hãy sử dụng phương thức hiện tại.

Số mệnh đề cho chuỗi n bit là 4 * C (n, 3) = 4 * n * (n - 1) * (n - 2) / 6 = O (n ^ 3), có nghĩa là kích thước của hàm băm là đa thức về kích thước của mật khẩu.

Có một triển khai nguyên mẫu trong Python ở đây . Nó tạo ra một trường hợp vấn đề 3-SAT từ một chuỗi nhị phân đầu vào của người dùng.


Sau phần giới thiệu dài này, cuối cùng câu hỏi của tôi:

  1. Liệu cấu trúc trên (như được thực hiện trong nguyên mẫu) có hoạt động như băm mật khẩu an toàn, hoặc ít nhất là trông có triển vọng, có thể được sửa đổi, v.v.? Nếu không thì thất bại ở đâu?

  2. Vì chúng ta có các mệnh đề 7 * C (n, 3) để lựa chọn, nên có thể tìm một cách khác để xây dựng một thể hiện 3-SAT an toàn phù hợp để sử dụng làm hàm băm mật khẩu, có thể với sự trợ giúp của ngẫu nhiên không?

  3. Có công việc tương tự nào đang cố gắng tận dụng tính hoàn chỉnh của NP để thiết kế các lược đồ băm mật khẩu an toàn đã được chứng minh và đã có một số kết quả (tích cực hay tiêu cực) không? Một số phần giới thiệu và liên kết sẽ rất được hoan nghênh.


Biên tập. Tôi chấp nhận câu trả lời dưới đây của @DW, người đầu tiên trả lời và đưa ra những hiểu biết tuyệt vời về cấu trúc vấn đề cũng như các tài nguyên hữu ích. Lược đồ lựa chọn mệnh đề ngây thơ được giới thiệu ở đây (như được triển khai trong nguyên mẫu Python) dường như không hoạt động vì có thể nhanh chóng thu hẹp các phép gán biến trong các nhóm nhỏ. Tuy nhiên, vấn đề vẫn còn mở vì tôi chưa thấy một bằng chứng chính thức nào cho thấy việc giảm NPC-to-PasswordHashing như vậy sẽ không hiệu quả. Ngay cả đối với bài toán giảm 3-SAT cụ thể này, có thể có nhiều cách chọn mệnh đề khác nhau mà tôi không muốn liệt kê ở đây. Vì vậy, bất kỳ cập nhật và thảo luận vẫn rất được hoan nghênh.


Tôi đã cắm thế hệ mệnh đề của bạn vào một bộ giải sat (picosat sử dụng pycosat) ở đây . Với nbits = 300, dài nhất là tạo các mệnh đề, pycosat giết chết thể hiện. Tôi đã không vượt quá 300 vì thế hệ mệnh đề của bạn thực sự rất dài. Ngoài ra, 0 ... 0 luôn là một giải pháp trong thế hệ của bạn. Nếu bạn luôn có giải pháp 'dễ dàng' như vậy, thì điều này sẽ không hoạt động.
holf

Câu trả lời:


17

Thật không may, điều này dường như không hoạt động (xem bên dưới để biết chi tiết) và có vẻ khó tìm ra cách để làm cho loại ý tưởng này mang lại một kế hoạch an toàn có thể chứng minh được.

Vấn đề với ý tưởng chung của bạn

Bạn không phải là người đầu tiên nghĩ ra ý tưởng cố gắng mã hóa dựa trên các vấn đề hoàn thành NP. Vấn đề là độ cứng NP chỉ đảm bảo độ cứng trong trường hợp xấu nhất, nhưng mật mã học đòi hỏi độ cứng trường hợp trung bình. Đã có nhiều nỗ lực để mã hóa cơ sở cho các vấn đề hoàn thành NP (ví dụ, hệ thống mật mã knapsack), nhưng chúng không được tốt. Thông thường những gì xảy ra là mọi người khám phá các thuật toán thường có hiệu quả trung bình (hoặc với xác suất không tầm thường), mặc dù trong trường hợp xấu nhất chúng là theo cấp số nhân; điều này là đủ để phá vỡ tiền điện tử, mặc dù nó không mâu thuẫn với độ cứng NP.

Quan điểm dựa vào vấn đề NP-hard có lẽ là để đảm bảo một loại bảo mật có thể chứng minh được cho sơ đồ của bạn (ví dụ: nếu P NP thì hệ thống mật mã của bạn được bảo mật), nhưng vì sự khác biệt giữa trường hợp xấu nhất và trường hợp trung bình độ cứng, loại kết quả đó không thực sự tuân theo và không rõ làm thế nào để xây dựng một hệ thống mật mã nơi chúng ta có được kết quả như vậy.

Tôi đề nghị đọc thêm về chủ đề này. Bạn có thể tìm thấy một số điểm khởi đầu hữu ích tại Tầm quan trọng của các vấn đề NP-Hard trong Mật mã học , Các vấn đề mở phức tạp trong trường hợp trung bình ngoài các chức năng một chiều , Trạng thái của Thế giới của Impagliazzo? , Trường hợp xấu nhất để giảm trường hợp trung bình .

Vấn đề với sơ đồ cụ thể của bạn

Đề xuất cụ thể của bạn không được chỉ định đầy đủ. Để phân tích một lược đồ, bạn cần xác định đầy đủ cách thức hoạt động của lược đồ. Trong trường hợp của bạn, không rõ bạn chọn 4 trong số 7 mệnh đề trong ví dụ chung như thế nào. (Và một ví dụ duy nhất không thay thế cho một đặc tả mô tả cách bạn làm điều đó nói chung.)

Điều đó nói rằng, có vẻ như sơ đồ của bạn sẽ dễ dàng bị phá vỡ cho dù bạn có khởi tạo những chi tiết đó như thế nào. Theo trực giác, các trường hợp 3SAT với rất nhiều mệnh đề thường dễ dàng. Cụ thể hơn, tôi sẽ mô tả một cuộc tấn công giải quyết loại trường hợp 3SAT được tạo bởi sơ đồ của bạn. Trước tiên, hãy thử khôi phục . Chỉ tập trung vào các mệnh đề chỉ đề cập đến các biến đó (chứ không phải bất kỳ biến nào khác). Cần có 40 mệnh đề như vậy, bởi vì có 10 cách để chọn một tập hợp con gồm 3 trong số các biến. Có bài tập có thể có cho 5 biến đó, vì vậy hãy thử tất cả chúng và loại bỏ bất kỳ bài tập nào bị vi phạm bởi bất kỳ điều khoản nào trong số 40 mệnh đề. Tôi dự đoán rằng điều này sẽ khiến bạn chỉ có một nhiệm vụ phù hợp với tất cả các mệnh đề.2 5x0,x1,x2,x3,x425

(Tại sao? Với mỗi tập hợp con của 3 biến, 4 mệnh đề thu hẹp chúng tôi để chỉ có số bài tập phù hợp với 4 mệnh đề đó. Chúng tôi có 10 tập con như vậy, vì vậy, chúng tôi hy vọng về khả năng một phép gán sai sẽ phù hợp với tất cả 10 tập con là khoảng và vì chỉ có bài tập không chính xác có thể, nên có lẽ khoảng không ai trong số chúng sẽ sống sót trong các bài kiểm tra này. Hoặc, để thử một tập hợp heuristic khác: bất kỳ gán không đúng sẽ thỏa mãn một mệnh đề duy nhất với xác suất , do đó, theo xác suất thì nó có thể thỏa mãn tất cả 40 mệnh đề là khoảng1 / 2 10 2 5 - 1 7 / 8 ( 7 / 8 ) 402 - 7,7 ( 2 5 - 1 ) × 2 - 7,70,151/21/2102517/8(7/8)4027.7. Do đó, số lượng bài tập không chính xác dự kiến ​​phù hợp với tất cả 40 mệnh đề là khoảng . Vì vậy, thông thường tất cả các bài tập không chính xác đều bị loại bỏ, chỉ để lại bài tập đúng.)(251)×27.70.15

Điều này có thể được lặp lại cho mỗi nhóm 5 biến, phục hồi duy nhất nhiệm vụ thỏa mãn duy nhất cho mỗi nhóm. Nếu có bất kỳ sự mơ hồ nào, các bài tập của ứng viên có thể được kiểm tra đối với các mệnh đề khác.

Theo cách này, chúng tôi thấy rằng có một thuật toán hiệu quả thường sẽ giải quyết lớp các trường hợp 3SAT được tạo bởi thủ tục của bạn. Nó sẽ không giải quyết tất cả các trường hợp 3SAT, nhưng các trường hợp bạn tạo có cấu trúc đặc biệt và nó giải quyết các trường hợp có cấu trúc đặc biệt đó một cách hiệu quả. Điều này minh họa rõ điểm: một số trường hợp của 3SAT dễ hơn các trường hợp khác và độ cứng của 3SAT (trong trường hợp phức tạp nhất) nói rất ít hoặc không có gì về độ cứng của các trường hợp đặc biệt bạn tạo ra hoặc độ cứng của trường hợp 3SAT trung bình.


Có một triển khai tham chiếu hoạt động như một thông số đầy đủ. Trong nỗ lực đầu tiên này, kế hoạch thực sự đơn giản. Tôi chỉ đơn giản chọn 4 mệnh đề sẽ cung cấp 001, 010, 100 và 111 khi thay thế mật khẩu. Điều này cung cấp 4 kết hợp hợp lệ trong số 8 cho mỗi điều khoản.
Cyker

Bạn có thể đúng rằng điều này nhanh chóng mặc dù đưa ra quá nhiều mệnh đề khiến cho có thể thu hẹp giải pháp nhanh chóng. Tuy nhiên, chúng tôi bắt đầu với các mệnh đề O (n ^ 3) và chúng tôi có quyền tự do lựa chọn để giữ. Các bộ ba có thể không độc lập. Vì vậy, tôi tự hỏi nếu các mệnh đề được chọn với một mẫu cố gắng loại bỏ các trường hợp vấn đề dễ dàng, cho dù phân tích heuristic của bạn vẫn còn.
Cyker

1
Nhưng điều thú vị hơn là, đại khái, chúng ta không có bất kỳ vấn đề NPC trung bình nào?
Cyker

1
@Cyker, bạn hoàn toàn đúng. Nói đúng ra, bạn không thể nhân xác suất vì không có gì đảm bảo rằng xác suất là độc lập. Đó chỉ là một heuristic để cố gắng dự đoán thuật toán có thể hoạt động tốt như thế nào. Các heuristic có thể sai. Thử nghiệm cuối cùng là thực hiện thuật toán và xem liệu nó có hoạt động hay không.
DW

2
Một bài kiểm tra nhanh có thể là thử các trường hợp của bạn trên bộ giải SAT. Tôi nghĩ rằng SAT Solvers sẽ hiệu quả trong các trường hợp của bạn nhưng tôi đã không hoàn toàn cố gắng để hiểu thông số kỹ thuật của bạn. Hãy thử tạo một ví dụ 10000 biến và chạy SAT Solver (nhân tiện, không cần đệm / tạo muối, mật khẩu sẽ nhỏ hơn nhiều ...)
holf
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.