/ Dev / এলোমেলো থেকে পড়া কোনও ডেটা তৈরি করে না


19

আমি প্রায়শই কমান্ডটি ব্যবহার করি

cat /dev/urandom | strings --bytes 1 | tr -d '\n\t ' | head --bytes 32

সিউডো-এলোমেলো পাসওয়ার্ড তৈরি করতে। এটি দিয়ে কাজ করে না /dev/random

বিশেষভাবে

  • cat /dev/urandom | strings --bytes 1 | tr -d '\n\t ' আউটপুট উত্পাদন করে
  • cat /dev/random | strings --bytes 1 আউটপুট উত্পাদন করে
  • cat /dev/random | strings --bytes 1 | tr -d '\n\t ' আউটপুট উত্পাদন করে না

এনবি: ব্যবহার করার সময় /dev/randomআপনাকে এন্ট্রপি তৈরি করতে আপনার মাউস বা টিপুন কী (যেমন সিটিআরটিএল, শিফট ইত্যাদি) চাপতে পারে।

শেষ উদাহরণটি কেন কাজ করে না? না trযে বৃহৎ অভ্যন্তরীণ বাফার কোন না কোন রকমের /dev/urandomদ্রুত ভর্তি কিন্তু /dev/randomনা?

PS আমি CentOS 6.5 ব্যবহার করছি

cat /proc/version
Linux version 2.6.32-431.3.1.el6.x86_64 (mockbuild@c6b10.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Jan 3 21:39:27 UTC 2014

আপনার বিতরণ কি, আপনার কার্নেল সংস্করণ? সাইগউইনে উভয়ই ফেরতের মান values
কিউই

@ কিউই সম্পাদনা দেখুন।
অ্যারন

1
তুমি কি জানো pwgenবিশেষত, pwgen -s?
এমভিজি

2
-sসুইচ তাদের কম স্মরণীয় আরো সত্যিই র্যান্ডম করে তোলে। @ বয়েড: মেকপ্যাসডটি কি দেবিয়ান -ভিত্তিক ডিস্ট্রোসের বাইরে বহুলভাবে পাওয়া যায়? আমি এটি যেভাবে দেখছি, পাইউজেন সেন্টোস-এর জন্য পাওয়া যায় যখন মেকপ্যাসওয়ড হয় না
এমভিজি

1
@BoydStephenSmithJr। আমি @ এমভিজির সাথে সম্মতি জানাই যা makepasswdআমার প্ল্যাটফর্মে পাওয়া যায় না, যাইহোক ধন্যবাদ
অ্যারোন

উত্তর:


27

এটা শেষ পর্যন্ত হবে।

ভিতরে:

cat /dev/random | strings --bytes 1 | tr -d '\n\t '

cat কখনই বাফার করবে না, তবে এটি এখানে যেমন অতিরিক্ত কিছু করার দরকার নেই তেমনি এটি অতিরিক্ত অতিরিক্ত।

< /dev/random strings --bytes 1 | tr -d '\n\t '

stringsযদিও, আউটপুট কোনও টার্মিনালে গেলে আউটপুটটি লাইনগুলির বিপরীতে টার্মিনালটি তার আউটপুটটি ব্লক (4 বা 8 কেবি এর মতো কিছু) দ্বারা আউটপুটটি বাফার করবে ।

সুতরাং এটি কেবল স্টাডাউটে লেখা শুরু করবে যখন এটি আউটপুটে 4kB মূল্যের অক্ষর জমেছে, যা /dev/randomকিছুটা সময় নিতে চলেছে।

trআউটপুট একটি টার্মিনালে যায় (যদি আপনি এটি টার্মিনালের শেল প্রম্পটে চালাচ্ছেন), সুতরাং এটি তার আউটপুট লাইন অনুযায়ী বাফার করবে। যেহেতু আপনি মুছে ফেলছেন \n, এটিতে কখনই লেখার পূর্ণ লাইন থাকবে না, পরিবর্তে এটি একটি সম্পূর্ণ ব্লক জমা হওয়ার সাথে সাথেই এটি লিখবে (যেমন যখন আউটপুট কোনও টার্মিনালে যায় না)।

সুতরাং, 8kB (2 টি ব্লক সম্ভবত আরও অনেকগুলি) ডেটা (যেমন প্রথম ব্লকে সম্ভবত কিছু নতুন লাইন বা ট্যাব বা স্পেস অক্ষর থাকবে) লিখতে পারা trপর্যন্ত stringsযথেষ্ট পরিমাণে না পড়া পর্যন্ত কিছু লেখা না হওয়ার সম্ভাবনা রয়েছে /dev/random

এই সিস্টেমে আমি এটি চেষ্টা করে দেখছি, আমি প্রতি সেকেন্ডে গড়ে 3 বাইট পেতে পারি /dev/random(12MiB এর বিপরীতে /dev/urandom), তাই সর্বোত্তম ক্ষেত্রে (প্রথম 4096 বাইট থেকে /dev/randomসমস্ত মুদ্রণযোগ্য), আমরা trকিছু আউটপুট শুরু 22 মিনিট আগে কথা বলা । তবে এটি সম্ভবত ঘন্টা হতে চলেছে (একটি দ্রুত পরীক্ষায়, আমি stringsপ্রতি 1 থেকে 2 টি ব্লক পড়ে একটি ব্লক লেখা দেখতে পাই এবং আউটপুট ব্লকে প্রায় 30% নিউলাইন অক্ষর রয়েছে, তাই আমি এটি পড়তে চাইব কমপক্ষে 3 টি ব্লকের আগে tr4096 টি অক্ষরের আউটপুট থাকতে পারে)।

এড়াতে, আপনি এটি করতে পারেন:

< /dev/random stdbuf -o0 strings --bytes 1 | stdbuf -o0 tr -d '\n\t '

stdbuf একটি জিএনইউ কমান্ড (কিছু BSD- তেও পাওয়া যায়) যা একটি LD_PRELOAD ট্রিকের মাধ্যমে কমান্ডের স্টিডিও বাফারিংকে পরিবর্তন করে।

মনে রাখবেন যে পরিবর্তে strings, আপনি ব্যবহার করতে পারেন tr -cd '[:graph:]'যা ট্যাব, নিউলাইন এবং স্থানকেও বাদ দেবে।

আপনি Cইউটিএফ -8 অক্ষরের সাথে সম্ভাব্য ভবিষ্যতের বিস্ময় এড়াতে লোকালটি ঠিক করতেও পারেন ।


বাহ চিত্তাকর্ষক ব্যাখ্যা।
কিউই

2
অ্যামেজিং! দুর্দান্ত ব্যাখ্যা এবং সমাধান। আমি সর্বদা cat'বেহুদা' ব্যবহার করেছি কারণ পাইপলাইন শেষে স্টিডিনকে পুনঃনির্দেশ করা পছন্দ করি না, এখন আমি 'প্রক্রিয়াটি সংরক্ষণ করতে' পারি এবং এখনও পঠনীয় কমান্ড থাকতে পারি। আমার চূড়ান্ত সমাধানটি ছিল< /dev/random stdbuf -o0 tr -Cd '[:graph:]' | stdbuf -o0 head --bytes 32
অ্যারন

@ অ্যারোনজেল্যাং, ভাল বিষয় [:graph:]। আমি এটা সম্পর্কে ভুলে গিয়েছিলাম।
স্টাফেন চেজেলাস

@AaronJLang, আপনি প্রয়োজন হবে না stdbufজন্য head -c32যদি না আপনি এটা তাড়াতাড়ি ডেটা লিখতে অনুমতি দিতে চান যেমন সেটা ধরে ফেলেছে (যেমন শীঘ্রই এটি এর মতো এক 32byte খণ্ড পরিবর্তে বিভিন্ন অংশ তাদের পেয়েছিলাম)
Stéphane Chazelas

2
আমার মতে, / দেব / ইউরানডম লেখকের ব্যবহারের জন্য যথেষ্ট। যদি কেউ কৌতূহলী হন যে কীভাবে, বিশেষত, এলোমেলোভাবে তুলনা করে ইউরানডম কাজ করে, আমি কার্নেল উত্স গাছের ড্রাইভার / চর / এলোমেলো সি। এ ড্রাইভারের শীর্ষে মন্তব্যগুলি পড়ার পরামর্শ দেব। মন্তব্যগুলি PRNG এর বিশ্লেষণ এবং এটি বাস্তবায়নের কথা উল্লেখ করে। আশা করি, এই কাগজটি প্রশ্নের উত্তর দেবে "এলোমেলো তুলনায় আরও বেশি বা কম এলোমেলো কীভাবে?" এখানে উপলব্ধ: eprint.iacr.org/2012/251.pdf
ইথারফিশ

5

অনেকগুলি সুরক্ষা অ্যাপ্লিকেশনের জন্য এলোমেলো সংখ্যা তৈরির জন্য পর্যাপ্ত এনট্রপি প্রয়োজন - এন্টারপপি এলোমেলোভাবে কতটা অনাকাঙ্ক্ষিত তা পরিমাপ করে। একটি ডিস্ট্রিমেন্টিক প্রসেসর এন্ট্রপি জেনারেট করতে পারে না, তাই এন্ট্রপি অবশ্যই বাইরে থেকে আসতে হবে - হয় কোনও ডিটারনস্টিনিস্টিক আচরণ সহ একটি হার্ডওয়্যার উপাদান থেকে, বা পুনরুত্পাদন করা যথেষ্ট কঠিন এমন অন্যান্য বিষয়গুলি থেকে যেমন ব্যবহারকারীর ক্রিয়াকলাপের সময় (যেখানে মাউসটি টানছে) আসে). একবার পর্যাপ্ত এনট্রপি পাওয়া গেলে, ক্রিপ্টোগ্রাফি ব্যবহার করে এলোমেলো সংখ্যার ব্যবহারিকভাবে সীমাহীন স্ট্রিম তৈরি করা যেতে পারে।

লিনাক্স একটি পুলে এনট্রপি সংগ্রহ করে, তারপর ক্রিপ্টোগ্রাফি ব্যবহার করে /dev/randomএবং উভয় মাধ্যমে গ্রহণযোগ্য এলোমেলো সংখ্যা তৈরি করে কাজ করে /dev/urandom। পার্থক্যটি এটি /dev/randomএকটি চূড়ান্ত রক্ষণশীল এনট্রপি গণনার প্রয়োগ করে যা এটি তৈরি করে এমন প্রতিটি বাইটের জন্য পুলের এনট্রপির অনুমানকে হ্রাস করে, যেখানে /dev/urandomপুলটিতে এনট্রপির পরিমাণ নিয়ে নিজেকে উদ্বেগ দেয় না।

যদি পুলটিতে এনট্রপির অনুমান খুব কম /dev/randomহয় তবে আরও এনট্রপি সংগ্রহ করা অবধি ব্লকগুলি। এটি /dev/randomআউটপুট উত্পাদন করতে পারে এমন হারকে মারাত্মকভাবে পঙ্গু করতে পারে। এটি আপনি এখানে পর্যবেক্ষণ করছেন। এর সাথে কিছু করার নেই tr; তবে stringsবাফারিং সহ আউটপুট পড়ে, সুতরাং /dev/randomকমপক্ষে একটি ইনপুট বাইট তৈরি করতে এটি থেকে একটি সম্পূর্ণ বাফার (কয়েক কেবি) পড়তে হবে ।

/dev/urandomএকটি ক্রিপ্টোগ্রাফিক কী তৈরির জন্য পুরোপুরি গ্রহণযোগ্য , কারণ এন্ট্রপি আসলে কোনও উপলব্ধিযোগ্য উপায়ে হ্রাস পায় না। (যদি আপনি মহাবিশ্বের অস্তিত্বের চেয়ে বেশি সময় ধরে আপনার মেশিনটি চালিয়ে যান, আপনি এই বিবেচনাগুলিকে অবহেলা করতে পারবেন না, তবে অন্যথায় আপনি ভাল)) কেবলমাত্র একটি ক্ষেত্রেই /dev/urandomভাল নেই, যা নতুনভাবে ইনস্টল করা সিস্টেমে রয়েছে এখনও এনট্রপি তৈরি করার সময় নেই, বা একটি সতেজ বুট করা সিস্টেম যা কেবল পঠনযোগ্য মিডিয়া থেকে বুট হয়।

stringsআপনার বুট চেইন থেকে বাদ দেওয়া সম্ভবত আপনার প্রক্রিয়াটিকে ত্বরান্বিত করবে। নীচে trমুদ্রণবিহীন অক্ষরগুলি ফিল্টার করবে:

</dev/random LC_ALL=C tr -dc '!-~'

তবে আপনি/dev/urandom এতক্ষণ এখানে ব্যবহার করতে পারবেন , যতক্ষণ না আপনি এমন সিস্টেমে পাসওয়ার্ড তৈরি না করার বিষয়ে যত্ন নেন যেটিতে পর্যাপ্ত এনট্রপি সংগ্রহের সময় নেই। আপনি লিনাক্সের এনট্রপি পুলের স্তরটি পরীক্ষা করতে পারেন /proc/sys/kernel/random/entropy_avail(যদি আপনি ব্যবহার /dev/randomকরেন তবে এই ফাইলটির চিত্রটি রক্ষণশীল হবে, সম্ভবত খুব বেশি)।


1

আপনার /dev/urandomউচ্চ মানের (সিউডো) এলোমেলো নম্বর পেতে ব্যবহার করা উচিত এবং /dev/randomকেবল যখন আপনার একেবারে অনাকাঙ্ক্ষিত এমন এলোমেলো সংখ্যা প্রয়োজন। এনএসএর সংস্থানগুলির নীচে আক্রমণকারীটির ক্র্যাক করতে খুব কঠিন সময় হবে /dev/urandom(এবং রাবার পায়ের পাতার মোজাবিশেষের ক্রিপ্টোগ্রাফি সম্পর্কে ভুলবেন না )। কার্নেলটি "সত্যিকারের এলোমেলো" বাইট দিয়ে একটি বাফার পূরণ করে, এটিই /dev/randomদেয়। দুঃখজনকভাবে এগুলি যে হারে উত্পন্ন হয় তা কম, সুতরাং এখান থেকে প্রচুর পড়া পড়া এলোমেলোতার জন্য অপেক্ষা /dev/random করবে

আপনি র্যান্ডম.অর্গ বা তার পাসওয়ার্ড জেনারেটর বা চারপাশে ভাসমান অনেকগুলি, অনেক এলোমেলো পাসওয়ার্ড জেনারেটরগুলির মধ্যে একটির কথা বিবেচনা করতে পারেন, কয়েকটি কমান্ড লাইনের টিপসের জন্য এই পৃষ্ঠায় একবার দেখুন (আমি এই সমস্তটির সুপারিশই করি না যে , তবে তাদের আপনাকে ধারণা দেওয়া উচিত) অথবা আপনি mkpasswd(1)(ফেডোরার 19 অংশে expect-5.45-8.fc19.x86_64) এর মতো কিছু ব্যবহার করতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.