จะสร้างสตริงแบบสุ่มได้อย่างไร


209

ฉันต้องการสร้างสตริงแบบสุ่ม (เช่นรหัสผ่านชื่อผู้ใช้ ฯลฯ ) มันเป็นไปได้ที่จะระบุความยาวที่ต้องการ (เช่น 13 ตัวอักษร)

ฉันสามารถใช้เครื่องมืออะไรได้บ้าง

(เพื่อเหตุผลด้านความปลอดภัยและความเป็นส่วนตัวขอแนะนำให้สร้างสตริงแบบออฟไลน์ซึ่งตรงข้ามกับออนไลน์บนเว็บไซต์)


1
แล้วมีคำตอบที่ดีอยู่ที่AskUbuntu (ฉันใช้apgเป็นการส่วนตัว)
Sparhawk

1
@Sparhawk คำถาม / คำตอบ AskUbuntu มีข้อมูลเพิ่มเติมเกี่ยวกับรายการเครื่องมือ โปรดลองเพิ่มคำตอบที่นี่เพื่อแสดงวิธีใช้apgในการสร้างสตริงแบบสุ่ม
landroni

1
ระมัดระวังเกี่ยวกับการใช้การสร้างหมายเลขสุ่มบนคอมพิวเตอร์ บางคนสุ่มน้อยกว่าที่ปรากฏ แต่การบอกความแตกต่างระหว่างการสร้างตัวเลขสุ่มที่ 'ดี' และ 'ไม่ดี' นั้นค่อนข้างยาก
Sobrique

@Sobrique จุดที่ยอดเยี่ยมเกี่ยวกับเครื่องกำเนิดเลขสุ่ม (เช่น/dev/urandom) จะดีจะมีคำตอบบางอย่างใช้จริงเครื่องกำเนิดไฟฟ้าจำนวนสุ่มบนพื้นฐานเช่นrandom.org
landroni

25
คำตอบตลก: ในการสร้างสตริงสุ่มอย่างแท้จริงให้วางผู้ใช้ใหม่ไว้หน้า Emacs (หรือ Vim) และขอให้พวกเขาออก ;)
Wildcard

คำตอบ:


186

วิธีที่ฉันชอบทำคือใช้/dev/urandomร่วมกับtrเพื่อลบอักขระที่ไม่ต้องการ ตัวอย่างเช่นเพื่อให้ได้เฉพาะตัวเลขและตัวอักษร:

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

อีกวิธีหนึ่งในการรวมอักขระเพิ่มเติมจากรายการอักขระพิเศษของรหัสผ่าน OWASP :

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

หากคุณมีปัญหาเกี่ยวกับการtrร้องเรียนเกี่ยวกับอินพุตลองเพิ่มLC_ALL=Cดังนี้:

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

15
หรือทำสิ่งนี้: head /dev/urandom | tr -dc A-Za-z0-9 | head -c10- วิธีนี้แม่นยำยิ่งขึ้น คุณจะได้รับ 10 อักขระที่เป็นตัวพิมพ์ใหญ่ตัวพิมพ์เล็กหรือตัวเลข
Brandin

8
headคำสั่งแรกอาจมีปัญหา มันจะส่งออก 10 บรรทัดแรกจาก/dev/urandomซึ่งหมายความว่ามันจะหยุดเมื่อเห็นบรรทัดที่ 10 ดังนั้นความยาวของเอาต์พุตที่ส่งไปยังtrคำสั่งจึงเป็นแบบสุ่ม มันเป็นไปได้ว่าจะมีน้อยกว่า 13 trตัวในการส่งออกจาก ฉันไม่ได้คำนวณความน่าจะเป็นที่จะเกิดขึ้นการคำนวณนั้นค่อนข้างยุ่งยาก
kasperd

6
ทำสิ่งนี้ให้ดีกว่านี้:<dev/urandom tr -dc "$charset" | head -c "$length"
PSkocik

3
1 นี่เป็นความพยายามอย่างรวดเร็วรวมถึงตัวละครอื่น ๆ จากOWASP รหัสผ่านพิเศษหน้าตัวละครหนีสำหรับบรรทัดคำสั่งทุบตี:tr -dc A-Za-z0-9\!\"#$\&\'\(\)\*+,-./\:\\\\\;\<=\>\?@[]^_`{\|}~
โฟโต้

2
@Rup ผมไม่แน่ใจว่าสิ่งที่ไม่ได้ทำงานกับคุณtr ..คำสั่ง แต่เพียง quoting ทุกอย่าง (ยกเว้นคำพูดเดียว) ทำงาน tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~'-
Kenny Evitt

144

ในการสร้างรหัสผ่านแบบสุ่มคุณสามารถใช้pwgen:

pwgen สร้างรหัสผ่านแบบสุ่มไม่มีความหมาย แต่ออกเสียงได้ รหัสผ่านเหล่านี้มีทั้งตัวอักษรตัวพิมพ์เล็กหรือตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ผสมกันหรือตัวเลขที่ส่งออกไปตัวอักษรและตัวเลขตัวพิมพ์ใหญ่จะถูกวางไว้ในลักษณะที่ช่วยให้จดจำตำแหน่งได้ง่ายขึ้นเมื่อจดจำคำศัพท์เท่านั้น

สร้าง 7 รหัสผ่านที่มีความยาว 13:

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

ดังที่ได้กล่าวไว้ในความคิดเห็นคุณสามารถหลีกเลี่ยงการลดเอนโทรปีโดยใช้-sอาร์กิวเมนต์ (เช่นสร้างรหัสผ่านที่ปลอดภัยมากขึ้นแบบสุ่ม แต่จดจำยาก):

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

ในการสร้างชื่อผู้ใช้แบบสุ่มคุณสามารถใช้gpw:

แพ็คเกจนี้สร้างรหัสผ่านที่ออกเสียงได้ มันใช้สถิติของชุดค่าผสมสามตัวอักษร (trigraphs) ที่นำมาจากพจนานุกรมที่คุณป้อน

สร้าง 7 รหัสผ่าน (ชื่อผู้ใช้) ที่มีความยาว 13:

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

21
+1 สำหรับการไม่สร้างล้อใหม่ หากคุณไม่ต้องการที่ลดลงเอนโทรปีของ "ออกเสียง" จำกัด pwgen -sเพียงแค่ใช้
Nate Eldredge

123

ฉันใช้opensslคำสั่งมีดกองทัพสวิสแห่งการเข้ารหัส

openssl rand -base64 12

หรือ

openssl rand -hex 12

10
rand -hexจะ จำกัด ผลลัพธ์ให้เหลือเพียง 16 ตัวอักษรมากกว่า 90+ บนแป้นพิมพ์ของฉัน base64 ดีกว่าเพราะมันเป็น 64 ตัวอักษร แต่ก็ไม่ได้สุ่ม (เช่นมีรูปแบบการแพ็ดที่คาดเดาได้และบางทีอักขระบางตัวอาจปรากฏบ่อยกว่าตัวอื่น ๆ )
Martin Tournoij

@Carpetsmoker: โปรดทราบว่าตัวอย่างopenssl rand -base64 12สร้าง 16 อักขระของเอาต์พุต (เนื่องจาก 256 ค่าถูกแม็พกับ 64) และตัวอย่างเลขฐานสิบหกผลิต 24 ตัวอักษร ในกรณีของเลขฐานสิบหกจะไม่มีการสูญเสียเนื่องจากเป็นการทำแผนที่แบบ 1: 2 อย่างง่าย ๆ แต่อาจมีเพียงเล็กน้อยในกรณีฐาน 64 เนื่องจากใช้แพ็ดดิ้ง การแผ่รังสีไม่ส่งผลกระทบต่อการสุ่มมันเป็นวิธีหนึ่งที่แมปไปยังอีกที่ไม่ (และการนับบิตทั้งหมดมีความสำคัญมากกว่า)
Dennis Williamson

คำถามคือ "วิธีสร้างสตริงสุ่มที่มีความยาวเฉพาะ" @DennisWilliamson ดังนั้นในขณะที่ความคิดเห็นของคุณถูกต้องเช่นนี้จะไม่ถูกต้องในบริบทของคำถามนี้
Martin Tournoij

@Carpetsmoker: ในกรณีนี้ไม่มีคำตอบนี้
Dennis Williamson

4
คำตอบนี้สมควรได้รับการโหวตมากขึ้น urandom, pwgen, gpw ฯลฯ อาจมีหรือไม่มีในระบบของคุณ นอกจากนี้ในสภาพแวดล้อมที่แตกต่างกันนโยบายที่ใช้งานได้อาจไม่ทำงานในนโยบายอื่น มันจะเป็นการเซ็ตอัพที่ผิดปกติไม่ได้มี openssl ดียิ่งขึ้น: openssl rand -base64 32 | tr -d / = + | cut -c -16 นั่นจะให้ 32 ถ่านลบด้วยไม่ใช่ของ alphanum และตัดให้เหลือความยาว 16 ถ่าน ทำให้ง่ายต่อการจัดการในฐานะผู้ดูแลระบบ ผู้ใช้มีตัวอักษร (ซึ่งพวกเขามักจะชื่นชม) ความยาวนั้นยาวพอที่การลบตัวอักษรพิเศษจะไม่ส่งผลกระทบต่อเอนโทรปี โกลเด้น
zentechinc

18

นี่คือวิธีที่ฉันทำ มันสร้างสตริงสุ่ม 10 ตัวอักษร คุณสามารถปรับให้เหมาะสมด้วยการแทนที่ "fold" ด้วยเครื่องมือประมวลผลสตริงอื่น ๆ

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

1
+1 คำตอบนี้ถูกต้อง POSIX ลบด้วยการใช้งาน/dev/urandomแน่นอน
Harold Fischer

12

ในการสร้างรหัสผ่านด้วยเอนโทรปีสูงสุดที่เป็นไปได้ด้วยเครื่องมือ Linux มาตรฐานที่ติดตั้งไว้ในทุกการแจกจ่ายที่ฉันใช้:

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

ค่านี้ส่งออกอักขระ ASCII ที่พิมพ์ได้ทั้งหมด - จาก 32 (เว้นวรรค) ถึง 126 (ตัวหนอน, ~) ความยาวรหัสผ่านสามารถควบคุมได้ด้วยhead's -cธง นอกจากนี้ยังมีชุดอักขระอื่น ๆ ที่เป็นไปได้ในtr(ไม่รวมช่องว่างเพียงแค่ตัวอักษร 33-126 ใช้[:graph:])


1
สิ่งนี้แตกต่างจากคำตอบที่มีอยู่อย่างไร โดยเฉพาะเฮอร์เบิร์ตเข้ามาในใจ
สุนัขจิ้งจอก

3
@Fox โซลูชันของเขาใช้รายการอักขระแบบ hardcoded ซึ่งไม่ใช่วิธีการเขียนโปรแกรมที่ได้รับการสนับสนุนเนื่องจากการอ่านรหัสความกะทัดรัดและความสะอาด นอกจากนี้อักขระ ASCII ที่พิมพ์ได้พิเศษบางอย่างสามารถตีความได้โดย bash ไม่ต้องพูดถึงข้อเสียเปรียบที่ชัดเจนที่สุดของสายการบินเดียวของเขา - ถ้าต้องการเอนโทรปีสูงสุดต้องแน่ใจว่ามีอักขระทั้งหมดที่มีอยู่ในรายการหรือไม่ และไม่มีการซ้ำซ้อนซึ่งอาจเปลี่ยนพฤติกรรมของ tr หรือไม่? คำตอบของเขาควรถูกแทนที่ด้วยเหมืองตั้งแต่คุณถาม :)
drws

2
เว็บไซต์ส่วนใหญ่ถ้าไม่ใช่เว็บไซต์ส่วนใหญ่จะมีข้อ จำกัด เกี่ยวกับตัวอักษรที่สามารถใช้รหัสผ่านได้ดังนั้นการเข้ารหัส '[: พิมพ์:]' จึงไม่รู้สึกดีกว่าฉันกว่าการเข้ารหัสรายการอักขระพิเศษ OWASP รหัสผ่านอย่างหนัก ฉันรู้สึกว่าเกือบทุกคำตอบที่นี่สามารถปรับปรุงได้โดยใช้ตัวแปร แต่นั่นเป็นการเปลี่ยนแปลงเล็กน้อยที่ฉันแนะนำการแก้ไขเท่านั้น
Fox

1
< /dev/urandom tr -cd '[:graph:]'| tr -d '\\' | head -c 32; echoถ้าคุณไม่ต้องการ` characters in generated string. `เพราะตัวละครหลบหนีในหลายภาษาทำให้เกิดปัญหา
mzzzzb

< /dev/urandom tr -cd "[:print:]" | tr -d ' \\/\`\|' | head -c 32; echoเพื่อยกเว้น | \ / `และที่ว่าง
Ryan Krage

9

ขึ้นอยู่กับระดับของการสุ่มที่คุณต้องการคุณสามารถใช้ตัวแปรบิวด์อินของ bash (เช่นzshและkshอาจเป็นอื่น ๆ ) $RANDOM:

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

วิธีการอ่านโดยตรง/dev/urandomนั้นง่ายกว่ามาก แต่เพื่อความสมบูรณ์คุณสามารถใช้$RANDOM:

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

สำคัญ : โซลูชันนี้จะสร้างสตริงสุ่มโดยใช้ตัวอักษร 10 ตัวแรกของตัวอักษร ไม่ว่าจะเพียงพอหรือไม่นั้นขึ้นอยู่กับสิ่งที่คุณต้องการ


คุณควบคุมความยาวของสตริงที่สร้างอย่างไร
landroni

@landroni ฉันไม่คิดว่าคุณจะขาดการใช้ลูปจนกว่าคุณจะได้ความยาวที่เหมาะสม $RANDOMจะพิมพ์ตัวเลขระหว่าง 0 ถึง 32767
terdon

ฉันได้พยายามใช้คำสั่งบางครั้งที่ 20 และผมก็ไม่เคยได้รับอะไรนานกว่า 4-5 ตัวอักษร ...
landroni

2
@landroni ขอบคุณฉันได้เพิ่มวิธีการระบุความยาว แต่มันไม่ดีมาก ฉันแค่ใช้สิ่งที่ชอบrand=$(head -c 100 /dev/urandom | tr -dc A-Za-z0-9 | head -c13)แทน
terdon

1
@SkippyleGrandGourou จุดที่ดีมาก ฉันเพิ่มสิ่งนี้ในคำตอบขอบคุณ
terdon

8

ได้รับแรงบันดาลใจจาก Pablo Repetto ฉันสิ้นสุดด้วยวิธีแก้ปัญหาที่ง่ายต่อการจดจำ

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

-z หลีกเลี่ยงเอาต์พุตหลายบรรทัด

-e echo ผลลัพธ์

- อนุญาตให้ตัวละครใด ๆ ที่จะปรากฏหลายครั้ง

-n20 สตริงสุ่มที่มีความยาว 20 อักขระ

{A..Z} {a..z} {0..9} ชั้นเรียนถ่านที่ได้รับอนุญาต

shuf เป็นส่วนหนึ่งของ coreutils ลินุกซ์และใช้ได้อย่างกว้างขวางหรืออย่างน้อยได้รับการรังเพลิง


5

@Brandin อธิบายในความคิดเห็นไปยังอีกคำตอบว่าจะได้รับที่มากที่สุด 100 ไบต์จากการใช้/dev/urandom head -c 100อีกวิธีในการทำเช่นนี้คือdd:

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

2>/dev/nullในตอนท้ายของddคำสั่งในการปราบปราม "... ระเบียนใน / ... บันทึก" เอาท์พุท

ฉันไม่ทราบถึงข้อดี / ข้อเสียที่สำคัญระหว่างสองวิธีนี้

ฉันมีปัญหากับทั้งสองวิธีในการtrร้องเรียนเกี่ยวกับอินพุต ฉันคิดว่านี้เป็นเพราะมันไม่ชอบที่ได้รับการป้อนข้อมูลไบนารีและด้วยเหตุนี้ปัญหาการกรองครั้งแรกด้วย/dev/random iconv -c -t USอย่างไรก็ตาม Gilles แนะนำการวินิจฉัยและการแก้ปัญหาที่แตกต่างกันซึ่งทำงานสำหรับฉัน:

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

ด้วยเหตุผลบางอย่างiconvทางออกของซีพียูสูงสุดหนึ่งคอร์และไม่ได้ผลผลิต (ฉันรอ 10 วินาทีก่อนที่จะฆ่ามัน) ...
Landroni

ในระบบ Ubuntu 14.04 ของฉัน iconv จัดทำโดยlibc-bin2.19 ฉันไม่แน่ใจว่ามันเป็น iconv เดียวกันหรือไม่ ...
landroni

trรองรับการป้อนข้อมูลแบบไบนารี อย่างไรก็ตามช่วงเช่นA-Zนี้อาจได้รับอิทธิพลจากการตั้งค่าสถานที่ ลองLC_ALL=C tr …
Gilles

1
@Gilles ตามข้อมูลจำเพาะ POSIX มันไม่ได้ "รองรับการป้อนข้อมูลแบบไบนารี" มีเพียง GNU เท่านั้นtrเพราะไม่รองรับหลายไบต์ (เช่นครั้งสุดท้ายที่ฉันตรวจสอบว่าการเปลี่ยนกรณีถูกนำมาใช้โดยการตั้งค่าบิตที่หกของทุกไบต์) ระบบอื่น ๆ (เช่น BSD) รองรับมัลติไบต์และสิ่งนี้จะล้มเหลวเนื่องจากโอกาสที่สตรีมอินพุตแบบสุ่มจะเป็นสตรีมมัลติไบต์ที่ถูกต้องซึ่งมีขนาดเล็กมากในการเข้ารหัสส่วนใหญ่ GNU อาจเพิ่มการสนับสนุนหลายไบต์ในช่วงเวลาที่กำหนด ณ จุดนี้จะล้มเหลว แน่นอนการตั้งค่าLC_ALL=Cจะแก้ไขได้
Martin Tournoij

@Carpetsmoker POSIX ไม่จำเป็นต้องtrดำเนินการอินพุตไบนารี (ในภาษา C) (ดี ok ก็เพียงบอกอย่างชัดเจนว่าไบต์ null จะได้รับการสนับสนุนก็ไม่ได้บอกว่าไฟล์ที่ไม่ว่างเปล่าไม่ได้ลงท้ายด้วยตัวอักษรขึ้นบรรทัดใหม่จะได้รับการสนับสนุน แต่ในทางปฏิบัติที่เสมอกรณีเช่นกัน.)
Gilles

4

APG ถูกรวมโดยดีฟอลต์ในการกระจาย Linux บางตัว

ในการสร้างรหัสผ่านจากขนาด 5 ถึง 10 ในชุดย่อยพิเศษ, ตัวเลข, ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กคำสั่งคือ:

apg -MSNCL -m 5 -x 10

และผลตอบแทน

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

ตามที่กล่าวโดย @landroni ในความคิดเห็น


1
นี่คือตัวเลือกในการสร้างรหัสผ่านตัวอักษร 14 ตัวที่มีอักขระพิเศษมากมาย:apg -a1 -m14
neuhaus

3

คุณสามารถใช้หนึ่งในmd5เครื่องมือที่มีจุดประสงค์นี้อย่างแม่นยำ md5passในกรณีของการสร้างรหัสผ่านแบบสุ่มสมบูรณ์คุณสามารถใช้ มันเป็นเครื่องมือที่ใช้ง่ายและมีประโยชน์มากเนื่องจากคุณสามารถใช้ "ข้อความปกติ" พร้อมกับ "เกลือ" เพื่อสร้างโครงสร้างรหัสผ่านเดียวกับที่คุณสามารถกู้คืนได้ในภายหลังหรือมิฉะนั้นคุณอาจต้องการได้อย่างสมบูรณ์ รหัสผ่านแบบสุ่มตลอดเวลา การใช้งานทั่วไปคือ:

md5pass [password] [salt]

โดยที่passwordเป็นคำที่เลือกไว้ซึ่งจะใช้สำหรับการสร้างสตริงแบบสุ่มและsaltเป็นการกระโดดเป็นไบต์ที่จะใช้ แบบนี้:

md5pass word

$1$.MUittVW$j.XDTF1QRnxqFdXRUiSLs0

วิธีนี้จะสร้างรหัสผ่าน "ลำดับแบบสุ่ม" เพื่อให้คุณใช้ หากคุณใช้ไม่saltคุณจะไม่สามารถสร้างสตริงเดียวกันนี้ได้ในภายหลัง

อย่างไรก็ตามหากคุณใช้สิ่งsaltนี้:

md5pass word 512

$1$512$.0jcLPQ83jgszaPT8xzds0

จากนั้นคุณสามารถสร้างลำดับที่คุณสามารถกู้คืนหากคุณใช้คำร่วมกับเกลือเดียวกัน (หรือกระโดด) ถ้ามันถูกกำหนดไว้ในตอนแรก


เมื่อมีsaltการใช้งานสิ่งนี้จะคล้ายกับวิธี PasswordMaker ...
landroni

- อาจฟังดูคล้ายกับรหัสผ่านของผู้สร้างหนึ่ง แต่ความแตกต่างคือไม่ใช่โปรแกรมเชิงพาณิชย์หรืออะไรก็ตามเพราะชุดของเครื่องมือ md5, "md5pass, md5sum, md5sum.textutils" ที่เกี่ยวข้องและมีระบบ ไม่มีค่าใช้จ่ายบาง !!!
โจ๊กซีเนียร์ตกลง

จริง ๆ แล้วฉันนึกถึงPasswordMakerซึ่งเป็นโอเพ่นซอร์สและไม่ใช่เชิงพาณิชย์
landroni


2

สองคำสั่งเหล่านี้สร้างรหัสผ่านแบบสุ่มและวลีรหัสผ่านตามลำดับ

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' ' '

ตัวสร้างรหัสผ่านต้องการ file_with_characters ที่มีอักขระทั้งหมดที่คุณต้องการให้รหัสผ่านใช้อักขระหนึ่งตัวต่อบรรทัดและแต่ละครั้ง ไฟล์ต้องไม่มีบรรทัดว่างและบรรทัดต้องถูกยกเลิกการขึ้นบรรทัดใหม่

เครื่องมือสร้างวลีรหัสผ่านต้องการ file_with_words ที่มีคำทั้งหมดที่คุณต้องการให้วลีรหัสผ่านใช้หนึ่งคำต่อบรรทัดและแต่ละครั้ง ไฟล์ต้องไม่มีบรรทัดว่างและบรรทัดต้องถูกยกเลิกการขึ้นบรรทัดใหม่

ตัวเลือก - head-count ระบุความยาวของรหัสผ่าน - เป็นตัวอักษร - หรือวลีรหัสผ่าน - เป็นคำ


1

ฉันพบว่าการวางท่อ / dev / urandom ไปยัง tr บน macOS ไม่ทำงาน นี่คือวิธีอื่น:

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

ตรวจสอบตัวอย่างสุดท้ายของคำตอบของฉัน มันไม่ได้ใช้ TR unix.stackexchange.com/a/494931/203075
Zibri

1

ฉันใช้:

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

สิ่งนี้ทำให้ฉันมี 57 ตัวละครที่เป็นไปได้ สตริงสามารถคัดลอกวาง (ลบ+แล้ว\) หรือพิมพ์และพิมพ์ซ้ำเนื่องจากเป็นการยากที่จะแยกแยะอักขระ ( I1lO0)

  • 44 ตัวอักษรให้ฉัน: log 2 (57 44 )> 256.64 บิตของเอนโทรปี
  • ตัวละคร 22 ตัวให้ฉัน: log 2 (57 22 )> เอนโทรปีของบิต 128.32

ฉันชอบสิ่งนี้เพราะ:

  • คำสั่งนั้นพิมพ์ได้ง่ายและน่าจดจำ
  • มันใช้เครื่องมือระบบมาตรฐาน - ไม่มีไบนารีเพิ่มเติม
  • ไม่ "เสีย" แบบสุ่มมาก (ใช้ 89% ของบิตสุ่มที่ได้รับ vs ~ 24% สำหรับวิธีแก้ปัญหาโดยตรงกับท่อ)
  • ตัวอักษร 22 และ 44 จับคู่กันอย่างมาก (เหนือระดับแม้กระทั่ง) พลังร่วมของสองเบรกพอยต์
  • สามารถเลือกและวางเอาต์พุตหรือพิมพ์และพิมพ์ซ้ำได้อย่างง่ายดายโดยมีอัตราความผิดพลาดน้อยที่สุด
  • สั้นกว่า hex ที่เข้ารหัส (32 และ 64 แทนโซลูชั่น 22 และ 44) เช่น md5sum / sha1sum เป็นต้น

ให้เครดิตกับhttps://unix.stackexchange.com/a/230676/9583และโดยเฉพาะอย่างยิ่งความคิดเห็นสำหรับแรงบันดาลใจเริ่มต้นของฉัน


ถ้าคุณต้องการตัวเลข / ตัวอักษรพิเศษ - โดยทั่วไปจะมีตัวเลขถ้าไม่คุณสามารถผนวกได้อย่างปลอดภัย1โดยไม่ลดเอนโทรปี (ในขณะที่สร้างใหม่เพื่อรับหนึ่ง w / a จำนวนจะลดเอนโทรปี) นอกจากนี้คุณยังสามารถผนวก!เอนโทรปีได้อย่างปลอดภัยโดยไม่ลด โครงร่างไม่เพิ่มเอนโทรปีที่มีค่าใด ๆ เช่นกัน แต่สามารถทำให้สตริงที่สร้างขึ้นสอดคล้องกับข้อกำหนดรหัสผ่านที่เก่ากว่า
Iiridayn

1

ปรัชญา Unix ของ "เครื่องมือเล็ก ๆ มากมายที่ทำสิ่งเดียวได้ดี" ให้บริการคุณได้เป็นอย่างดีในกรณีนี้

  • /dev/urandomเป็นสตรีมของ"ไบต์" แบบสุ่ม (ซึ่งรวมถึงอักขระที่ไม่สามารถพิมพ์ได้)
  • base64 เข้ารหัสข้อมูลไบต์ลงใน [A-Za-z0-9/+] (ซึ่งสามารถพิมพ์ได้ทั้งหมด)
  • dd คัดลอกอินพุตไปยังเอาต์พุตที่ใช้ตัวดัดแปลงที่กำหนดเป็นอาร์กิวเมนต์ (ซึ่งอาจรวมถึงขนาดบล็อกและจำนวนบล็อก)

OSX

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

ลินุกซ์

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

หมายเหตุ:

  • หากคุณต้องการเซ็ตย่อยของอักขระคุณสามารถแทรกตัวดัดแปลงในไพพ์ได้
    • เช่นtr -d '[A-Z/+]'กำจัดตัวอักษร+และ/
  • คุณสามารถตั้งค่าbs(ขนาดบล็อก) ตามความยาวที่คุณต้องการ
  • บน Linux ให้มีการbase64ตัดคอลัมน์เป็น 76 คอลัมน์โดยค่าเริ่มต้นและต้องรีเซ็ตด้วย-w0เว้นแต่ว่าคุณต้องการ

1

ฉันต้องการสนับสนุนคำสั่งตามปกติของฉันเพื่อสร้างรหัสผ่าน

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

ในการกำหนดค่าความยาวของรหัสผ่านให้เปลี่ยนหมายเลขในคำสั่ง cut เป็นความยาวที่คุณต้องการตัวอย่างเช่น 24 ตัวอักษร

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

ไม่ต้องการสับสน 0 หรือ O, 1 หรือ l? กรองออกด้วยอีกtr

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

ส่วนตัวแล้วฉันไม่ชอบอักขระพิเศษในรหัสผ่านนั่นคือเหตุผลที่ฉันเลือกเฉพาะตัวสร้าง[:alnum:]รหัสผ่านของฉัน


0

ฉันจะรักษาsecpwgenในอัลไพน์ลินุกซ์และให้แหล่งที่มาบน Github

มันสามารถสร้างสตริงสุ่มหรือวลี diceware:

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

ในการสร้างสตริงสุ่ม 13 ตัวคุณจะต้อง:

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.

สำหรับผู้ใช้ในการจำรหัสผ่านให้ใช้วลี diceware:

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

ฉันชอบโดยส่วนตัว:

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

0

ทางของฉันสำหรับรหัสผ่านที่ปลอดภัยมาก (ที่ 16 คือความยาว pw):

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

ตัวอย่างผลลัพธ์:

jT@s_Nx]gH<wL~W}

หรืออีกวิธีหนึ่งในการสร้างรหัสผ่านหลายรายการ:

cat / dev / urandom | tr -cd [: กราฟ:] | fold -w 16 | head -6

ตัวอย่างผลลัพธ์:

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*

ความปลอดภัยน้อยกว่าเล็กน้อย (ชุดตัวอักษรขนาดเล็ก):

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

ตัวอย่างผลลัพธ์:

rJqYxYZLOTV+A45w
PUKQ+BoBf6yfZw5m
+LRfpsN9CsLRiN8V
yMS6zDpL6NHmG17s
yTUWPG7Rum97schi
cognvjVwaKaAyPRK

-1

วิธีที่ง่ายและเรียบง่ายสุด ๆ (อาจจะง่ายกว่าที่คุณมองหา) วิธีที่จะทำให้เกิดสิ่งนี้คือการสร้างตัวเลขสุ่มในช่วงที่กำหนดแปลงตัวเลขนั้นเป็นอักขระ ASCII ที่เท่ากันและต่อท้ายสตริง .

นี่คือตัวอย่างพื้นฐานใน 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

แก้ไข: เพิ่มความคิดเห็นและเพิ่มรหัสเพื่อสร้างรหัสผ่านหลายรายการและเขียนลงในไฟล์


3
หากได้รับพลังของ Python ฉันจะไม่ทำแบบนี้ มันจะง่ายกว่าการใช้การเข้าร่วมกับสตริงที่มีอักขระทั้งหมดที่ถูกต้องสำหรับรหัสผ่านและการใช้แบบสุ่มเพื่อเลือกอักขระ
Mike McMahon

ดีกว่าที่จะใช้ Python เช่นcode.activestate.com/recipes/578468-password-generator-mkpasswd
Grijesh Chauhan

-2

ฉันต้องการคำสั่งนี้:

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

1
ฉันอยากจะใช้วิธีการ nanoseconds แบบสุ่มมากกว่านี้: date +%N เนื่องจากหากคุณสร้างผู้ใช้และรหัสผ่านจำนวนมากในสคริปต์วินาทีอาจจะเหมือนกันสำหรับคำสั่งวันที่ทั้งหมดหรือแม้กระทั่งทุกคำสั่งดังนั้นจึงสร้างรหัสผ่านที่เหมือนกัน
John Mayor

1
@JohnMayor: วิธีนี้แข็งแกร่งกว่าdd if=/dev/random bs=512 count=1หรือไม่:
Eugen Konkov

8
คำตอบนี้อันตรายมาก! คุณสร้างรหัสผ่านจากเมล็ดที่รู้จักซึ่งง่ายต่อการคาดเดา ฉันสามารถสร้างรหัสผ่านทั้งหมดที่สร้างขึ้นโดยใช้วิธีการนี้ของปีที่ผ่านมาและใช้รายการนี้เพื่อวัตถุประสงค์การบังคับเดรัจฉาน
Flow

-4

ฉันไปที่http://passwordsgenerator.net/เพื่อ ให้สามารถสร้างสตริงของตัวอักษรแบบสุ่มได้ถึง 2048 ตัวอักษรการเลือกตัวพิมพ์ใหญ่ตัวพิมพ์เล็กตัวเลข 0 ถึง 9 เครื่องหมายวรรคตอนหรือชุดค่าผสมอื่น ๆ


2
ฉันได้ชี้แจงคำถามเพื่อให้ชัดเจนว่าสตริงที่สร้างขึ้นแบบออฟไลน์ดีกว่า การสร้างรหัสผ่านโดยตรงบนเว็บไซต์โดยเฉพาะหากการเชื่อมต่อไม่ใช่ HTTPS (ตามคำตอบของคุณ) ไม่ปลอดภัย
landroni

1
การรับรหัสผ่านแบบสุ่มจากอินเทอร์เน็ตนั้นโง่และไร้เดียงสาอย่างน่าทึ่ง ตอนนี้มีคนรู้รหัสผ่านที่คุณใช้สำหรับบริการหรือเว็บไซต์และรายละเอียดส่วนบุคคลที่ไม่ซ้ำกันเกี่ยวกับคุณ (ที่อยู่ IP, เบราว์เซอร์ / ข้อมูลสภาพแวดล้อม) ไซต์นี้สามารถอ้างอิงข้ามข้อมูลกับข้อมูลอื่น ๆ ที่รวบรวมเกี่ยวกับคุณ ตัวอย่างเช่นเมื่อคุณโพสต์ไปยังรายชื่อผู้รับจดหมายที่อยู่ IP ของคุณอยู่ในส่วนหัวของจดหมายดังนั้นตอนนี้เรามีรหัสผ่านชื่อและที่อยู่อีเมล ... คุณเชื่อถือคนแปลกหน้าแบบสุ่มด้วยรหัสผ่านของคุณที่นี่
Martin Tournoij
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.