পিএইচপি তে একটি এলোমেলো পাসওয়ার্ড তৈরি করা


190

আমি পিএইচপি তে একটি এলোমেলো পাসওয়ার্ড তৈরি করার চেষ্টা করছি।

তবে আমি সব 'এ' পাচ্ছি এবং রিটার্ন টাইপ টাইপ অ্যারে হ'ল এবং আমি এটি একটি স্ট্রিং হতে চাই। কোডটি কীভাবে সংশোধন করবেন?

ধন্যবাদ।

function randomPassword() {
    $alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
    for ($i = 0; $i < 8; $i++) {
        $n = rand(0, count($alphabet)-1);
        $pass[$i] = $alphabet[$n];
    }
    return $pass;
}

9
উত্তরের কোনওটিই সুরক্ষিত এলোমেলো নম্বর জেনারেটর ব্যবহার করে না , যা আপনি পাসওয়ার্ডের জন্য চান।
স্কট আর্কিসজেউসকি

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

6
@ জেরেমিব্যাঙ্কস কোথাও প্রশ্নের উত্তর নেই যে কোনও ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত পাসওয়ার্ড প্রয়োজন। কিছু লোকের জন্য, উত্তরগুলি ব্যবহার /dev/randomকরা যথেষ্ট কারণ প্রশ্নটি " সুরক্ষিত " পাসওয়ার্ডের জন্য জিজ্ঞাসা করে না (এবং এটির সাথে এটি সম্পাদনা করা উচিত নয় যেহেতু এটি মূল প্রশ্নের অর্থ বদলে দেবে)। যদিও আমি সুরক্ষার জন্য সবাই, আমি মনে করি এই কার্পেট বোমাটি পুরোপুরি চিন্তা করা হয়নি। ব্যবহার করার মতো mysql_*, উত্তরগুলি এখনও বৈধ, তবে এটি অনিরাপদ হিসাবে চিহ্নিত করা উচিত। সম্ভবত এটি এমন কিছু যা এসওকে অতিরিক্ত সফ্টওয়্যার হিসাবে অন্তর্ভুক্ত করা দরকার - অনিরাপদ কোড সম্পর্কে সতর্ক করার ক্ষমতা ?
জিম্বো

6
@ জেরেমি ব্যাংকস আপনি কি এই প্রশ্নের উত্তর পুনরুদ্ধার করতে পারেন? এটি কেবল একটি সদৃশ হওয়ার কারণে এটির উত্তরগুলি ভুল হওয়ার অর্থ নয় (আমি ঘটনাক্রমে পুনরায় খুলতে ভোট দিয়েছি, আমি এটি একটি সদৃশ হিসাবে সম্মত)। উত্তরগুলি মুছে ফেলার কোনও অর্থ নেই, পরিবর্তে এই প্রশ্নটি সরিয়ে নিয়ে অন্য প্রশ্নের উত্তর স্থানান্তরিত করার বিষয়ে বিবেচনা করুন (আমি এটি আগেও দেখেছি)।
নফতালি ওরফে নীল

7
@ জেরেমি ব্যাংকস যদি আপনি কিছু আবার না খোলার চান তবে এটি লক করুন। অন্যথায় 99% লোক এটিকে পুনরায় খুলবে এবং একটি পুরো বিশৃঙ্খলা তৈরি করবে। ব্যক্তিগতভাবে আমি ঠিক তেমন স্কোর করা উত্তরগুলি মুছে ফেলার সাথে সম্পূর্ণই একমত নই, তবে এ নিয়ে আপনাকে লড়াই করতে পারি না
শ্যাডো উইজার্ড ইয়ার ইয়ার ফর ইউ

উত্তর:


258

সুরক্ষা সতর্কতা : rand()কোনও ক্রিপ্টোগ্রাফিক সুরক্ষিত সিউডোর্যান্ডম নম্বর জেনারেটর নয়। পিএইচপি-তে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত সিউডোরান্ডম স্ট্রিং তৈরির জন্য অন্য কোথাও দেখুন ।

এটি ব্যবহার strlenকরে দেখুন ( পরিবর্তে ব্যবহার করুন count, কারণ countস্ট্রিংটিতে সর্বদা থাকে 1):

function randomPassword() {
    $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
    $pass = array(); //remember to declare $pass as an array
    $alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
    for ($i = 0; $i < 8; $i++) {
        $n = rand(0, $alphaLength);
        $pass[] = $alphabet[$n];
    }
    return implode($pass); //turn the array into a string
}

ডেমো: http://codepad.org/UL8k4aYK


24
ব্যবহার করার জন্য আরও সহজ বলে মনে হচ্ছে $pass .= $alphabet[$n]
ম্যাথু

33
জেনারেট পাসওয়ার্ড ব্যবহার রান্ড একটি সত্যিই খারাপ ধারণা। এটি কোনও সুরক্ষিত পিআরএনজি নয়। (এবং mt_rand
কোনওর

19
প্রশ্নটি একটি পাসওয়ার্ড তৈরির বিষয়ে । একটি পাসওয়ার্ড উত্পন্ন করার কোডের স্পষ্টভাবে নিরাপদ র্যান্ডম নম্বর ব্যবহার করা দরকার।
CodeInChaos

10
একই কারণে এই জন্য না সদৃশ প্রশ্ন, এই উত্তর যেহেতু প্রশ্ন সম্বন্ধে তা ভুল একটি পাসওয়ার্ড জেনারেট করার এবং না একটি র্যান্ডম স্ট্রিং । এই উত্তরটি একটি পাসওয়ার্ড তৈরির ক্ষেত্রে মারাত্মকভাবে সুরক্ষিত পদ্ধতি সরবরাহ করে। দয়া করে নীচে @ ব্যবহারকারীর 3260409 এর উত্তরটি ব্যবহার করুন, যেখানে এর openssl_random_pseudo_bytes()পরিবর্তে ব্যবহৃত হয়rand()
দুঃখিত-ইম-এ-এন00 বি

35
আমি আপনার সুরক্ষিত কোডটি উত্পাদনে দেখেছি এবং উত্সটিতে এটি বন্ধ করতে চাই। আপনি দরকার পাসওয়ার্ডের জন্য ক্রিপ্টোগ্রাফি নিরাপদ যদৃচ্ছতা।
স্কট আর্কিসজেউস্কি

120

টি এল; ডিআর:

ব্যাখ্যা:

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

কোনও সিএসপিআরএনজির প্রয়োজনীয়তা এলোমেলো স্ট্রিংয়ের সাধারণ ক্ষেত্রে স্বাচ্ছন্দ্য দেওয়া যেতে পারে, তবে যখন সুরক্ষা জড়িত থাকে তখন তা নয়।

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

বিকাশকারীগণ যারা আপনার নিজের সমাধান আবিষ্কার করতে পছন্দ করেন তাদের random_int()জন্য পিএইচপি 7.0.0 এই উদ্দেশ্যে সরবরাহ করবে। আপনি যদি এখনও পিএইচপি 5.x এ থাকেন তবে আমরা একটি পিএইচপি 5 পলিফিলrandom_int() লিখেছিলাম যাতে আপনি পিএইচপি 7 প্রকাশের আগে নতুন API ব্যবহার করতে পারেন। আমাদের random_int()পলিফিল ব্যবহার সম্ভবত আপনার নিজের প্রয়োগটি লেখার চেয়ে নিরাপদ।

হাতে একটি সুরক্ষিত র্যান্ডম পূর্ণসংখ্যার জেনারেটর সহ, নিরাপদ এলোমেলো স্ট্রিং উত্পাদন করা পাইয়ের চেয়ে সহজ:

<?php
/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 * 
 * For PHP 7, random_int is a PHP core function
 * For PHP 5.x, depends on https://github.com/paragonie/random_compat
 * 
 * @param int $length      How many characters do we want?
 * @param string $keyspace A string of all possible characters
 *                         to select from
 * @return string
 */
function random_str(
    $length,
    $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
) {
    $str = '';
    $max = mb_strlen($keyspace, '8bit') - 1;
    if ($max < 1) {
        throw new Exception('$keyspace must be at least two characters long');
    }
    for ($i = 0; $i < $length; ++$i) {
        $str .= $keyspace[random_int(0, $max)];
    }
    return $str;
}

2
র‌্যান্ডমলিব এখন দু'বছরের বেশি আপডেট হয়নি। সাম্প্রতিক পিএইচপি বিল্ডে এটি ব্যবহার করা (আমার ক্ষেত্রে .1.১.২৫) বিভিন্ন mcrypt_*ফাংশনের জন্য অবমূল্যায়নের সতর্কতা নিক্ষেপ করে। আমি একটি ইস্যু থ্রেডে দেখতে পাচ্ছি যে আপনি @ircmaxell ধরে রাখতে না পারার কারণে গ্রন্থাগারটি কাঁটাচামচ করেছেন তবে আপনার কাঁটাচাটি ট্র্যাভিসে 'বিল্ড ব্যর্থ' বলে ' আপনি কি এই উত্তরটি আপডেট করবেন (যা এখনও গুগলে বেশ উঁচুতে দেখায়)?
জানুস বাহস জ্যাকেট

1
ভালো বল ধরা! এটি অপসারণ করা প্রয়োজন।
স্কট আর্কিসজেউসকি

113

আমি জানি আপনি একটি নির্দিষ্ট উপায়ে আপনার পাসওয়ার্ড তৈরি করার চেষ্টা করছেন তবে আপনি এই পদ্ধতিটিও দেখতে চাইবেন ...

$bytes = openssl_random_pseudo_bytes(2);

$pwd = bin2hex($bytes);

এটি পিএইচপিএন সাইট থেকে নেওয়া হয়েছে এবং এটি একটি স্ট্রিং তৈরি করে যা আপনি ওপেনএসএল_আরন্ডম_সেসডো_বাইটেস ফাংশনে যে সংখ্যাটি রেখেছেন তার দ্বিগুণ। সুতরাং উপরেরটি 4 টি অক্ষর দীর্ঘ লম্বা একটি পাসওয়ার্ড তৈরি করবে।

সংক্ষেপে...

$pwd = bin2hex(openssl_random_pseudo_bytes(4));

8 টি অক্ষর দীর্ঘ একটি পাসওয়ার্ড তৈরি করবে।

তবে নোট করুন যে পাসওয়ার্ডটিতে কেবল 0-9 নম্বর এবং ছোট ক্যাপ অক্ষর রয়েছে!


13
আপনি যদি বড় হাতের অক্ষর, ছোট হাতের সংখ্যা এবং সংখ্যার পাসওয়ার্ড চান তবে এটি ব্যবহার করে দেখুন: gist.github.com/zyphlar/7217f566fc83a9633959
উইলব্রেডলি

@ زياد কে বলে? যদি জেনারেটরটি 7-বিট বাইট ব্যবহার করে থাকে তবে আমি আপনার সাথে একমত হব, তবে openssl_random_pseudo_bytes()এটি একটি শক্তিশালী পূর্ণ বাইনারি বাইট র্যান্ডমনেস জেনারেটর এবং এর পরে আর কোনও বদলানো দরকার নেই। এছাড়াও আমি এটি উল্লেখ করার সুযোগ নেব যে একাধিক এনক্রিপশন পদ্ধতির স্ট্যাকিং ধরে নেওয়া বিপজ্জনক যে কোনও কিছু এলোমেলো করে তুলবে, কিছু ক্ষেত্রে এটি হ্যাশিং সংঘর্ষগুলি জড়ো করার কারণে এটি ঠিক বিপরীত হতে পারে।
হ্যাভার্ড 19 ই

56

2 লাইন সহ ক্ষুদ্র কোড

ডেমো: http://codepad.org/5rHMHwnH

function rand_string( $length ) {

    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    return substr(str_shuffle($chars),0,$length);

}

echo rand_string(8);

র্যান্ড_স্ট্রিংয়ের সাহায্যে আপনি নির্ধারণ করতে পারবেন কত অক্ষর তৈরি হবে।


21
দুর্দান্ত, যদিও আপনি এই পদ্ধতির ব্যবহার করে কোনও পুনরাবৃত্তি অক্ষর পাবেন না, যা অনাকাঙ্ক্ষিত হতে পারে।
হাবো

11
এই ফাংশনটি দীর্ঘ পাসওয়ার্ড তৈরির জন্য ভয়ঙ্কর। প্রথমত, যদি $ দৈর্ঘ্য rs অক্ষরের স্ট্রিংয়ের চেয়ে দীর্ঘ হয় তবে আপনি যতক্ষণ ইনপুট দেবেন ততক্ষণ আপনি স্ট্রিং পাবেন না, তবে অক্ষরের স্ট্রিংয়ের দৈর্ঘ্য। এছাড়াও, কোনও ডুপ্লিকেট ছাড়াই আপনার প্রতিটি অক্ষরের 1 টির গ্যারান্টি রয়েছে। এটি মূলধনপত্র বা এমন একটি সংখ্যার ব্যবহারের গ্যারান্টি দেয় না যা প্রায়শই প্রয়োজন হয় (পূর্ববর্তী ত্রুটির কারণে যদি আপনার দৈর্ঘ্য 26 এর বেশি হয় তবে)
প্রোগ্রামারস্টার

এই @ প্রোগ্রামার এবং @ হবো সম্পর্কে কী? substr(str_shuffle(str_repeat($chars,$length)),0,$length);
চার্লস-Edouard অনুরোধকে

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

আমি সম্মতি জ্ঞাপন করি. এর লাইনের সংখ্যায় একটি অ্যালগরিদম না বেছে নেওয়া ভাল। যাইহোক, যদি মূল লক্ষ্যটি কোনও ওয়েবসাইটে কোনও নতুন ব্যবহারকারী তৈরি করার সময় অস্থায়ী পাসওয়ার্ড তৈরি করা হয় তবে এটি প্রয়োজনীয়তাগুলি পূরণ করবে, আমার ধারণা।
চার্লস-Edouard অনুরোধকে

40

আপনি পিএইচপি 7 এ থাকলে আপনি এই random_int()ফাংশনটি ব্যবহার করতে পারেন :

function generate_password($length = 20){
  $chars =  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.
            '0123456789`-=~!@#$%^&*()_+,./<>?;:[]{}\|';

  $str = '';
  $max = strlen($chars) - 1;

  for ($i=0; $i < $length; $i++)
    $str .= $chars[random_int(0, $max)];

  return $str;
}

পুরানো উত্তর নীচে:

function generate_password($length = 20){
  $chars =  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.
            '0123456789`-=~!@#$%^&*()_+,./<>?;:[]{}\|';

  $str = '';
  $max = strlen($chars) - 1;

  for ($i=0; $i < $length; $i++)
    $str .= $chars[mt_rand(0, $max)];

  return $str;
}

12
mt_randএকটি পাসওয়ার্ড তৈরি করতে ব্যবহার করবেন না ।
CodeInChaos

2
@ কোডস ইনচোস এটি র্যান্ড () এর চেয়ে ভাল যা উপরের উদাহরণটি ব্যবহার করে। openssl_random_pseudo_bytes () পিএইচপি ম্যানুয়াল অনুযায়ী পছন্দ করা হয়।
উইলব্রেডলি

4
@ উইলব্রাডলি বীজের গুণগতমানের জন্য ঠিক তত খারাপ mt_rand, তাই এটি কোনও সুরক্ষা ব্যবহারের জন্য এখনও অনুপযুক্ত।
কোডসইনচওস

2
আপনি দেখতে পান এটিই আমাকে + কেওসআইনকোডগুলিকে বিরক্ত করে। আপনি প্রশ্নটির দিকে তাকাননি, আপনি সবেমাত্র কিছু জেনেরিক বক্তব্য দিয়েছেন যা খারাপভাবে বিশ্বাসের বোঝা পুনরাবৃত্তি করেছে। সংক্ষেপে: সম্পূর্ণ ভিন্ন প্রশ্নের জন্য ডান দিকের পরামর্শ। এলোমেলো পাসওয়ার্ড ঠিক আছে। তারা সম্ভবত "এক্স" ব্যবহার করে। বেশ সততার সাথে যদি আপনি সময় নির্ধারিত লকআউট এবং ডস সনাক্তকরণ ব্যতীত আপনার সিস্টেমটি ডিজাইন করেন এবং "x এর পরে চেষ্টা করে -> লক করা" থাকে তবে আপনি এটি ভুল করছেন। এই জাতীয় পদক্ষেপের স্থানে mt_rand পাসওয়ার্ড অনুমান করা অসম্ভব। বিপরীতে mt_rand ব্যবহার করা কোনও পাসওয়ার্ড জোর করে EASIER তৈরি করে না। এটা ঠিক হবে না।
মিঃ হিলিস

1
আমি \ ইন ব্যবহার করব না$chars
CONvid19

36

এক লাইনে:

substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') , 0 , 10 )

11
এটি একই অক্ষরগুলির পুনরায় ব্যবহারকে বাধা দেয় কারণ এগুলি কেবল চারদিকে বদলে যায় তবে একাধিকবার ঘটে না।
নিকডনক

8
বলা বাহুল্য, লাইন গণনার উপর ভিত্তি করে কেউই তাদের পাসওয়ার্ড উত্পন্নকরণের কার্যটি অনুকূল করা উচিত নয় be এমনকি এটি ব্যবহৃত আরএনজি সুরক্ষিত থাকলেও (এটি নয়), 10-অক্ষরের পাসওয়ার্ড তৈরি করার সময় পুনরাবৃত্তি করা অক্ষরগুলি এড়ানো আপনাকে 52 ডলার এনট্রপির বিট থেকে কমিয়ে ent 50 বিট এন্ট্রপি (ক্র্যাক করার জন্য 4x ডলার দ্রুত) এনে দেয়। যদি আপনি এটি 20 টি অক্ষরে প্রসারিত করেন তবে অ-পুনরাবৃত্তি আপনাকে 103 বিট থেকে from 94 বিট (ক্র্যাক করার জন্য 512x ডলার দ্রুত) এনে দেবে।
জেরেমি ব্যাংকগুলি

1
এই পদ্ধতিটি এনিগমা কোড লোল
نفرتফ

4
substr(str_shuffle(str_repeat($chars,$length)),0,$length); এনট্রপি পুনরুদ্ধার
চার্লস-Edouard অনুরোধকে

27

আপনার সেরা বেটটি আর্কমেক্সেলের র‌্যান্ডমলিব লাইব্রেরি

ব্যবহারের উদাহরণ:

$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new SecurityLib\Strength(SecurityLib\Strength::MEDIUM));

$passwordLength = 8; // Or more
$randomPassword = $generator->generateString($passwordLength);

এটি এমন স্ট্রিং তৈরি করে যা সাধারণ এলোমেলো কার্যকারণের চেয়ে বেশি শক্তিশালী এলোমেলো shuffle()এবং rand()(যা আপনি সাধারণত পাসওয়ার্ড, লবণের এবং কীগুলির মতো সংবেদনশীল তথ্যের জন্য চান)।


4
এটা সঠিক উত্তর. ব্যবহার করবেন না rand()বা mt_rand()
স্কট আর্কিসজেউস্কি

1
এটি সর্বাধিক সুরক্ষিত উত্তর হতে পারে (এটির সাথে কীভাবে তুলনা করা যায় তা নিশ্চিত নয় random_bytes) তবে randউত্তরগুলি ভুল করে না ।
সারবিরাস


8
@ সার্ব্রাস: অবশ্যই এই উত্তরটি rand()ভুল ব্যবহার করে উত্তর দেয় না । তারা নিজেরাই সব ভুল!
অনুদানকারক

14

আপনি চান strlen($alphabet), countধ্রুবকের alphabet(সমতুল্য নয় 'alphabet')।

তবে randএই উদ্দেশ্যে কোনও উপযুক্ত এলোমেলো কাজ নয় function বর্তমান সময়ের সাথে নিখুঁতভাবে বীজবদ্ধ হওয়ায় এর আউটপুট সহজেই অনুমান করা যায়। অতিরিক্তভাবে, randক্রিপ্টোগ্রাফিকভাবে নিরাপদ নয়; সুতরাং আউটপুট থেকে তার অভ্যন্তরীণ অবস্থা নির্ধারণ করা তুলনামূলকভাবে সহজ।

পরিবর্তে, /dev/urandomক্রিপ্টোগ্রাফিকভাবে এলোমেলো ডেটা পেতে থেকে পড়ুন ।


14

আমি একটি উত্তর পোস্ট করতে যাচ্ছি কারণ বিদ্যমান কয়েকটি উত্তর নিকটে থাকলেও এর একটি রয়েছে:

  • আপনার চেয়ে ছোট চরিত্রের স্থান যাতে ব্রুট-জোর করা সহজ হয় বা একই এনট্রপির জন্য পাসওয়ার্ডটি দীর্ঘতর হতে হবে
  • একটি আরএনজি যা ক্রিপ্টোগ্রাফিকভাবে নিরাপদ হিসাবে বিবেচিত হয় না
  • কিছু তৃতীয় পক্ষের লাইব্রেরির জন্য প্রয়োজনীয়তা এবং আমি ভেবেছিলাম যে এটি নিজে করতে এটি কী গ্রহণ করতে পারে তা দেখানো আকর্ষণীয় হতে পারে

এই উত্তরটি উত্সাহিত count/strlenপাসওয়ার্ডের সুরক্ষা হিসাবে অন্তত আইএমএইচওর বিষয়টি প্রচ্ছন্ন করবে আপনি সেখানে কীভাবে যাচ্ছেন তা ছাড়িয়ে দেয়। আমি পিএইচপি> 5.3.0 ধরেও চলেছি।

আসুন সমস্যাটি উপাদানগুলির মধ্যে ভাগ করুন যা হ'ল:

  1. এলোমেলো ডেটা পেতে এলোমেলোতার কিছু নিরাপদ উত্স ব্যবহার করুন
  2. সেই ডেটা ব্যবহার করুন এবং কিছু মুদ্রণযোগ্য স্ট্রিং হিসাবে উপস্থাপন করুন

প্রথম অংশের জন্য, পিএইচপি> 5.3.0 ফাংশন সরবরাহ করে openssl_random_pseudo_bytes। মনে রাখবেন যে বেশিরভাগ সিস্টেমগুলি ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী অ্যালগরিদম ব্যবহার করে, আপনাকে পরীক্ষা করতে হবে যাতে আমরা একটি মোড়ক ব্যবহার করব:

/**
 * @param int $length
 */
function strong_random_bytes($length)
{
    $strong = false; // Flag for whether a strong algorithm was used
    $bytes = openssl_random_pseudo_bytes($length, $strong);

    if ( ! $strong)
    {
        // System did not use a cryptographically strong algorithm 
        throw new Exception('Strong algorithm not available for PRNG.');
    }        

    return $bytes;
}

দ্বিতীয় অংশের জন্য, আমরা base64_encodeএটি ব্যবহার করব যেহেতু এটি একটি বাইট স্ট্রিং নেয় এবং এমন একটি ধারাবাহিক অক্ষর তৈরি করবে যেটির বর্ণমালা রয়েছে মূল প্রশ্নের সাথে বর্ণিত বর্ণের খুব কাছাকাছি। আমরা থাকার কিছু মনে যদি না +, /এবং =অক্ষর চূড়ান্ত স্ট্রিং মধ্যে প্রদর্শিত এবং আমরা অন্তত ফলে চান $nঅক্ষর দীর্ঘ, কেবলমাত্র আমরা ব্যবহার করতে পারে:

base64_encode(strong_random_bytes(intval(ceil($n * 3 / 4))));

3/4ফ্যাক্টর যে একটি স্ট্রিং দৈর্ঘ্য কমপক্ষে এক তৃতীয়াংশ বাইট স্ট্রিং চেয়ে বড় যে ফলাফল এনকোডিং করুন Base64- জন্য হয়েছে। ফলাফলটি $n4 এর একাধিক এবং অন্যথায় 3 টি অক্ষরের বেশি হওয়ার জন্য সঠিক হবে । যেহেতু অতিরিক্ত অক্ষরগুলি প্রধানত প্যাডিং চরিত্র =, তাই যদি আমাদের কোনও কারণে যদি পাসওয়ার্ডের সঠিক দৈর্ঘ্য হওয়ার সীমাবদ্ধতা থাকে, তবে আমরা এটি আমাদের যে দৈর্ঘ্যে চাই সেটিকে ছেঁটে ফেলতে পারি। এটি বিশেষত কারণ একটি প্রদত্তর জন্য $n, সমস্ত পাসওয়ার্ডগুলি একই সংখ্যার সাথে শেষ হবে, যাতে কোনও আক্রমণকারী যার ফলাফল পাসওয়ার্ডে অ্যাক্সেস ছিল, অনুমান করার জন্য 2 টি কম অক্ষর থাকবে।


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

ফলাফলের অতিরিক্ত অক্ষরের জন্য, আমরা কেবল তাদের ফলাফলের স্ট্রিং থেকে বাদ দিতে পারি। যদি আমরা আমাদের বাইট-স্ট্রিংয়ে 8 বাইট দিয়ে শুরু করি, তবে প্রায় 25% বেস 64 অক্ষরগুলি এই "অনাকাঙ্ক্ষিত" অক্ষর হতে পারে, যাতে এই অক্ষরগুলি কেবল একটি স্ট্রিংয়ের ফলস্বরূপ অপ্রত্যাশিত চেয়ে অপেক্ষাকৃত ছোট হয় না। তারপরে সঠিক দৈর্ঘ্যে নামার জন্য আমরা কেবল এটি ছাঁটাই করতে পারি:

$dirty_pass = base64_encode(strong_random_bytes(8)));
$pass = substr(str_replace(['/', '+', '='], ['', '', ''], $dirty_pass, 0, 8);

যদি আপনি লম্বা পাসওয়ার্ড তৈরি করেন তবে প্যাডিং চরিত্রটি =মধ্যবর্তী ফলাফলের একটি ছোট এবং ছোট অনুপাত গঠন করে যাতে PRNG এর জন্য ব্যবহৃত এন্ট্রপি পুলটি নিষ্কাশন করা যদি উদ্বেগের বিষয় হয় তবে আপনি কোনও ঝুঁকির পদ্ধতির প্রয়োগ করতে পারেন।


1
এই সংযোজনের জন্য ধন্যবাদ। বিদ্যমান উত্তরের কোনওটিই উল্লেখ করেনি যে openssl_random_pseudo_bytesএটি একটি দুর্বল ফলাফল হতে পারে। আমি বুঝতে পারি না যে ঘটনাটি ছিল।
জেরেমি ব্যাঙ্কস

12

base_convert(uniqid('pass', true), 10, 36);

যেমন। e0m6ngefmj4

সম্পাদনা

যেমন আমি মন্তব্যগুলিতে উল্লেখ করেছি, দৈর্ঘ্যের অর্থ হ'ল ব্রুট ফোর্স আক্রমণগুলি তার বিরুদ্ধে সময়োপযোগী আক্রমণগুলির বিরুদ্ধে আরও ভাল কাজ করবে তাই "এলোমেলো জেনারেটর কতটা নিরাপদ ছিল" তা নিয়ে চিন্তিত হওয়ার বিষয়টি আসলেই প্রাসঙ্গিক নয়। সুরক্ষা, বিশেষত এই ব্যবহারের ক্ষেত্রে, ব্যবহারের পরিপূরক করা প্রয়োজন যাতে উপরের সমাধানটি প্রয়োজনীয় সমস্যার জন্য আসলে যথেষ্ট ভাল।

তবে, সুরক্ষিত এলোমেলো স্ট্রিং জেনারেটর (যেমন আমি ধারণা করি কিছু লোক প্রতিক্রিয়ার উপর ভিত্তি করে ধরেছি) সন্ধান করার সময় আপনি যদি এই উত্তরটি হোঁচট খেয়েছেন তবে টোকেন তৈরির মতো কোনও কিছুর জন্য এখানে এই জাতীয় কোডের জেনারেটর দেখতে কেমন হবে তা এখানে:

function base64urlEncode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function secureId($length = 32) {

    if (function_exists('openssl_random_pseudo_bytes')) {
        $bytes = openssl_random_pseudo_bytes($length);
        return rtrim(strtr(base64_encode($bytes), '+/', '0a'), '=');
    }
    else { // fallback to system bytes

        error_log("Missing support for openssl_random_pseudo_bytes");

        $pr_bits = '';

        $fp = @fopen('/dev/urandom', 'rb');
        if ($fp !== false) {
            $pr_bits .= @fread($fp, $length);
            @fclose($fp);
        }

        if (strlen($pr_bits) < $length) {
            error_log('unable to read /dev/urandom');
            throw new \Exception('unable to read /dev/urandom');
        }

        return base64urlEncode($pr_bits);
    }
}

1
পিএস - এটি পিএইচপি - গ্লোবাল নেমস্পেসটি বোঝাতে কেবল \ ব্যবহার করে।
বব গ্রেগোর

ইউনিকিড বাদে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত নয়। পরিবর্তে র‌্যান্ড () ব্যবহার করুন: বেস_কনভার্ট (র্যান্ড (78364164096, 2821109907455), 10, 36);
বেনুবার্ড

7
পিএইচপি ম্যানুয়াল অনুসারে @ বেনুবার্ড র‌্যান্ড () ক্রিপ্টোগ্রাফিকভাবেও নিরাপদ নয়। ম্যানুয়ালটি পরিবর্তে ওপেনএসএল_আরন্ডম_পিউডো_বাইটেস () পরামর্শ দেয়।
উইলব্রেডলি

বেশিরভাগ ব্যবহারের ক্ষেত্রে, বিশেষত যেখানে আক্রমণকারীটির সঠিক সময়ে অ্যাক্সেস থাকে না, এটি পুরোপুরি ঠিক আছে এবং একটি সুন্দর কম-বেশি বা কম মানুষের বন্ধুত্বপূর্ণ "অস্থায়ী" পাসওয়ার্ড তৈরি করে। যদি আমরা এটিকে চূড়ান্ত স্থানে নিয়ে যাই তবে এখানে সমস্যাটি আরও বেশি ঝামেলা হয় তবে এলোমেলো সংখ্যা তৈরি করতে কোন ফাংশনটি ব্যবহৃত হত।
srcspider

আগ্রহীদের জন্য সম্পূর্ণ সুরক্ষিত স্ট্রিং উত্পাদন করার জন্য আমি একটি উদাহরণ যুক্ত করেছি; তবে ব্যবহারকারীদের জন্য অস্থায়ী পাসওয়ার্ড তৈরি করার সময় এটি ব্যবহার করার পরামর্শ দিচ্ছেন না। এমনকি সুরক্ষিত সংস্করণ ব্যবহার করেও দৈর্ঘ্যের সমস্যাটি এখনও প্রযোজ্য।
srcspider

9

অন্য একটি (কেবল লিনাক্স)

function randompassword()
{
    $fp = fopen ("/dev/urandom", 'r');
    if (!$fp) { die ("Can't access /dev/urandom to get random data. Aborting."); }
    $random = fread ($fp, 1024); # 1024 bytes should be enough
    fclose ($fp);
    return trim (base64_encode ( md5 ($random, true)), "=");
}

1
এন্ট্রপির একটি 128-বিট ক্রিপ্টোগ্রাফিক হ্যাশকে সংকুচিত করতে 1024 বাইট পড়া কিছুটা ব্যর্থ। এছাড়াও, fread()ডিফল্টরূপে 8192 বাইটে বাফারগুলি দেওয়া হয়, তাই আপনি সর্বদা /dev/urandomপ্রদত্ত কোডটি সহ অনেকগুলি পড়তে যাচ্ছেন । এটি উইন্ডোতেও কাজ করবে না। যদিও একটি সিএসপিআরএনজি ব্যবহারের জন্য কুডোস।
স্কট আর্কিসজেউসকি


7

মধ্য-শক্তিশালী পাসওয়ার্ড 12 দৈর্ঘ্যের উত্পন্ন করার জন্য এই সাধারণ কোডটি ব্যবহার করুন

$password_string = '!@#$%*&abcdefghijklmnpqrstuwxyzABCDEFGHJKLMNPQRSTUWXYZ23456789';
$password = substr(str_shuffle($password_string), 0, 12);

এটি আসলে (খুব?) ভুল। এটি প্রকৃতপক্ষে বর্ণমালা থেকে প্রতিটি চর শুধুমাত্র একবার ব্যবহার করে, ফলে সমস্ত সম্ভাব্য মানের (ক্র্যাকিংয়ের সাথে প্রাসঙ্গিক) গুরুতর স্থান সঙ্কুচিত হয়।
রডোস্লাভ বোডো

6

বড় হাতের অক্ষর, ছোট অক্ষর, সংখ্যা (গুলি) এবং বিশেষ অক্ষর দিয়ে এটি ব্যবহার করে দেখুন

function generatePassword($_len) {

    $_alphaSmall = 'abcdefghijklmnopqrstuvwxyz';            // small letters
    $_alphaCaps  = strtoupper($_alphaSmall);                // CAPITAL LETTERS
    $_numerics   = '1234567890';                            // numerics
    $_specialChars = '`~!@#$%^&*()-_=+]}[{;:,<.>/?\'"\|';   // Special Characters

    $_container = $_alphaSmall.$_alphaCaps.$_numerics.$_specialChars;   // Contains all characters
    $password = '';         // will contain the desired pass

    for($i = 0; $i < $_len; $i++) {                                 // Loop till the length mentioned
        $_rand = rand(0, strlen($_container) - 1);                  // Get Randomized Length
        $password .= substr($_container, $_rand, 1);                // returns part of the string [ high tensile strength ;) ] 
    }

    return $password;       // Returns the generated Pass
}

ধরা যাক আমাদের 10 ডিজিট পাস দরকার

echo generatePassword(10);  

উদাহরণ আউটপুট (গুলি):

, IZCQ_IV \ 7

@wlqsfhT (ঘ

1 8 + 1 টি \ 4 @ উদ


randফাংশন আসলে ক্রিপ্টোগ্রাফি নিরাপদ নয় তাই এটি বেশ ঝুঁকি হতে পারে এটি ব্যবহার একটি পাসওয়ার্ড জেনারেট করতে
jeteon

3

দ্রুত আপনি যদি চান তা যদি সহজ, পরিষ্কার এবং সামঞ্জস্যপূর্ণ ফর্ম্যাট

$pw = chr(mt_rand(97,122)).mt_rand(0,9).chr(mt_rand(97,122)).mt_rand(10,99).chr(mt_rand(97,122)).mt_rand(100,999);

3

এটি এই পৃষ্ঠায় অন্য একটি উত্তরের ভিত্তিতে, https://stackoverflow.com/a/21498316/525649

এই উত্তরটি হেক্স অক্ষর উত্পন্ন করে 0-9,a-f,। হেক্সের মতো দেখতে লাগে না এমন কিছুর জন্য এটি ব্যবহার করে দেখুন:

str_shuffle(
  rtrim(
    base64_encode(bin2hex(openssl_random_pseudo_bytes(5))),
    '='
  ). 
  strtoupper(bin2hex(openssl_random_pseudo_bytes(7))).
  bin2hex(openssl_random_pseudo_bytes(13))
)
  • base64_encode বর্ণমালার অক্ষরের বিস্তৃতি ছড়িয়ে দেয়
  • rtrim=শেষে কখনও কখনও অপসারণ

উদাহরণ:

  • 32eFVfGDg891Be5e7293e54z1D23110M3ZU3FMjb30Z9a740Ej0jz4
  • b280R72b48eOm77a25YCj093DE5d9549Gc73Jg8TdD9Z0Nj4b98760
  • 051b33654C0Eg201cfW0e6NA4b9614ze8D2FN49E12Y0zY557aUCb8
  • y67Q86ffd83G0z00M0Z152f7O2ADcY313gD7a774fc5FF069zdb5b7

এটি ব্যবহারকারীদের জন্য একটি ইন্টারফেস তৈরি করার জন্য খুব কনফিগারযোগ্য নয়, তবে কিছু উদ্দেশ্যে যা ঠিক আছে। বিশেষ অক্ষরের অভাবের জন্য অ্যাকাউন্টে অক্ষরের সংখ্যা বৃদ্ধি করুন।


3
  1. এটিতে এই কোড সহ একটি ফাইল তৈরি করুন।
  2. মন্তব্য মত এটি কল করুন।

    <?php 
    
    /**
    * @usage  :
    *       include_once($path . '/Password.php');
    *       $Password = new Password;
    *       $pwd = $Password->createPassword(10);
    *       return $pwd;
    * 
    */
    
    class Password {
    
        public function createPassword($length = 15) {
            $response = [];
            $response['pwd'] = $this->generate($length);
            $response['hashPwd'] = $this->hashPwd( $response['pwd'] );
            return $response;
        }
    
        private function generate($length = 15) {
            $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*(){}/?,><";
            return substr(str_shuffle($chars),0,$length);
        }
    
        private function hashPwd($pwd) {
            return hash('sha256', $pwd);
        }
    
    }
    
    ?>

2

আমি আরও ব্যাপক এবং সুরক্ষিত পাসওয়ার্ড স্ক্রিপ্ট তৈরি করেছি। এটি দুটি বড় হাতের অক্ষর, দুটি ছোট হাতের অক্ষর, দুটি সংখ্যা এবং দুটি বিশেষ অক্ষরের সংমিশ্রণ তৈরি করবে। মোট 8 টি অক্ষর।

$char = [range('A','Z'),range('a','z'),range(0,9),['*','%','$','#','@','!','+','?','.']];
$pw = '';
for($a = 0; $a < count($char); $a++)
{
    $randomkeys = array_rand($char[$a], 2);
    $pw .= $char[$a][$randomkeys[0]].$char[$a][$randomkeys[1]];
}
$userPassword = str_shuffle($pw);

1
//define a function. It is only 3 lines!   
function generateRandomPassword($length = 5){
    $chars = "0123456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ";
    return substr(str_shuffle($chars),0,$length);
}

//usage
echo generateRandomPassword(5); //random password legth: 5
echo generateRandomPassword(6); //random password legth: 6
echo generateRandomPassword(7); //random password legth: 7

এটি আসলে (খুব?) ভুল। এটি প্রকৃতপক্ষে বর্ণমালা থেকে প্রতিটি চর শুধুমাত্র একবার ব্যবহার করে, ফলে সমস্ত সম্ভাব্য মানের (ক্র্যাকিংয়ের সাথে প্রাসঙ্গিক) গুরুতর স্থান সঙ্কুচিত হয়।
রেডোস্লাভ বোডো

0

কমপক্ষে একটি ছোট হাতের অক্ষর, একটি বড় হাতের অক্ষর, একটি ডিজিট এবং একটি বিশেষ অক্ষর সমন্বিত 8 দৈর্ঘ্যের একটি শক্তিশালী পাসওয়ার্ড তৈরি করে। আপনি কোডটিতেও দৈর্ঘ্য পরিবর্তন করতে পারেন।

function checkForCharacterCondition($string) {
    return (bool) preg_match('/(?=.*([A-Z]))(?=.*([a-z]))(?=.*([0-9]))(?=.*([~`\!@#\$%\^&\*\(\)_\{\}\[\]]))/', $string);
}

$j = 1;

function generate_pass() {
    global $j;
    $allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_{}[]';
    $pass = '';
    $length = 8;
    $max = mb_strlen($allowedCharacters, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pass .= $allowedCharacters[random_int(0, $max)];
    }

    if (checkForCharacterCondition($pass)){
        return '<br><strong>Selected password: </strong>'.$pass;
    }else{
        echo 'Iteration '.$j.':  <strong>'.$pass.'</strong>  Rejected<br>';
        $j++;
        return generate_pass();
    }

}

echo generate_pass();

0

এই ফাংশনটি প্যারামিটারগুলিতে নিয়মের ভিত্তিতে একটি পাসওয়ার্ড তৈরি করবে

function random_password( $length = 8, $characters = true, $numbers = true, $case_sensitive = true, $hash = true ) {

    $password = '';

    if($characters)
    {
        $charLength = $length;
        if($numbers) $charLength-=2;
        if($case_sensitive) $charLength-=2;
        if($hash) $charLength-=2;
        $chars = "abcdefghijklmnopqrstuvwxyz";
        $password.= substr( str_shuffle( $chars ), 0, $charLength );
    }

    if($numbers)
    {
        $numbersLength = $length;
        if($characters) $numbersLength-=2;
        if($case_sensitive) $numbersLength-=2;
        if($hash) $numbersLength-=2;
        $chars = "0123456789";
        $password.= substr( str_shuffle( $chars ), 0, $numbersLength );
    }

    if($case_sensitive)
    {
        $UpperCaseLength = $length;
        if($characters) $UpperCaseLength-=2;
        if($numbers) $UpperCaseLength-=2;
        if($hash) $UpperCaseLength-=2;
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        $password.= substr( str_shuffle( $chars ), 0, $UpperCaseLength );
    }

    if($hash)
    {
        $hashLength = $length;
        if($characters) $hashLength-=2;
        if($numbers) $hashLength-=2;
        if($case_sensitive) $hashLength-=2;
        $chars = "!@#$%^&*()_-=+;:,.?";
        $password.= substr( str_shuffle( $chars ), 0, $hashLength );
    }

    $password = str_shuffle( $password );
    return $password;
}

0

এলোমেলো প্লেইন পাসওয়ার্ড জেনারেশন সহায়তায় আমার নেওয়া এখানে।

এটি নিশ্চিত করে যে পাসওয়ার্ডের নম্বর, উচ্চ এবং ছোট ছোট অক্ষর পাশাপাশি সর্বনিম্ন 3 টি বিশেষ অক্ষর রয়েছে।

পাসওয়ার্ডের দৈর্ঘ্য 11 থেকে 30 এর মধ্যে হবে।

function plainPassword(): string
{
    $numbers = array_rand(range(0, 9), rand(3, 9));
    $uppercase = array_rand(array_flip(range('A', 'Z')), rand(2, 8));
    $lowercase = array_rand(array_flip(range('a', 'z')), rand(3, 8));
    $special = array_rand(array_flip(['@', '#', '$', '!', '%', '*', '?', '&']), rand(3, 5));

    $password = array_merge(
        $numbers,
        $uppercase,
        $lowercase,
        $special
    );

    shuffle($password);

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