एक यादृच्छिक पासवर्ड उत्पन्न करना; यह पोर्टेबल क्यों नहीं है


21

मैं एक यादृच्छिक पासवर्ड उत्पन्न करना चाहता हूं, और ऐसा कर रहा हूं:

</dev/urandom tr -dc [:print:] | head -c 64

मेरे लैपटॉप पर, जो उबंटू चलाता है, यह केवल मुद्रण योग्य वर्णों का उत्पादन करता है, जैसा कि इरादा था। लेकिन जब मैं अपने स्कूल के सर्वर में जाता हूं, जो Red Hat Enterprise Linux चलाता है, और इसे वहां चलाता है, तो मुझे आउटपुट मिलते हैं 3!ri�b�GrӴ��1�H�<�oM����&�nMC[�Pb�|L%MP�����9��fL2q���IFmsd|l�K, जो बिल्कुल नहीं चलेगा। यहां क्या गलत हो सकता है?

जवाबों:


34

यह आपकी लोकेल और ट्र समस्या है।

वर्तमान में, GNU tr पूरी तरह से केवल एकल-बाइट वर्णों का समर्थन करता है। मल्टीबाइट एन्कोडिंग का उपयोग करने वाले स्थानों में, उत्पादन अजीब हो सकता है:

$ </dev/urandom LC_ALL=vi_VN.tcvn tr -dc '[:print:]' | head -c 64
`�pv���Z����c�ox"�O���%�YR��F�>��췔��ovȪ������^,<H ���>

शेल बहु-बाइट वर्णों को सही तरीके से प्रिंट करेगा, लेकिन GNU trबाइट को हटा देगा , यह गैर-मुद्रण योग्य लगता है।

यदि आप चाहते हैं कि यह स्थिर हो, तो आपको स्थान निर्धारित करना होगा:

$ </dev/urandom LC_ALL=C tr -dc '[:print:]' | head -c 64
RSmuiFH+537z+iY4ySz`{Pv6mJg::RB;/-2^{QnKkImpGuMSq92D(6N8QF?Y9Co@

14
+1 क्योंकि इससे मुझे अहसास हुआ (केवल 30 वर्षों के लिए यूनिक्स / लिनक्स पर गोले का उपयोग करना), कि इसके लागू होने के बाद स्टड / stdout / stderr पुनर्निर्देशन को तैनात करने की आवश्यकता नहीं है ।
एन्थॉन

बस एक टिप्पणी, अगर कुछ अजीब लोकेशन सेट है, तो क्या शेल अभी भी अक्षरों को सही ढंग से प्रिंट करने में सक्षम नहीं होना चाहिए, भले ही वे एएससीआई न हों? कम से कम एक सक्षम शेल (पाठ्यक्रम के xterm को छोड़कर)?
ओरियन

2
@orion: शेल वर्णों को सही ढंग से प्रिंट करेगा। इस मामले में, यह tr समस्या है। इसे हटा दिया बाइट्स गैर-मुद्रण योग्य लगता है, परिणाम अजीब बनाते हैं।
cuonglm

@orion बाइट्स की एक समान रूप से यादृच्छिक धारा, सामान्य रूप से अच्छी तरह से गठित UTF-8 वर्ण एन्कोडिंग की एक समान रूप से यादृच्छिक धारा नहीं होगी ।
जूल

इसके अलावा, जब तक कि आपके पासवर्ड में क्या जगह है, आपको :graph:इसके स्थान पर उपयोग करना चाहिए :print::</dev/urandom LC_ALL=C tr -dc '[:graph:]' | head -c 64
edan

11

इसके बजाय विचार करें

$ dd if=/dev/urandom bs=48 count=1 status=none | base64
imW/X60Sk9TQzl+mdS5PL7sfMy9k/qFBWWkzZjbYJttREsYpzIguWr/uRIhyisR7

इसके दो फायदे हैं:

  • आप यादृच्छिक डिवाइस से केवल 48 बाइट्स पढ़ते हैं, ~ 8KB नहीं; यदि एक ही मेजबान पर अन्य प्रक्रियाओं को यादृच्छिक संख्याओं की आवश्यकता होती है, तो 8KB एक ही बार में सभी सूखा हो सकता है। (हां, यकीनन किसी को भी अवरुद्ध रैंडम डिवाइस का उपयोग नहीं करना चाहिए , लेकिन लोग करते हैं ।)

  • आउटपुट में base64विशेष अर्थ वाले लगभग कोई वर्ण नहीं हैं। (सब पर कोई नहीं है, कील के लिए | tr +/ -_अंत पर, और (उदाहरण के रूप में) यकीन है कि बाइट की संख्या बनाने के इनपुट के लिए base643. का गुणज है)

इस तरह से उत्पन्न पासवर्ड में 384 बिट्स एन्ट्रॉपी होती है, जो कि आप जो कर रहे थे, उससे कुछ कम है (लॉग 2 96 64 , 421.4), लेकिन अधिकांश उद्देश्यों के लिए पर्याप्त से अधिक (256 बिट ऑफ एनट्रॉपी सुरक्षित रूप से "अभी भी अनुमान लगाते हैं" RSA कुंजियों, AFAIK को छोड़कर , सूर्य "क्षेत्र को जलाता है" ।


3

अन्य लोगों ने पहले ही बताया कि लोकेल का [:print:]मतलब क्या है। हालांकि, सभी प्रिंट करने योग्य वर्ण पासवर्ड के लिए उपयुक्त नहीं हैं (एएससीआई में भी नहीं)। आपको वास्तव में रिक्त स्थान, टैब और # $% ^ नहीं चाहिए? आपके पासवर्ड में - यह याद रखना मुश्किल नहीं है, यह अंतर्निहित प्रमाणीकरण प्रणाली के लिए भी खतरनाक है, इनपुट क्षेत्र में प्रवेश करना असंभव हो सकता है, और इसी तरह। इस मामले में, आपको "मैन्युअल रूप से" वर्णों का चयन करना चाहिए:

LC_ALL=C </dev/urandom tr -dc '[:alnum:]_' | head -c 64

या केवल

</dev/urandom tr -dc 'A-Za-z0-9_' | head -c 64

या इससे भी बेहतर, base64अन्य उत्तरों में सुझाए अनुसार उपयोग करें ।


प्रश्न में पासवर्ड कभी भी मनुष्यों द्वारा दर्ज नहीं किया जा सकता है (यदि ऐसा था कि मैं इसके बजाय डाइवेयर उपयोग कर रहा हूं) और मुझे पूरा यकीन है कि अंतर्निहित सिस्टम समस्याओं के बिना विशेष वर्णों को संभाल सकता है। फिर भी धन्यवाद।
तैमूर

4
आप जो कहते हैं, वह सरासर गलत है। उपयोगकर्ताओं को केवल एएससीआई अक्षरों, अंकों और अंडरस्कोर का उपयोग करने के लिए मजबूर करना वर्णमाला के आकार को काफी कम कर देता है, जिससे हमलावरों के लिए पासवर्ड को तोड़ना बहुत आसान हो जाता है। एक प्रमाणीकरण प्रणाली जो कि संभाल भी नहीं सकती है ?या ^जिसे गंभीरता से लिया जाना बहुत बुरा है।
बाकुरी

2
यदि आपकी सामान्य प्रणाली या इनपुट फ़ील्ड नियमित ASCII प्रतीकों पर घुट जाती हैं ... तो आप कुछ गलत कर रहे हैं और मेरी निजी जानकारी पर भरोसा नहीं किया जा सकता है। आपके पासवर्ड में सभी प्रकार के वर्ण (रिक्त स्थान सहित) स्वीकार नहीं करने का कोई कारण नहीं है।
nififnab

2
ऐसा प्रतीत होता है कि यहां ऐसा नहीं है, लेकिन जब मानव इनपुट की बात आती है, तो एक लंबे अल्फ़ान्यूमेरिक पासवर्ड को याद रखना बहुत आसान होता है, जो प्रतीकों के एक छोटे से गड़बड़ी की तुलना में मालिक के लिए एक अनूठा अर्थ रखता है। इन वर्णों को विभिन्न कीबोर्डों पर इनपुट करने का मुद्दा भी है (हर किसी के पास ^ प्रथम स्तर पर नहीं है और ज्यादातर लोगों को यह भी नहीं पता है कि बैकटिक कहाँ है या क्या है), इनपुट बॉक्स लगभग निश्चित रूप से टैब कैरेक्टर को संभाल नहीं सकते हैं, और वेबफॉर्म की आश्चर्यजनक संख्या अभी भी सत्यापन त्रुटियों, एसक्यूएल इंजेक्शन, या यहां तक ​​कि अनिश्चित केस संवेदनशीलता के लिए अतिसंवेदनशील है।
ओरियन

1
बस एक नोट: सी लोकेल [:print:]वर्ग में टैब शामिल नहीं हैं। यह केवल [:alnum:]+ [:punct:]+ स्थान (एकल स्थान, नहीं [:space:] ) है।
जिमीज

2

व्हाट अबाउट

tr -dc [:print:] < /dev/urandom | head -c 64 | strings

स्ट्रिंग्स को एक प्रिंट करने योग्य प्रारूप में यूरेनियम के आउटपुट को प्रिंट करना चाहिए


यह देता है-bash: /dev/urandom: Permission denied
एंथन

सॉरी अग्रणी बिल्ली भूल गया
ब्लाइंडस्टेलर

2

मुझे नहीं पता कि क्या कोई कारण है कि आप /dev/randomपासवर्ड उत्पन्न करने के लिए उपयोग करते हैं, लेकिन मैं आपको अपना दर्द कम करने के लिए pwgen का उपयोग करने की सलाह दूंगा।

$ pwgen -s 10 1

जहां 10 पासवर्ड की लंबाई है।

http://man.cx/pwgen


1
#Chars allowed in password (I don't like l,o,O, etc):
P="0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz"

#Or such:
#P="a-zA-Z0-9"

head -c 8 < /dev/urandom | tr '\000-\377' "$P$P$P$P$P"
echo

यह विधि IMHO चालाक होती है जब / dev / urandom से डेटा की खपत होती है। स्ट्रिंग $ P $ P $ P के रूप में चिपकाई जाती है ... कम से कम 256 वर्ण लंबा होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.