Làm thế nào để tạo một chuỗi ngẫu nhiên?


209

Tôi muốn tạo một chuỗi ngẫu nhiên (ví dụ: mật khẩu, tên người dùng, v.v.). Có thể chỉ định độ dài cần thiết (ví dụ 13 ký tự).

Tôi có thể sử dụng công cụ gì?

(Vì lý do bảo mật và quyền riêng tư, tốt hơn là các chuỗi được tạo ngoại tuyến, trái ngược với trực tuyến trên trang web.)


1
Đã có câu trả lời tốt tại AskUbfox . (Tôi sử dụng apgcá nhân.)
Sparhawk

1
@Sparhawk Câu hỏi / câu trả lời của AskUbfox có nhiều hơn về các công cụ liệt kê. Vui lòng xem xét thêm một câu trả lời ở đây thể hiện cách sử dụng apgđể tạo một chuỗi ngẫu nhiên.
Landroni

1
Hãy thận trọng về việc sử dụng tạo số ngẫu nhiên trên máy tính. Một số ít ngẫu nhiên hơn nhiều so với chúng xuất hiện, nhưng cho biết sự khác biệt giữa việc tạo số ngẫu nhiên 'tốt' và 'xấu' là khá khó.
Sobrique

@Sobrique Điểm tuyệt vời về trình tạo số giả ngẫu nhiên (ví dụ /dev/urandom). Sẽ rất tuyệt nếu có một số câu trả lời bằng cách sử dụng các trình tạo số ngẫu nhiên thực sự , dựa trên ví dụ Random.org .
Landroni

25
Trò đùa trả lời: Để tạo một chuỗi thực sự ngẫu nhiên, đặt một người dùng mới trước Emacs (hoặc Vim) và yêu cầu họ thoát ra. ;)
tự đại diện

Câu trả lời:


186

Cách ưa thích của tôi để làm điều đó là sử dụng /dev/urandomcùng với trđể xóa các ký tự không mong muốn. Chẳng hạn, để chỉ lấy chữ số và chữ cái:

head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''

Ngoài ra, để bao gồm nhiều ký tự hơn từ danh sách các ký tự đặc biệt của mật khẩu OWASP :

</dev/urandom tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' | head -c 13  ; echo

Nếu bạn gặp một số vấn đề với việc trphàn nàn về đầu vào, hãy thử thêmLC_ALL=C như thế này:

LC_ALL=C tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo

15
Hoặc làm điều này: head /dev/urandom | tr -dc A-Za-z0-9 | head -c10- Cách này chính xác hơn. Bạn nhận được 10 ký tự là chữ hoa, chữ thấp hoặc chữ số
Brandin

8
Lệnh đầu tiên headcó thể có vấn đề. Nó sẽ xuất ra 10 dòng đầu tiên từ /dev/urandomđó, có nghĩa là nó sẽ dừng lại khi đã thấy dòng mới thứ 10. Vì vậy, độ dài của đầu ra gửi đến trlệnh là ngẫu nhiên. Có thể sẽ có ít hơn 13 ký tự trong đầu ra từ tr. Tôi đã không tính toán xác suất của điều này xảy ra, các tính toán hơi phức tạp.
kasperd

6
Tốt hơn nên làm như thế này:<dev/urandom tr -dc "$charset" | head -c "$length"
PSkocik

3
+1 Đây là một nỗ lực nhanh chóng để bao gồm các ký tự khác từ trang ký tự đặc biệt mật khẩu OWASP , đã thoát cho dòng lệnh bash:tr -dc A-Za-z0-9\!\"#$\&\'\(\)\*+,-./\:\\\\\;\<=\>\?@[]^_`{\|}~
Rup

2
@Rup Tôi không chắc những gì không hoạt động với tr ..lệnh của bạn mà chỉ trích dẫn mọi thứ (ngoại trừ trích dẫn duy nhất) hoạt động - tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~'.
Kenny Evitt

144

Để tạo mật khẩu ngẫu nhiên, bạn có thể sử dụng pwgen:

pwgen tạo mật khẩu ngẫu nhiên, vô nghĩa nhưng có thể phát âm được. Các mật khẩu này chỉ chứa các chữ cái viết thường, hoặc chữ hoa và chữ thường được trộn lẫn hoặc các chữ số được ném vào. Các chữ cái và chữ số in hoa được đặt theo cách giúp dễ nhớ vị trí của chúng khi chỉ ghi nhớ từ.

Tạo 7 mật khẩu có độ dài 13:

geek@liv-inspiron:~$ pwgen 13 7
Eu7Teadiphaec giepahl3Oyaiy iecoo9Aetaib4 phaiChae6Eivi athoo3igee8Co
Iphu4ufeDeelo aesoYi2lie9he 

Như đã đề cập trong các bình luận, bạn có thể tránh giảm entropy bằng cách sử dụng -sđối số (nghĩa là tạo mật khẩu an toàn hơn, hoàn toàn ngẫu nhiên nhưng khó nhớ):

geek@liv-inspiron:~$ pwgen -s 13 7
eAfycrPlM4cYv 4MRXmZmyIVNBp D8y71iqjG7Zq7 FQRHcserl4R8O yRCUtPtV3dsqV
0vJpp2h0OrgF1 QTp7MKtJyTrjz 

Để tạo tên người dùng ngẫu nhiên, bạn có thể sử dụng gpw:

Gói này tạo ra mật khẩu có thể phát âm được. Nó sử dụng số liệu thống kê của các kết hợp ba chữ cái (ba chữ cái) được lấy từ bất kỳ từ điển nào bạn cho nó ăn.

Tạo 7 mật khẩu (tên người dùng) có độ dài 13:

geek@liv-inspiron:~$ gpw 7 13
sreepoidahsas
risadiestinge
ntodynesssine
deodstestress
natinglumperm
riasigentspir
enderiferback

21
+1 vì không phát minh lại bánh xe. Nếu bạn không muốn giảm entropy của ràng buộc "có thể phát âm", chỉ cần sử dụng pwgen -s.
Nate Eldredge

123

Tôi đang sử dụng openssllệnh, con dao quân đội mật mã.

openssl rand -base64 12

hoặc là

openssl rand -hex 12

10
rand -hexsẽ giới hạn đầu ra chỉ 16 ký tự, thay vì 90+ trên bàn phím của tôi. base64 tốt hơn vì nó là 64 ký tự, nhưng nó không ngẫu nhiên (ví dụ: có các mẫu đệm có thể dự đoán được và có lẽ một số ký tự xuất hiện thường xuyên hơn các ký tự khác).
Martin Tournoij

@Carpetsmoker: Lưu ý rằng ví dụ này openssl rand -base64 12tạo ra 16 ký tự đầu ra (vì 256 giá trị được ánh xạ thành 64). Và ví dụ hex tạo ra 24 ký tự. Không có tổn thất nào trong trường hợp hex vì nó là ánh xạ 1: 2 đơn giản, nhưng có thể có một chút trong trường hợp base64 kể từ khi sử dụng phần đệm. Cơ số không ảnh hưởng đến tính ngẫu nhiên, đó là cách người ta ánh xạ tới người khác. (và tổng số bit quan trọng hơn nhiều).
Dennis Williamson

Câu hỏi là "Cách tạo một chuỗi ngẫu nhiên có độ dài cụ thể" @DennisWilliamson, vì vậy trong khi nhận xét của bạn là đúng như vậy , thì nó không đúng trong bối cảnh của câu hỏi này .
Martin Tournoij

@Carpetsmoker: Trong trường hợp đó, đây không phải là câu trả lời.
Dennis Williamson

4
Câu trả lời này xứng đáng được nâng cao hơn. urandom, pwgen, gpw, v.v có thể có hoặc không có sẵn trên hệ thống của bạn; cũng trong các môi trường khác nhau, một chính sách hoạt động trên một chính sách này có thể không hoạt động trên một chính sách khác. Nó sẽ là một thiết lập rối loạn chức năng để không có openssl. Thậm chí tốt hơn: openssl rand -base64 32 | tr -d / = + | cut -c -16 Điều đó sẽ cung cấp cho bạn 32 char trừ đi không phải chữ và số được cắt thành 16 char. Làm cho nó dễ dàng để đối phó như là một quản trị viên. Người dùng chỉ có chữ và số (mà họ có xu hướng đánh giá cao). Độ dài đủ dài để việc loại bỏ các ký tự đặc biệt không ảnh hưởng quá nhiều đến entropy. Vàng.
zentechinc

18

Đây là cách tôi làm. Nó tạo ra chuỗi 10 ký tự ngẫu nhiên. Bạn có thể tối ưu hóa nó bằng cách thay thế "nếp gấp", bằng các công cụ xử lý chuỗi khác.

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1

1
+1 Câu trả lời này hoàn toàn chính xác, trừ đi việc sử dụng /dev/urandomtất nhiên
Harold Fischer

12

Để tạo mật khẩu với entropy cao nhất có thể với các công cụ Linux tiêu chuẩn được tích hợp trong mọi bản phân phối tôi sử dụng:

< /dev/urandom tr -cd "[:print:]" | head -c 32; echo

Điều này xuất ra tất cả các ký tự có thể in ASCII - từ 32 (dấu cách) đến 126 (dấu ngã, ~). Độ dài mật khẩu có thể được kiểm soát với head's -ccờ. Ngoài ra còn có các bộ ký tự có thể khác trong tr(không bao gồm khoảng trắng, chỉ sử dụng các ký tự 33-126, sử dụng [:graph:]).


1
Điều này khác với những câu trả lời hiện có như thế nào? Cụ thể, herbert's đến với tâm trí.
Fox

3
@Fox Giải pháp của anh ấy sử dụng danh sách các ký tự được mã hóa cứng, đây không phải là một thực hành lập trình được khuyến khích vì khả năng đọc mã, gọn nhẹ và sạch sẽ. Ngoài ra, một số ký tự ASCII có thể in đặc biệt có thể được giải thích bằng bash, chưa kể đến nhược điểm rõ ràng nhất của một lớp lót - nếu muốn có entropy tối đa, có thể chắc chắn rằng tất cả các ký tự có sẵn đều được đưa vào danh sách không? Và rằng không có bản sao nào có thể thay đổi hành vi của tr? Câu trả lời của anh ấy nên được thay thế bởi tôi kể từ khi bạn hỏi :)
drws

2
Nhiều người nếu không phải hầu hết các trang web đều có các hạn chế đối với các ký tự có thể có mật khẩu, thì việc mã hóa cứng '[: print:]' đối với tôi không tốt hơn so với mã hóa danh sách ký tự đặc biệt của mật khẩu OWASP. Tôi cảm thấy rằng hầu hết mọi câu trả lời ở đây đều có thể được cải thiện bằng cách sử dụng một biến, nhưng đó là một thay đổi nhỏ đến mức tôi chỉ đề xuất một chỉnh sửa
Fox

1
< /dev/urandom tr -cd '[:graph:]'| tr -d '\\' | head -c 32; echonếu bạn không muốn ` characters in generated string. `bởi vì một ký tự thoát trong nhiều ngôn ngữ gây ra vấn đề
mzzzzb

< /dev/urandom tr -cd "[:print:]" | tr -d ' \\/\`\|' | head -c 32; echođể loại trừ | \ / `và không gian
Ryan Krage

9

Tùy thuộc vào mức độ ngẫu nhiên mà bạn muốn, bạn có thể chỉ cần đi với biến dựng sẵn của bash (cũng zshkshcó thể là những người khác) $RANDOM:

$ echo $RANDOM | tr '[0-9]' '[a-z]'
bfeci
$ echo $RANDOM | tr '[0-9]' '[a-z]'
cijjj

Các phương pháp đọc trực tiếp từ /dev/urandomđơn giản hơn nhiều, nhưng để hoàn thành, bạn cũng có thể sử dụng $RANDOM:

echo $(for((i=1;i<=13;i++)); do printf '%s' "${RANDOM:0:1}"; done) | tr '[0-9]' '[a-z]'

Quan trọng : giải pháp này sẽ chỉ tạo ra các chuỗi ngẫu nhiên bằng cách sử dụng 10 chữ cái đầu tiên của bảng chữ cái. Điều đó có đủ cho bạn hay không phụ thuộc vào những gì bạn cần điều này.


Làm thế nào để bạn kiểm soát độ dài của chuỗi được tạo ra?
Landroni

@landroni Tôi không nghĩ bạn có thể thiếu sử dụng vòng lặp cho đến khi bạn có được độ dài phù hợp. $RANDOMsẽ in một số trong khoảng từ 0 đến 32767.
terdon

Tôi đã thử chạy lệnh khoảng 20 lần và tôi không bao giờ có thể nhận được bất cứ thứ gì dài hơn 4-5 ký tự ...
Landroni

2
@landroni cảm ơn, tôi đã thêm một cách để chỉ định độ dài nhưng nó không tốt lắm. Tôi chỉ sử dụng một cái gì đó như rand=$(head -c 100 /dev/urandom | tr -dc A-Za-z0-9 | head -c13)thay thế.
terdon

1
@SkippyleGrandGourou điểm rất tốt. Tôi đã thêm điều này vào câu trả lời, cảm ơn.
terdon

8

Lấy cảm hứng từ Pablo Repetto tôi đã kết thúc với giải pháp dễ nhớ này :

shuf -zer -n20  {A..Z} {a..z} {0..9}

-z tránh đầu ra đa dòng

-e lặp lại kết quả

-r cho phép bất kỳ nhân vật nào xuất hiện nhiều lần

-n20 chuỗi ngẫu nhiên có độ dài 20 ký tự

{A..Z} {a..z} {0..9} các lớp char được phép

shuf là một phần của coreutils linux và có sẵn rộng rãi hoặc ít nhất là đã được chuyển.


5

@Brandin đã giải thích trong một bình luận cho một câu trả lời khác làm thế nào để có được tối đa 100 byte từ /dev/urandomviệc sử dụng head -c 100. Một cách khác để làm điều này là với dd:

tr -dc A-Za-z0-9 < /dev/urandom | dd bs=100 count=1 2>/dev/null

Phần 2>/dev/nullcuối của ddlệnh là để chặn đầu ra "... records in / ... records out".

Tôi không nhận thấy bất kỳ lợi thế / bất lợi đáng kể nào giữa hai phương pháp này.

Tôi đã có một vấn đề với cả hai phương pháp trphàn nàn về đầu vào. Tôi nghĩ rằng điều này là do nó không thích nhận đầu vào nhị phân, và do đó đề xuất lọc đầu tiên /dev/randomvới iconv -c -t US. Tuy nhiên, Gilles đã đề xuất một chẩn đoán và giải pháp khác, phù hợp với tôi:

LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | dd bs=100 count=1 2>/dev/null

Vì một số lý do, iconvgiải pháp tối đa hóa một lõi CPU và không mang lại đầu ra (tôi đã đợi khoảng 10 giây trước khi giết nó) ...
Landroni

Trên Ubuntu 14.04 hệ thống iconv của tôi được cung cấp bởi libc-bin2.19. Tôi không chắc đó có phải là cùng một biểu tượng không ...
Landroni

trhỗ trợ đầu vào nhị phân. Tuy nhiên, một phạm vi như A-Zcó thể bị ảnh hưởng bởi cài đặt ngôn ngữ. Hãy thửLC_ALL=C tr …
Gilles

1
@Gilles Theo thông số POSIX, nó không "hỗ trợ đầu vào nhị phân". Chỉ GNU mới trlàm được vì nó hoàn toàn không hỗ trợ multibyte (ví dụ: lần trước tôi đã kiểm tra trường hợp thay đổi này được thực hiện bằng cách đơn giản là thiết lập bit thứ sáu của mỗi byte). Các hệ thống khác (ví dụ BSD) không hỗ trợ đa chuỗi và điều này sẽ thất bại ở đó vì khả năng một luồng đầu vào ngẫu nhiên cũng là một luồng đa dòng hợp lệ là rất nhỏ trong hầu hết các mã hóa. GNU có thể thêm hỗ trợ đa bào tại bất kỳ thời điểm nào, tại thời điểm này điều này sẽ thất bại. Tất nhiên, thiết lập LC_ALL=Csẽ khắc phục điều đó.
Martin Tournoij

@Carpetsmoker POSIX không yêu cầu trxử lý đầu vào nhị phân (theo ngôn ngữ C). (Vâng, ok, nó chỉ nói một cách rõ ràng rằng byte null đang được hỗ trợ, nó không nói rằng các tập tin không trống không kết thúc bằng một ký tự xuống dòng đang được hỗ trợ, nhưng trong thực tế đó là luôn luôn như vậy là tốt.)
Gilles

4

APG được bao gồm theo mặc định trên một số bản phân phối Linux.

Để tạo mật khẩu từ kích thước 5 đến 10 trong các tập hợp con Đặc biệt, Số, Vốn và Thấp hơn, lệnh là:

apg -MSNCL -m 5 -x 10

Và trả lại

@OpVeyhym9
3:Glul
3DroomIc?
hed&Os0
NefIj%Ob3
35Quok}

Như đã nói bởi @landroni trong bình luận.


1
Dưới đây là các tùy chọn để tạo mật khẩu 14 chữ cái ngẫu nhiên có chứa nhiều ký tự đặc biệt:apg -a1 -m14
neuhaus

3

Bạn có thể sử dụng một trong những md5công cụ có chính xác mục đích này. Trong trường hợp tạo mật khẩu hoàn toàn ngẫu nhiên, bạn có thể sử dụng md5pass. Đây là một công cụ rất đơn giản để sử dụng và rất hữu ích, vì bạn có thể sử dụng "văn bản bình thường" cùng với "muối" để xây dựng cùng một mật khẩu mà bạn có thể khôi phục sau đó, hoặc thay vào đó bạn có thể muốn lấy lại hoàn toàn mật khẩu ngẫu nhiên mọi lúc. Cách sử dụng chung là:

md5pass [password] [salt]

trong đó passwordmột từ được chọn sẽ được sử dụng để xây dựng chuỗi ngẫu nhiên và saltlà bước nhảy theo byte được sử dụng. Như thế này:

md5pass word

$1$.MUittVW$j.XDTF1QRnxqFdXRUiSLs0

Điều này sẽ tạo ra một mật khẩu "một chuỗi ngẫu nhiên" để bạn sử dụng. Nếu bạn sử dụng không salt, thì bạn không thể tạo lại chuỗi này sau đó.

Tuy nhiên nếu bạn sử dụng saltnhư thế này:

md5pass word 512

$1$512$.0jcLPQ83jgszaPT8xzds0

sau đó bạn có thể tạo một chuỗi mà bạn có thể phục hồi nếu bạn sử dụng từ kết hợp với cùng một muối (hoặc nhảy) nếu nó được xác định ban đầu.


Khi a saltđang được sử dụng, âm thanh này tương tự như cách tiếp cận của PasswordMaker ...
Landroni

-Có âm thanh có thể giống với mật khẩu của một nhà sản xuất, nhưng điểm khác biệt là nó không phải là chương trình thương mại hay bất cứ thứ gì, bởi vì bộ công cụ md5, "md5pass, md5sum, md5sum.textutils" được xử lý ở đây có liên quan và có sẵn hệ thống miễn phí một số !!!
Trò đùa OK OK

Tôi thực sự đã nghĩ đến PasswordMaker , cũng là nguồn mở và phi thương mại.
Landroni


2

Hai lệnh này tạo mật khẩu ngẫu nhiên và cụm mật khẩu tương ứng.

shuf --random-source=/dev/urandom --repeat --head-count=20 file_with_characters | tr --delete '\n'

shuf --random-source=/dev/urandom --repeat --head-count=7 file_with_words | tr '\n' ' '

Trình tạo mật khẩu yêu cầu một file_with_char character chứa tất cả các ký tự bạn muốn sử dụng mật khẩu, một ký tự trên mỗi dòng và chính xác mỗi lần một ký tự. Tệp không được chứa các dòng trống và các dòng phải được kết thúc bằng dòng mới.

Trình tạo cụm mật khẩu yêu cầu một file_with_words chứa tất cả các từ bạn muốn sử dụng cụm mật khẩu, một từ trên mỗi dòng và chính xác mỗi lần một từ. Tệp không được chứa các dòng trống và các dòng phải được kết thúc bằng dòng mới.

Tùy chọn --head-Count chỉ định độ dài của mật khẩu - tính bằng ký tự - hoặc cụm mật khẩu - bằng từ.


1

Tôi đã thấy rằng đường ống / dev / urandom đến tr trên macOS không hoạt động. Đây là một cách khác:

set="abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
n=6
rand=""
for i in `seq 1 $n`; do
    char=${set:$RANDOM % ${#set}:1}
    rand+=$char
done
echo $rand

Kiểm tra ví dụ cuối cùng của câu trả lời của tôi. Nó không sử dụng tr. unix.stackexchange.com/a/494931/203075
Zibri

1

Tôi sử dụng:

base64 < /dev/urandom | tr -d 'O0Il1+\' | head -c 44

Điều này cho tôi 57 nhân vật có thể. Chuỗi có thể được sao chép-dán (loại bỏ +\) hoặc in và gõ lại vì các ký tự khó phân biệt ( I1lO0) đã bị xóa.

  • 44 ký tự cho tôi: log 2 (57 44 )> 256,64 bit của entropy
  • 22 ký tự cho tôi: log 2 (57 22 )> 128,32 bit của entropy

Tôi thích điều này bởi vì:

  • lệnh đơn giản để gõ và dễ nhớ
  • nó sử dụng các công cụ hệ thống tiêu chuẩn - không có nhị phân bổ sung
  • không "lãng phí" nhiều tính ngẫu nhiên (sử dụng 89% số bit ngẫu nhiên mà nó nhận được so với ~ 24% cho các giải pháp chuyển trực tiếp đến tr)
  • 22 và 44 ký tự ghép đôi khá độc đáo (ngay cả trên mức trung bình) sức mạnh chung của hai điểm dừng
  • đầu ra có thể dễ dàng được lựa chọn và dán hoặc in và thử lại với tỷ lệ lỗi tối thiểu của con người
  • ngắn hơn các giải pháp được mã hóa hex (32 và 64 thay vì 22 và 44) như md5sum / sha1sum, v.v.

Tín dụng vào https://unix.stackexchange.com/a/230676/9583 và đặc biệt là các ý kiến ​​cho cảm hứng ban đầu của tôi.


Nếu bạn cần số / ký tự đặc biệt - thông thường sẽ có một số, nếu không, bạn có thể nối thêm một cách an toàn 1mà không giảm entropy (trong khi tạo một số mới để lấy một w / một số sẽ giảm entropy). Bạn cũng có thể nối một cách an toàn !mà không làm giảm entropy. Cả hai lược đồ đều không làm tăng giá trị entropy, nhưng có thể làm cho chuỗi được tạo tuân thủ các yêu cầu mật khẩu cũ hơn.
Iiridayn

1

Triết lý Unix về "nhiều công cụ nhỏ làm tốt một việc" phục vụ bạn rất tốt trong trường hợp này.

  • /dev/urandomlà một luồng "byte" ngẫu nhiên (bao gồm các ký tự không in được)
  • base64 mã hóa dữ liệu byte thành [A-Za-z0-9/+] (hoàn toàn có thể in được)
  • dd sao chép đầu vào vào đầu ra áp dụng các sửa đổi được đưa ra dưới dạng đối số (có thể bao gồm kích thước khối và số khối)

OSX

base64     < /dev/urandom | dd bs=1k count=1

Linux

base64 -w0 < /dev/urandom | dd bs=1k count=1

Ghi chú:

  • Nếu bạn cần một tập hợp con của các ký tự, bạn có thể chèn một bộ sửa đổi trong đường ống.
    • Ví dụ: tr -d '[A-Z/+]'để thoát khỏi chữ in hoa +/
  • Bạn có thể đặt bs(kích thước khối) thành bất kỳ độ dài nào bạn cần.
  • Trên Linux, base64mặc định kết thúc tới 76 cột và phải được đặt lại -w0trừ khi bạn muốn điều đó.

1

Tôi muốn đóng góp lệnh thông thường của tôi để tạo mật khẩu

$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' |cut -c -13
b0R55751vWW9V

Để định cấu hình độ dài của mật khẩu, hãy thay đổi số trong lệnh cắt thành độ dài mà bạn yêu cầu, ví dụ: 24 ký tự

$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' |cut -c -24
WFBhVHuKbrnRhd5kdWXPzmZG

Không muốn nhầm lẫn 0 hoặc O, 1 hoặc l? Lọc nó ra với cái kháctr

$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' | tr -d '0O1l'|cut -c -24
JuCphwvhrhppD9wVqfpP2beG

Cá nhân tôi không bao giờ thích ký tự đặc biệt trong mật khẩu, đó là lý do tại sao tôi chỉ chọn [:alnum:]cho trình tạo mật khẩu của mình


0

Tôi duy trì secpwgentrong Alpine Linux và giữ các nguồn trên Github của tôi .

Nó có thể tạo ra các chuỗi ngẫu nhiên hoặc cụm từ xúc xắc:

musl64 [~]$ secpwgen
USAGE: secpwgen <-p[e] | -A[adhsy] | -r | -s[e]> N

PASSPHRASE of N words from Diceware dictionary
  -p    generate passphrase
  -pe   generate enhanced (with symbols) passphrase

SKEY PASSWORD of N words from S/Key dictionary
  -s    generate passphrase
  -se   generate enhanced (with symbols) passphrase

ASCII RANDOM of N elements (at least one option MUST be present)
  -A    Each letter adds the following random elements in output:
    a    alphanumeric characters
    d    decimal digits
    h    hexadecimal digits
    s    special characters
    y    3-4 letter syllables

RAW RANDOM
  -r    output BASE64 encoded string of N random BITS
  -k    output koremutake encoding of N random BITS

Để tạo chuỗi ngẫu nhiên gồm 13 ký tự, bạn sẽ sử dụng:

musl64 [~]$ secpwgen -Aas 13
----------------
WK5#*V<]M3<CU ;ENTROPY=67.21 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.

musl64 [~]$ secpwgen -Aa 13
----------------
GP0FIEBM9Y3BT ;ENTROPY=67.21 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.

Để người dùng nhớ mật khẩu, hãy sử dụng cụm từ xúc xắc:

musl64 [~]$ secpwgen -p 5
----------------
wq seen list n8 kerr  ;ENTROPY=65.00 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.

Cá nhân tôi thích:

musl64 [~]$ secpwgen -r 512
----------------
h62lL7G4gwh3/j9c7YteQvVXoqJrQKKPWVR3Lt7az36DcfWZWtUgBT19iwmJBwP4UahNzPe7qYD7OcklUFpCzQ== ;ENTROPY=512.00 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.

0

Cách của tôi cho một mật khẩu rất an toàn (trong đó 16 là độ dài pw):

cat /dev/urandom | tr -cd [:graph:]|head -c 16

Kết quả ví dụ:

jT@s_Nx]gH<wL~W}

Hoặc cách khác, để tạo nhiều mật khẩu:

mèo / dev / urandom | tr -cd [: đồ thị:] | gấp -w 16 | đầu -6

Kết quả ví dụ:

7ck%G7'|f&}_8(]s
<?*]E.CG[NB'gK#A
:tF-WPTOa3!i7S(h
2xy(>=%3=Kb1B$`6
*98Lf{d?Jzb}6q1\
E7uCEAN2Hz]]y|5*

Ít an toàn hơn (bộ ký tự nhỏ hơn):

cat /dev/urandom |base64 -w 0|fold -w 16|head -6

Kết quả ví dụ:

rJqYxYZLOTV+A45w
PUKQ+BoBf6yfZw5m
+LRfpsN9CsLRiN8V
yMS6zDpL6NHmG17s
yTUWPG7Rum97schi
cognvjVwaKaAyPRK

-1

Một cách siêu dễ dàng và đơn giản (có thể đơn giản hơn bạn đang tìm kiếm) để đạt được điều này sẽ là tạo một số ngẫu nhiên trong một phạm vi nhất định, chuyển đổi số đó thành ký tự ASCII tương đương của nó và nối nó vào cuối chuỗi .

Đây là một ví dụ cơ bản trong Python:

import random # import random library  
passFile = open("passwords.txt", 'w') # create file passwords.txt
passNum = int(input("Number of passwords: ")) # get number of  passwords
passLength = int(input("Password length: ")) # get length of passwords  
for i in range(passNum):
    password = "" # reset password
    for i in range(passLength):
        num = random.randint(65, 122) # get random number
        while num in range(91, 97): # Don't include punctuation
            num = random.randint(65, 122)
        password += chr(num) # add character to current password 
    passFile.write(password + "\n") # add current password to file  
passFile.close() # close file

EDIT: đã thêm nhận xét và thêm mã để tạo nhiều mật khẩu và ghi chúng vào một tệp


3
Nếu được ban cho sức mạnh của Python, tôi sẽ KHÔNG làm điều đó theo cách này. Sẽ dễ dàng hơn nhiều khi sử dụng phép nối trên chuỗi chứa tất cả các ký tự hợp lệ cho mật khẩu và sử dụng ngẫu nhiên để chọn ra các ký tự.
Mike McMahon

tốt hơn để sử dụng Python như mã này.activestate.com/recipes/578468
password

-2

Tôi muốn lệnh này:

date +%s | sha256sum | base64 | head -c 12

1
Tôi thà sử dụng phương pháp tiếp cận nano giây ngẫu nhiên hơn: date +%N Vì nếu bạn tạo nhiều người dùng và mật khẩu trong một tập lệnh, thì giây có thể trở nên giống nhau đối với nhiều hoặc thậm chí cho tất cả các lệnh ngày, do đó tạo ra mật khẩu giống hệt nhau.
Thị trưởng John

1
@JohnMayor: cách tiếp cận này mạnh mẽ hơn : dd if=/dev/random bs=512 count=1?
Eugen Konkov

8
Câu trả lời này rất nguy hiểm! Bạn tạo (các) mật khẩu từ một hạt giống đã biết, rất dễ dự đoán. Tôi có thể tạo tất cả mật khẩu được tạo bằng phương pháp này của những năm trước và sử dụng danh sách này cho mục đích cưỡng bức vũ phu.
Lưu lượng

-4

Tôi đi, đến http://passwordsgenerator.net/, nó cho phép tạo các chuỗi ký tự ngẫu nhiên lên đến 2048 ký tự, chọn chữ hoa, chữ thường, chữ số 0 đến 9, dấu chấm câu hoặc bất kỳ kết hợp nào.


2
Tôi đã làm rõ câu hỏi để làm rõ rằng các chuỗi được tạo ngoại tuyến là thích hợp hơn. Tạo mật khẩu trực tiếp trên một trang web, đặc biệt nếu kết nối không phải là HTTPS (như trong câu trả lời của bạn), không an toàn.
Landroni

1
Nhận một mật khẩu ngẫu nhiên từ internet là ngu ngốc & ngây thơ. Hiện tại ai đó biết mật khẩu bạn đang sử dụng cho một số dịch vụ hoặc trang web và thông tin cá nhân duy nhất về bạn (địa chỉ IP, thông tin trình duyệt / môi trường). Trang web này hiện có thể tham chiếu chéo thông tin với các dữ liệu khác được thu thập về bạn. Ví dụ: bạn đã từng đăng lên danh sách gửi thư, địa chỉ IP của bạn nằm trong tiêu đề của thư, vì vậy chúng tôi hiện có mật khẩu, tên và địa chỉ email ... Bạn thực sự tin tưởng người lạ ngẫu nhiên với mật khẩu của mình ở đây.
Martin Tournoij
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.