2011-03-19 39 views
5

tôi đang làm việc trên một máy phát điện mật khẩu ngẫu nhiên tạo mật khẩu có thể đáp ứng một số điều kiện bao gồm, nhưng không nhất thiết phải giới hạn:tạo mật khẩu ngẫu nhiên với điều kiện

  • tối thiểu chiều dài: phải chứa ít nhất 8 ký tự
  • chữ thường: phải chứa chữ cái thường (được chọn từ tập hợp để tránh các vấn đề có ký tự có thể bị nhầm là số)
  • chữ hoa chữ: có chứa trên thư trường hợp (một lần nữa, được lựa chọn từ một tập)
  • chữ số: phải chứa số

Điều gì sẽ là cách tiếp cận thuật toán tốt nhất để đảm bảo rằng các mật khẩu được tạo ra đáp ứng tất cả những điều này?

Tôi không tìm kiếm giải pháp hoàn chỉnh, tôi chỉ cần một vài ý tưởng và nguyên tắc tốt.

+0

http://www.texamples.com/how-to-generate-random-passwords-in-java/ điều này có thể giúp – brainless

+0

không chắc chắn rằng đây là một ý tưởng hay. Áp dụng các hạn chế, như chữ số "2+", có khả năng làm cho mật khẩu ít "ngẫu nhiên" hơn là ngẫu nhiên/tốt hơn. – EML

Trả lời

6

1) tạo ngẫu nhiên số L sẽ là độ dài chính xác của mật khẩu của bạn. Cụ thể, tạo ra là để nó lớn hơn 8
2) ngẫu nhiên tạo ra một số LL sẽ là số chữ thường. LC phải nằm trong phạm vi [1..L-2]
3) tạo ngẫu nhiên số LU cho chữ hoa. Phải nằm trong phạm vi [1..L-LL-1]
4) LD = L-LL-LU số chữ hoa
5) tạo ngẫu nhiên LL chữ thường, chữ hoa hoa và chữ số LD và giữ chúng trong một danh sách (mảng)
6) Xáo mảng ngẫu nhiên

hth

+1

+1 Tôi sẽ thêm rằng một sự xáo trộn tốt không phải là tầm thường :-) Đây là một liên kết đến một thuật toán tốt với mã giả http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle – xanatos

+0

@xantos : Hoặc, nếu sử dụng C++, chúng ta có thể sử dụng phương thức 'std :: random_shuffle()' :) –

+0

Tôi thích nó. Nhưng tại sao không chỉ sửa L ở mức 8 ?. Đó là độ dài * dễ nhất * để nhớ trong khi vẫn đáp ứng các yêu cầu. – dana

2
  • tạo một mảng ký tự chứa a - z, A - Z, 0-9 (trừ bất kỳ ký tự đó có thể là mỗi khó hiểu câu hỏi)
  • nối 8 ký tự được chọn ngẫu nhiên từ mảng
  • kết quả xét nghiệm để xem nếu nó đáp ứng các yêu cầu
  • nếu các yêu cầu không hài lòng, bắt đầu lại

Thuật toán thường nên thành công trên vài lần lặp đầu tiên, và giúp bạn tiết kiệm từ việc phải thực hiện một shuffle algorithm.

+2

Tuyệt đối! Nó cũng không có thành kiến ​​ẩn. Cần lưu ý rằng điều này kết thúc rất nhanh chóng với xác suất cao (số lần cố gắng dự kiến ​​trước khi tìm một giải pháp có thể chấp nhận là 1.4). Ngớ ngẩn mà tôi đã không nhận thấy giải pháp của bạn khi viết của tôi (cùng một giải pháp, nhưng tôi giả định các chức năng ngẫu nhiên sản xuất byte ngẫu nhiên 0x00-0xFF và không bận tâm để sửa chữa phạm vi). –

1

Có một giải pháp thay thế cho cấu trúc chính xác do Armen đề xuất. Nếu bạn là điều kiện có thể được đáp ứng với xác suất cao thì:

  • nhận được một chiều dài vô hạn chuỗi ngẫu nhiên (một dòng)
  • uể oải lọc cho các nhân vật có thể chấp nhận (ví dụ: chữ hoa chữ thường || || chữ số)
  • bước một cửa sổ có độ dài mong muốn trên luồng, chấp nhận khi thuộc tính cửa sổ OK.

Trong ngôn ngữ lười, đây là khoảng 6 dòng mã không phải là bản mẫu và không yêu cầu bất kỳ sự xáo trộn nào.

CHỈNH SỬA: Có, bước một cửa sổ như trong các nhận xét, không trượt một cửa sổ. Cảm ơn!

+1

Trượt cửa sổ hoặc bước một cửa sổ? Nếu bạn trượt, bạn sẽ thiên vị phân phối mật khẩu để ưu tiên các lớp nhân vật ít thường xuyên hơn ở cuối. Giả sử bạn muốn có mật khẩu 2 ký tự. Chữ số ít thường xuyên hơn so với chữ cái, do đó, một dòng điển hình trông giống như 'abcd5efg ...'. Khi bạn trượt cửa sổ, bạn từ chối 'ab',' bc', 'cd' và chấp nhận' d5'. Chữ số có nhiều khả năng xuất hiện ở vị trí thứ hai bởi vì ngay sau khi nó trượt vào vị trí đó, mật khẩu sẽ trở thành chấp nhận được. – aaz

+0

Phải, bạn không nên trượt một cửa sổ, nhưng kiểm tra các đoạn rời rạc của độ dài mong muốn: 'loop input = let (s, r) = splitAt len ​​nhập vào nếu strProp s sau đó s vòng lặp khác r'. Mặt sau của tính toán phong bì cho biết bạn nên thử nghiệm 1.4 mật khẩu có thể để có được một mật khẩu hợp lệ (cho 8 ký tự, do đó, tạo ra một mật khẩu tiêu thụ trung bình 47 byte ngẫu nhiên). –

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