পিএইচপি র‌্যান্ডের আউটপুট পূর্বাভাস ()


21

আমি বহু উত্সে পড়েছি যে পিএইচপি র‌্যান্ড () এর আউটপুট এটির একটি পিআরএনজি হিসাবে অনুমানযোগ্য এবং আমি বেশিরভাগ ক্ষেত্রেই এটি সত্য হিসাবে গ্রহণ করি কারণ আমি এটি এত জায়গায় দেখেছি।

আমি প্রুফ-অফ-কনসেপ্টে আগ্রহী: আমি কীভাবে র্যান্ড () এর আউটপুট পূর্বাভাস দিতে পারি? পড়া থেকে এই নিবন্ধটি আমি বুঝি যে র্যান্ডম সংখ্যা একটি সংখ্যা একটি পয়েন্টার (বীজ) থেকে শুরু একটি তালিকা থেকে ফিরে - কিন্তু আমি কল্পনা করতে পারবেন না কিভাবে এই অনুমান করা যাবে।

কেউ কয়েক হাজার অনুমানের মধ্যে সময়ে একটি নির্দিষ্ট মুহুর্তে র‌্যান্ড (#) এর মাধ্যমে কী এলোমেলোভাবে তৈরি হয়েছিল তা যুক্তিসঙ্গতভাবে নির্ধারণ করতে পারেন? এমনকি 10,000 অনুমান? কিভাবে?

এটি সামনে আসছে কারণ আমি এমন একটি লেখক গ্রন্থাগার দেখেছি যা পাসওয়ার্ড হারিয়ে যাওয়া ব্যবহারকারীদের জন্য একটি টোকেন তৈরি করতে র‌্যান্ড () ব্যবহার করে এবং আমি ধরে নিয়েছিলাম এটি একটি সম্ভাব্য সুরক্ষা গর্ত। আমি openssl_random_pseudo_bytes()এরপরে পদ্ধতিটি অরিগনাল হ্যাশ পাসওয়ার্ড এবং মাইক্রোটাইমের মিশ্রণটি হ্যাশ করে প্রতিস্থাপন করেছি । এটি করার পরে আমি বুঝতে পেরেছিলাম যে যদি আমি বাইরের দিকে তাকিয়ে থাকি তবে টোকেনটি কীভাবে অনুমান করা যায় তা আমি জানতাম না এমনকি এটি র্যান্ড () এর এমডি 5 ছিল knowing


"তবে আমি কীভাবে অনুমানযোগ্য তা ভাবতে পারি না"? আপনাকে প্রথমে " এন.ইউইকিপিডিয়া.আর / উইকি / লাইনার_কন্ট্রিউশনাল_জেনেটরটি পড়তে হবে যাতে আপনি কীভাবে এটি ভবিষ্যদ্বাণীযোগ্য তা কল্পনা করতে পারেন Then রান্ড ফাংশন উৎস দেখতে কিভাবে এটি কাজ করে।
S.Lott

"আমি ধরেছিলাম এটি কি একটি সম্ভাব্য সুরক্ষা গর্ত"? কেবলমাত্র এভিল হ্যাকার যদি কিছু ব্যবহারকারীর এলোমেলো পাসওয়ার্ড পেতে পারে তবে MD5 হ্যাশটিকে পূর্বাবস্থায় ফেলার জন্য একটি রংধনু টেবিল ব্যবহার করুন (প্রাক-হ্যাশ) মানটি এবং তারপরে গ্যারান্টি দিয়েছিলেন যে তারা পরবর্তী পাসওয়ার্ডের অনুরোধ করেছে। তাত্ত্বিকভাবে সম্ভব, আমি মনে করি। তবে কেবলমাত্র যদি তাদের কাছে একটি এলোমেলো সংখ্যার জন্য একটি কাজের রংধনু টেবিল থাকে।
এস .লট

@ এসলট - এটি কোনও পাসওয়ার্ডের বিষয় নয়। সিস্টেমটি আপনাকে পাসওয়ার্ডটি পুনরায় সেট করতে দেয় এবং আপনাকে একটি টোকেন ইমেল করে যা কোনও ইউআরএলে ব্যবহৃত হয়। টোকেনটি MD5 (র্যান্ড ()) এর মাধ্যমে উত্পন্ন হয়। আপনি যদি র‌্যান্ডের আউটপুট পূর্বাভাস করতে পারেন () আপনি মূলটির জন্য হ্যাশ না রেখে বা মূলটি না জেনে যে কারও পাসওয়ার্ড পরিবর্তন করতে পারবেন।
এরিক

@Erik। ঠিক। যদি সহায়তা করে তবে "এলোমেলো পাসওয়ার্ড" কে "এলোমেলো টোকেন" দিয়ে প্রতিস্থাপন করুন। কেউ যদি এলোমেলো নম্বরটি পুনরুদ্ধার করতে এমডি 5 হ্যাশটি অন্বেষণ করতে পারে এবং নিশ্চিত করে দেয় যে তারা পরবর্তী র্যান্ডম নম্বর পাবে তবে টোকেনটি আপত্তিজনকভাবে ব্যবহার করা যেতে পারে। পরবর্তী র্যান্ডের পূর্বাভাস দেওয়া কেবল একটি ছোট অংশ is MD5 কে পূর্বাবস্থায় ফেলাটা শক্ত অংশ।
এস .লট

1
নোট করুন যে এমডি 5 (র্যান্ড ()) এর র্যান্ড () এর মতোই সুরক্ষা রয়েছে। জড়িত খুব সীমিত সংখ্যার জন্য এমডি 5 (র্যান্ড ()) -> র‌্যান্ড () এর একটি সন্ধানের সারণিটি তৈরি করা ব্যবহারিক। র্যান্ড () এর সীমিত ডোমেনের সাহায্যে আপনি যদি সাধারণ উদ্দীপনা প্রয়োগ করতে পারেন তবে যদি না বারবার প্রচেষ্টা রোধ করার জায়গায় কোনও ব্যবস্থা না থাকে।
এমজেডবি

উত্তর:


28

পরবর্তী মানটি অনুমান করার ক্ষমতাটি randযা srandডাকা হয়েছিল তা নির্ধারণ করতে সক্ষম হওয়ার সাথে আবদ্ধ । বিশেষত, পূর্বনির্ধারিত সংখ্যার সাথে বপনের srandফলে ভবিষ্যদ্বাণীযোগ্য ফলাফল হয় ! পিএইচপি ইন্টারেক্টিভ প্রম্পট থেকে:

[charles@charles-workstation ~]$ php -a
Interactive shell

php > srand(1024);
php > echo rand(1, 100);
97
php > echo rand(1, 100);
97
php > echo rand(1, 100);
39
php > echo rand(1, 100);
77
php > echo rand(1, 100);
93
php > srand(1024);
php > echo rand(1, 100);
97
php > echo rand(1, 100);
97
php > echo rand(1, 100);
39
php > echo rand(1, 100);
77
php > echo rand(1, 100);
93
php > 

এটি কেবল কিছু সাবলীল নয়। সর্বাধিক পিএইচপি সংস্করণ * সবচেয়ে প্ল্যাটফর্মের উপর ** ক্রম 97, 97, 39, 77, 93 যখন উত্পন্ন করবে srand'ঘ 1024 সঙ্গে।

স্পষ্ট করে বলতে গেলে, এটি পিএইচপি নিয়ে সমস্যা নয়, এটি randনিজেই বাস্তবায়নের ক্ষেত্রে সমস্যা a পার্ল সহ একই ভাষা (বা একই জাতীয়) বাস্তবায়ন ব্যবহারকারী অন্যান্য ভাষায় একই সমস্যা দেখা দেয়।

কৌশলটি হ'ল পিএইচপি-এর যে কোনও বুদ্ধিমান সংস্করণ srandএকটি "অজানা" মান সহ প্রাক-বীজযুক্ত হবে । ওহ, তবে এটি আসলে অজানা নয়। থেকে ext/standard/php_rand.h:

#define GENERATE_SEED() (((long) (time(0) * getpid())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))

সুতরাং, এটি time()পিআইডি এবং এর ফলাফলগুলির সাথে কিছু গণিত php_combined_lcg, যা সংজ্ঞায়িত হয়েছে ext/standard/lcg.c। আমি এখানে সি & পি করতে যাচ্ছি না, পাশাপাশি, আমার চোখও ঝলমলে হয়ে গেছে এবং আমি শিকার বন্ধ করার সিদ্ধান্ত নিয়েছি।

কিছুটা গুগলিং দেখায় যে পিএইচপি-র অন্যান্য ক্ষেত্রগুলির মধ্যে এলোমেলো প্রজন্মের সেরা বৈশিষ্ট্য নেই , এবং php_combined_lcgএখানে দাঁড়ানোর জন্য কলগুলি বিশেষত বিশ্লেষণের এই:

এই ফাংশনটি ( gettimeofday) কেবল রূপালী প্লেটারে আমাদের একটি সুনির্দিষ্ট সার্ভার টাইমস্ট্যাম্পকে ফিরিয়ে দেয় না , এটি এলসিজি আউটপুটেও যুক্ত করে যদি আমরা "আরও এনট্রপি" (পিএইচপি'র uniqid) অনুরোধ করি।

হ্যাঁ যেuniqid । দেখে মনে php_combined_lcgহয় যে আমরা uniqidদ্বিতীয় যুক্তিটির সাথে সত্যিকারের মান সেট করে কল করার পরে ফলাফলের হেক্স্স সংখ্যাগুলি দেখি তখন এর মান আমরা দেখতে পাই ।

এখন, আমরা কোথায় ছিলাম?

হ্যাঁ. srand

সুতরাং, আপনি যে কোডটি থেকে এলোমেলো মানগুলির পূর্বাভাস দেওয়ার চেষ্টা করছেন সেগুলি যদি কল না করে তবেsrand আপনি যে কলটি দিয়েছিলেন php_combined_lcg(পরোক্ষভাবে?) পেতে পারেন তার সরবরাহকৃত মানটি নির্ধারণ করতে হবে uniqid। সেই মানটি হাতে রেখে, বাকী মান - পিআইডি এবং কিছু গণিতকে জোর করে চাপানো সম্ভব as time()সংযুক্ত সুরক্ষা সমস্যাটি সেশন ভাঙ্গার বিষয়ে, তবে একই কৌশলটি এখানে কাজ করবে। আবার, নিবন্ধ থেকে:

উপরে বর্ণিত আক্রমণের পদক্ষেপগুলির সংক্ষিপ্তসার এখানে:
  • সার্ভারটি পুনরায় বুট করার জন্য অপেক্ষা করুন
  • একটি অদ্বিতীয় মান আনুন
  • এ থেকে আরএনজি বীজকে জোর করে চাপিয়ে দিন
  • লক্ষ্য উপস্থিত হওয়ার জন্য অপেক্ষা করতে অনলাইন স্থিতিটি পোল করুন
  • বর্তমান সার্ভার সময় এবং আরএনজি মান ট্র্যাক রাখতে ইউনিকিড পোলের সাথে ইন্টারলিভ স্থিতি পোলগুলি
  • ভোটগ্রহণে প্রতিষ্ঠিত সময় এবং আরএনজি মান ব্যবধান ব্যবহার করে সার্ভারের বিরুদ্ধে ব্রুট ফোর্স সেশন আইডি

প্রয়োজন অনুসারে কেবল সেই শেষ পদক্ষেপটি প্রতিস্থাপন করুন।

(বর্তমানে সুরক্ষার তুলনায় এই সুরক্ষা ইস্যুটি আমাদের পূর্ববর্তী পিএইচপি সংস্করণে (5.3.2) রিপোর্ট করা হয়েছিল, সুতরাং এটি সম্ভবত সম্ভব যে এর আচরণ uniqidএবং / অথবা php_combined_lcgপরিবর্তিত হয়েছে, সুতরাং এই নির্দিষ্ট কৌশলটি আর কার্যকর হয় না। YMMV।)

অন্যদিকে, আপনি যদি কোডটি ম্যানুয়ালি কলsrand করার চেষ্টা করছেন তবে যদি তারা ফলাফলটির চেয়ে বহুগুণ ভাল কিছু ব্যবহার না করে তবে php_combined_lcgআপনি সম্ভবত মানটি নির্ধারণ করতে এবং আপনার স্থানীয়কে বীজ করার জন্য আরও সহজ সময় পেতে যাচ্ছেন সঠিক নম্বর সহ জেনারেটর। ম্যানুয়ালি কল করা বেশিরভাগ লোকেরা srandধারণাটি বুঝতে পারে না যে এটি কতটা ভয়ঙ্কর ধারণা, এবং এভাবে আরও ভাল মানের ব্যবহার করার সম্ভাবনা নেই।

এটি লক্ষণীয় যে mt_randএটি একই সমস্যা দ্বারাও আক্রান্ত। mt_srandএকটি পরিচিত মান সঙ্গে বপন এছাড়াও অনুমানযোগ্য ফলাফল দিতে হবে। আপনার এন্ট্রপি বন্ধ বন্ধ openssl_random_pseudo_bytesসম্ভবত একটি নিরাপদ বাজি।

tl; dr: সর্বোত্তম ফলাফলের জন্য, পিএইচপি র্যান্ডম নম্বর জেনারেটরটি বদ্ধ করবেন না এবং ভালোর জন্য, uniqidব্যবহারকারীর সামনে প্রকাশ করবেন না । এই দুটি বা উভয়টি করার ফলে আপনার এলোমেলো সংখ্যা আরও অনুমানযোগ্য হতে পারে।


পিএইচপি 7 এর জন্য আপডেট করুন:

পিএইচপি 7.0 প্রবর্তন random_bytesএবং random_intকোর ফাংশন হিসাবে। এগুলি অন্তর্নিহিত সিস্টেমের সিএসপিআরএনজি বাস্তবায়ন ব্যবহার করে, বীজযুক্ত এলোমেলো নম্বর জেনারেটরের যে সমস্যাগুলি তা থেকে তাদের মুক্ত করে। এগুলি openssl_random_pseudo_bytesকেবল ইনস্টল করার জন্য কোনও এক্সটেনশনের প্রয়োজন ছাড়াই কার্যকরভাবে এর মতো । একটি পলিফিল পিএইচপি 5 এর জন্য উপলব্ধ


*: সুহসিন সুরক্ষা প্যাচ এর আচরণ randএবং mt_randএমন পরিবর্তন করে যে তারা সর্বদা প্রতিটি কল দিয়ে পুনরায় বীজ বপন করে। সুহসিন একটি তৃতীয় পক্ষ দ্বারা সরবরাহ করা হয়। কিছু লিনাক্স ডিস্ট্রিবিউশনগুলি এটিকে ডিফল্টরূপে তাদের অফিসিয়াল পিএইচপি প্যাকেজগুলিতে অন্তর্ভুক্ত করে, অন্যরা এটির বিকল্প তৈরি করে এবং অন্যরা এটি সম্পূর্ণ উপেক্ষা করে।

**: প্ল্যাটফর্ম এবং অন্তর্নিহিত লাইব্রেরি কলগুলি ব্যবহার করা হচ্ছে তার উপর নির্ভর করে এখানে ডকুমেন্টের তুলনায় বিভিন্ন সিকোয়েন্স তৈরি করা হবে তবে সুহসিন প্যাচ ব্যবহার না করা হলে ফলাফলগুলি পুনরাবৃত্তিযোগ্য হওয়া উচিত।


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

বাহ, একটি পুরোপুরি ভাল বানান উত্তর জন্য ধন্যবাদ, ধন্যবাদ!
ডেভিড হবস

10

দৃশ্যমানভাবে কীভাবে নন-এলোমেলোভাবে rand()ফাংশনটি চিত্রিত করা যায় তা এখানে একটি চিত্র যেখানে সমস্ত পিক্সেলগুলি "এলোমেলো" লাল, সবুজ এবং নীল মান দিয়ে তৈরি:

র্যান্ডম আরজিবি মান

চিত্রগুলিতে সাধারণত কোনও প্যাটার্ন থাকা উচিত নয়।

আমি srand()বিভিন্ন মান সহ কল করার চেষ্টা করেছি , এটি এই ফাংশনটি কতটা অনুমানযোগ্য তা পরিবর্তন করে না।

লক্ষ্য করুন যে উভয়ই ক্রিপ্টোগ্রাফিকভাবে নিরাপদ নয় এবং অনুমানযোগ্য ফলাফলও দেয়।


7

পিএইচপি এর র‌্যান্ড () এর আউটপুট এটির PRNG হিসাবে অনুমানযোগ্য

এটি একটি লিনিয়ার একত্রিত জেনারেটর । তার মানে আপনি একটি ফাংশন কার্যকরভাবে যে আছে: NEW_NUMBER = (A * OLD_NUMBER + B) MOD C। আপনি যদি NEW_NUMBER বনাম ওএলডি_NUMBER চার্ট করেন তবে আপনি তির্যক লাইনগুলি দেখতে শুরু করবেন। পিএইচপি-র র্যান্ড ডকুমেন্টেশনের কয়েকটি নোট কীভাবে এটি করা যায় তার উদাহরণ দেয়।

এটি সামনে আসছে কারণ আমি এমন একটি লেখক গ্রন্থাগার দেখেছি যা পাসওয়ার্ড হারিয়ে যাওয়া ব্যবহারকারীদের জন্য একটি টোকেন তৈরি করতে র‌্যান্ড () ব্যবহার করে এবং আমি ধরে নিয়েছিলাম এটি একটি সম্ভাব্য সুরক্ষা গর্ত।

উইন্ডোজ মেশিনে, RAND এর সর্বাধিক মান 2 ^ 15। এটি আক্রমণকারীকে কেবল 32,768 টি পরীক্ষা করার সম্ভাবনা দেয়।

কেউ কয়েক হাজার অনুমানের মধ্যে সময়ে একটি নির্দিষ্ট মুহুর্তে র‌্যান্ড (#) এর মাধ্যমে কী এলোমেলোভাবে তৈরি হয়েছিল তা যুক্তিসঙ্গতভাবে নির্ধারণ করতে পারেন? এমনকি 10,000 অনুমান? কিভাবে?

যদিও এই নিবন্ধটি আপনি খুঁজছেন ঠিক তেমন নয়, এটি দেখায় যে কিছু গবেষক কীভাবে একটি এলোমেলো সংখ্যা জেনারেটরের একটি বিদ্যমান বাস্তবায়ন নিয়েছিলেন এবং এটি টেক্সাস হোল্ডেমের অর্থোপার্জনের জন্য ব্যবহার করেছিলেন। 52 আছে! সম্ভাব্য শিফলেড ডেকস, কিন্তু বাস্তবায়নে 32-বিট র্যান্ডম নম্বর জেনারেটর ব্যবহার করা হয়েছে (যা উইন্ডোজ মেশিনে mt_getrandmax এর সর্বাধিক সংখ্যা) এবং মধ্যরাত থেকে সময়টি মিলিসেকেন্ডে সিলড করে। এটি রিয়েল টাইমে অনুসন্ধান করা এবং কী ডেকের সাথে মোকাবিলা করা হয়েছে তা জানার ফলে প্রায় ২২ ^ ২২6 থেকে প্রায় ২ ^ ২ to এ সম্ভাব্য শিফলড ডেকের সংখ্যা হ্রাস পেয়েছে।

এটি করার পরে আমি বুঝতে পেরেছিলাম যে আমি যদি বাইরের দিকে তাকিয়ে থাকি তবে টোকেনটি কীভাবে অনুমান করা যায় তা আমি জানতাম না যদিও এটি র্যান্ড () এর এমডি 5 ছিল।

ফিডগুলি এমডি 5 ভাঙ্গা বিবেচনা করায় আমি SHA-2 পরিবারে কিছু ব্যবহার করার পরামর্শ দেব । কিছু লোকেরা এমডি 5 হ্যাশগুলি ডিক্রিপ্ট করতে গুগল ব্যবহার করে কারণ এগুলি খুব সাধারণ। কেবল কিছু হ্যাশ করুন তারপর হ্যাশটিকে গুগল অনুসন্ধানে নিক্ষেপ করুন - মূলত গুগল একটি বিশাল রেনবো টেবিলে পরিণত হয়েছে ।


1

এটি বলা সত্যিই আরও সঠিক যে এলোমেলোভাবে উত্পন্ন সংখ্যাটি দেওয়া হলে পরেরটি তুলনামূলকভাবে অনুমানযোগ্য। এটি কেবলমাত্র এতগুলি সংখ্যা হতে পারে। তবে এর অর্থ এই নয় যে আপনি এটি অনুমান করতে পারতেন, আপনি একটি প্রোগ্রাম লিখতে পারতেন যা খুব দ্রুত।


1
আমি মনে করি পরের সংখ্যাটি পুরোপুরি নির্বিচারক। "তুলনামূলক" নয় তবে একেবারে। সিউডো-এলোমেলো সংখ্যা জেনারেটরগুলির সাথে সমস্যাটি হ'ল একটি ক্রমটি পরিসংখ্যান পরীক্ষায় উত্তীর্ণ হবে। দুটি সংলগ্ন সংখ্যার, পুরোপুরি নিরস্ত করা হলেও প্রকৃত এলোমেলো সংখ্যার সাথে পরিসংখ্যানগত বৈশিষ্ট্যগুলি থাকতে পারে।
এস .লট

1
পরের সংখ্যাটি পুরোপুরি নির্বিচারক। সিউডো-র্যান্ডম সংখ্যার জেনারেটরের "সিউডো" এর অর্থ এটি। অন্যদিকে, পরবর্তী সংখ্যাটি অনুশীলনে অর্জন করা পরবর্তী-অসম্ভব বলে নির্ধারণ করার জন্য প্রয়োজনীয় তথ্য।
রেন হেনরিচস

@ এস.লোট - আমি এমন ছাপে ছিলাম যে কোনও সংখ্যা 2 ^ 32 সম্ভাব্য আউটপুটগুলিতে একাধিকবার উপস্থিত হতে পারে এবং প্রতিবার যখন এটি প্রদর্শিত হয় তখন ভিন্ন সংখ্যার পরেও আসতে পারে। তবে এক্স এর বীজ দেওয়া, ওয়াইয়ের ফলাফল ফিরিয়ে দেওয়া, পরবর্তী ফলাফল সর্বদা একই রকম হবে। সুতরাং, বাস্তবে, ওয়াই ফলো করে এমন কয়েকটি মুঠো সংখ্যক থাকতে পারে; আমি যদিও ভুল হতে পারি; আমি সত্যিই পিআরএনজি'র দিকে নজর রেখে অনেক দিন চলেছে।
পিডিআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.