2012-05-03 17 views
5

Rất thường thấy .NET class Random được sử dụng để tạo mật khẩu.Làm cách nào để chứng minh rằng lớp .NET Random không phù hợp để tạo mật khẩu?

Một mặt, this question I asked earlier cho thấy rằng tạo ra một loạt dữ liệu "bí mật" sử dụng dữ liệu có thể dự đoán được là class Random. Mặt khác, tôi hiện đang cố gắng thực hiện dự đoán chính xác và mã của tôi hoạt động ở tốc độ khoảng sáu triệu lần đoán hạt mỗi ngày trên một lõi đơn - không phải cực kỳ nhanh, sẽ mất gần một năm để liệt kê tất cả các giá trị hạt giống có thể với tốc độ đó.

Có cách nào rõ ràng hơn và nhanh hơn để cho thấy mật khẩu được tạo bằng dữ liệu từ class Random() yếu hơn nhiều so với dự kiến ​​thường không?

+5

Tại sao không chỉ hiển thị cho họ phản hồi từ Eric Lippert và câu hỏi bạn đã liên kết? Nó thậm chí còn cho thấy một ví dụ về việc tạo số ngẫu nhiên mã hóa - nếu bạn đang cố gắng thuyết phục tâm trí kinh doanh, thì chỉ nhắc đến từ mật mã nên làm việc :-P –

+0

Tôi nghĩ rằng bạn có logic theo cách sai. Nếu có một ứng dụng quan trọng về bảo mật, gánh nặng là trên những người đề xuất một giải pháp để chứng minh rằng giải pháp đáp ứng các yêu cầu bảo mật. Tôi nghi ngờ bất cứ ai có thể làm điều này cho lớp ngẫu nhiên của NET. Các PRNG được sử dụng trong các ứng dụng mã hóa đã xác định các thuộc tính bảo mật, vì vậy có thể cho thấy chúng đáp ứng các yêu cầu được xác định. –

Trả lời

0

Từ hiểu biết của tôi, lớp Random tạo ra các giá trị ngẫu nhiên dựa trên "thuật toán ngẫu nhiên Psuedo", vì vậy trên thực tế chúng không phải là ngẫu nhiên. chúng dựa trên việc thực hiện cụ thể một thuật toán toán học, do đó kết quả có thể dự đoán được. Vì vậy, nếu tôi đã cố gắng để phá vỡ thuật toán này, cho một vi phạm an ninh, không phải là tôi sẽ, tôi cần phải biết một số thông tin: Tôi biết những gì các thuật toán là, nó có thể truy cập công khai thông qua. Net khuôn khổ, các là gì giá trị đầu vào (hạt giống)?

Một lần nữa bạn không thể chỉ làm phép thuật các giá trị đầu vào này, chúng phải dựa trên một cái gì đó, vì vậy cái gì?

Trong ví dụ bạn đang cố gắng, như tôi đã hiểu, để tạo ra tất cả các giá trị hạt giống có thể có. Điều này giống như bạn nói mất một thời gian dài!

Nhưng tại sao tôi lại làm điều này? cách tiếp cận thông minh nhất là thử và đoán những gì bạn sử dụng để tạo ra các giá trị đầu vào của bạn? tức là bạn đang sử dụng thời gian? Khi nào mật khẩu được đặt lại? Mật khẩu này được tạo khi nào? Những gì các tập hợp các giá trị này cung cấp cho tôi? Bạn sử dụng số lượng lớn như thế nào?

Nếu bạn có thể thử nghiệm 6 triệu hạt trong một ngày, có bao nhiêu giá trị áp dụng một số logic thu hẹp tập hợp các giá trị có thể xuống? Nếu đó là < 6 triệu tôi có thể phá vỡ mật khẩu của bạn sau 24 giờ.

Điều đó nói rằng nếu bạn có thể làm cho tập con của bạn của hạt giống đủ lớn và không đủ khả năng thì điều này là khó khăn. Vì vậy, các câu hỏi, giống như nhiều thứ trong an ninh đi xuống làm, làm thế nào an toàn này cần phải được? Không có gì 100%!

+1

Ba đoạn đầu tiên của bạn áp dụng cho tất cả RNG thường được sử dụng, đúng không? Nếu tôi có bản ngã và hạt giống của bạn, tôi có thể nhận được giá trị tiếp theo. – Cylindric

+0

Sự thật nhưng phức tạp là một vấn đề ở đây. Nhưng ngẫu nhiên chỉ có một chìa khóa duy nhất? Nó không phải là rất phức tạp vì vậy logic cần thiết để đoán rằng chìa khóa là dễ dàng hơn. Nó không được thiết kế để tạo mật khẩu ngẫu nhiên. Một cái gì đó giống như một băm MD5 được thiết kế để mã hóa, vì vậy nó phức tạp hơn, nó có nhiều khóa, vv do đó logic cần thiết để nhân rộng kết quả phức tạp hơn nhiều – Liam

+1

Nếu bạn đang sử dụng MD5 cho bất cứ điều gì liên quan đến mật khẩu và/hoặc mã hóa, bạn cũng có thể không bận tâm. – Cylindric

0

Trong câu hỏi ban đầu, không ai nói là không tốt để tạo mật khẩu ngẫu nhiên (trên thực tế từ "mật khẩu" không xuất hiện ở bất kỳ đâu trong câu hỏi, câu trả lời hoặc nhận xét). Bạn sẽ có một thời gian khó khăn chứng minh điều này bởi vì để làm điều này hệ thống sẽ phải tạo ra một số mật khẩu ngẫu nhiên cùng một lúc. Ngoài ra kẻ tấn công sẽ cần phải phù hợp với tên người dùng và mật khẩu bằng cách nào đó ngay cả khi ông quản lý để có được một số lượng tốt của mật khẩu.

1

Hãy để tôi đặt theo cách này: Chọn trình tạo số ngẫu nhiên đủ cho số lượng mật khẩu bạn muốn tạo. Với kích thước bảng chữ cái 36 (chữ số và chỉ chữ hoa hoặc chữ thường) bạn chỉ trích xuất một phần nhỏ trạng thái bên trong của RNG. Và ngay cả khi bạn tạo ra 40000 ký tự theo cách đó, đó vẫn chỉ là khoảng 21 bit thông tin. Thuật toán của bạn trong câu hỏi khác chỉ tạo ra 4 ký tự ngẫu nhiên ngoài tiền tố. Nó sẽ dễ dàng hơn cho kẻ tấn công để gây sức mạnh cho tất cả các mật khẩu có thể thay vì brute-buộc nhà nước RNG để tìm ra mật khẩu tiếp theo được tạo ra.

Thực ra, sai lầm tồi tệ nhất bạn có thể làm khi sử dụng một RNG đơn giản để tạo mật khẩu là tạo ra một số lượng lớn chúng. Nếu bạn chỉ tạo ra chúng theo yêu cầu và luôn luôn với một RNG tươi hạt giống, một kẻ tấn công sẽ có một thời gian khó khăn để tìm ra hạt giống và do đó mật khẩu. Việc thực hiện mặc định System.Random mất thời gian kể từ khi hệ thống bắt đầu bằng mili giây làm hạt giống. Chúc may mắn tìm ra điều đó.

Các vấn đề liên quan