আপনি পিএইচপি-তে পাসওয়ার্ডগুলি হ্যাশ করার জন্য কীভাবে বিসিক্রিপ ব্যবহার করবেন?


1255

আমি এখনই "পিএইচপি, পাসওয়ার্ড বিসক্রিপশন বিধিগুলিতে পাসওয়ার্ড সংরক্ষণের জন্য বিসিক্রিপটি ব্যবহার করুন" পরামর্শটি শুনি।

তবে কী bcrypt? পিএইচপি কোনও ফাইল-এনক্রিপশন ইউটিলিটি এবং উইকিপিডিয়া সম্পর্কিত কোনও কার্যকারিতা দেয় না, ওয়েব অনুসন্ধানগুলি বিভিন্ন ভাষায় ব্লোফিশের কয়েকটি বাস্তবায়ন প্রকাশ করে। এখন ব্লোফিশ পিএইচপি-র মাধ্যমেও পাওয়া যায় mcryptতবে পাসওয়ার্ডগুলি সংরক্ষণ করার ক্ষেত্রে কীভাবে এটি সহায়তা করে? ব্লোফিশ একটি সাধারণ উদ্দেশ্য সাইফার, এটি দুটি উপায়ে কাজ করে। যদি এটি এনক্রিপ্ট করা যায় তবে এটি ডিক্রিপ্ট করা যেতে পারে। পাসওয়ার্ডগুলির জন্য একমুখী হ্যাশিং ফাংশন প্রয়োজন।

এর ব্যাখ্যা কী?


13
এই প্রশ্নটি আগেই সম্বোধন করা হয়েছিল এবং তাদের একটি স্ট্যান্ডার্ড লাইব্রেরি ব্যবহারের পরামর্শটি দুর্দান্ত। সুরক্ষা একটি জটিল বিষয় এবং কারও দ্বারা ডিজাইন করা প্যাকেজ ব্যবহার করে তারা জানেন যে তারা কী করছে আপনি কেবল নিজেরাই সহায়তা করছেন।
ekkanal

59
@ এয়াকানাল - সেই পৃষ্ঠাটি এমনকি ব্রক্রিপ্টের কথাও উল্লেখ করেনি, এটি কম কী তা ব্যাখ্যা করে
ভিলেক্স-

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

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

1
ওপেনওয়ালের পোর্টেবল পিএইচপি পাসওয়ার্ড হ্যাশিং ফ্রেমওয়ার্ক (পিএইচপাস) দেখুন। এটি ব্যবহারকারীর পাসওয়ার্ডে প্রচুর সাধারণ আক্রমণগুলির বিরুদ্ধে কঠোর হয়।
jww

উত্তর:


1065

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

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

Bcrypt কীভাবে ব্যবহার করবেন:

PHP> = 5.5-DEV ব্যবহার করা V

পাসওয়ার্ড হ্যাশিং ফাংশনগুলি এখন সরাসরি পিএইচপি> = 5.5 এ নির্মিত হয়েছে । আপনি এখন যে কোনও পাসওয়ার্ডের password_hash()একটি bcryptহ্যাশ তৈরি করতে ব্যবহার করতে পারেন :

<?php
// Usage 1:
echo password_hash('rasmuslerdorf', PASSWORD_DEFAULT)."\n";
// $2y$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// For example:
// $2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

// Usage 2:
$options = [
  'cost' => 11
];
echo password_hash('rasmuslerdorf', PASSWORD_BCRYPT, $options)."\n";
// $2y$11$6DP.V0nO7YI3iSki4qog6OQI5eiO6Jnjsqg7vdnb.JgGIsxniOn4C

বিদ্যমান হ্যাশের বিপরীতে কোনও ব্যবহারকারী প্রদত্ত পাসওয়ার্ড যাচাই করতে, আপনি এটি ব্যবহার করতে পারেন password_verify():

<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

PHP> = 5.3.7, <5.5-DEV (এছাড়াও রেডহ্যাট পিএইচপি> = 5.3.3) ব্যবহার করা হচ্ছে

মূলত সিতে লিখিত উপরের ফাংশনগুলির উত্স কোডের ভিত্তিতে তৈরি গিটহাবের একটি সামঞ্জস্য গ্রন্থাগার রয়েছে যা একই কার্যকারিতা সরবরাহ করে। সামঞ্জস্যতা গ্রন্থাগারটি ইনস্টল হয়ে গেলে, ব্যবহারের উপরের মত একই হয় (আপনি যদি এখনও 5.3.x শাখায় থাকেন তবে শর্টহ্যান্ড অ্যারে স্বীকৃতিটি বিয়োগ করে)।

পিএইচপি <5.3.7 ব্যবহার করা (প্রত্যাশিত)

আপনি crypt()ইনপুট স্ট্রিংয়ের বিক্রিপ্ট হ্যাশগুলি তৈরি করতে ফাংশনটি ব্যবহার করতে পারেন । এই শ্রেণিটি স্বয়ংক্রিয়ভাবে সল্ট তৈরি করতে পারে এবং কোনও ইনপুটের বিপরীতে বিদ্যমান হ্যাশগুলি যাচাই করতে পারে। আপনি যদি পিএইচপি-র কোনও সংস্করণ উচ্চতর বা 5.3.7 এর সমান ব্যবহার করেন তবে এটি বিল্ট-ইন ফাংশন বা কমপ্যাট লাইব্রেরি ব্যবহার করার পক্ষে বাঞ্ছনীয় । এই বিকল্পটি কেবল historicalতিহাসিক উদ্দেশ্যে সরবরাহ করা হয়।

class Bcrypt{
  private $rounds;

  public function __construct($rounds = 12) {
    if (CRYPT_BLOWFISH != 1) {
      throw new Exception("bcrypt not supported in this installation. See http://php.net/crypt");
    }

    $this->rounds = $rounds;
  }

  public function hash($input){
    $hash = crypt($input, $this->getSalt());

    if (strlen($hash) > 13)
      return $hash;

    return false;
  }

  public function verify($input, $existingHash){
    $hash = crypt($input, $existingHash);

    return $hash === $existingHash;
  }

  private function getSalt(){
    $salt = sprintf('$2a$%02d$', $this->rounds);

    $bytes = $this->getRandomBytes(16);

    $salt .= $this->encodeBytes($bytes);

    return $salt;
  }

  private $randomState;
  private function getRandomBytes($count){
    $bytes = '';

    if (function_exists('openssl_random_pseudo_bytes') &&
        (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) { // OpenSSL is slow on Windows
      $bytes = openssl_random_pseudo_bytes($count);
    }

    if ($bytes === '' && is_readable('/dev/urandom') &&
       ($hRand = @fopen('/dev/urandom', 'rb')) !== FALSE) {
      $bytes = fread($hRand, $count);
      fclose($hRand);
    }

    if (strlen($bytes) < $count) {
      $bytes = '';

      if ($this->randomState === null) {
        $this->randomState = microtime();
        if (function_exists('getmypid')) {
          $this->randomState .= getmypid();
        }
      }

      for ($i = 0; $i < $count; $i += 16) {
        $this->randomState = md5(microtime() . $this->randomState);

        if (PHP_VERSION >= '5') {
          $bytes .= md5($this->randomState, true);
        } else {
          $bytes .= pack('H*', md5($this->randomState));
        }
      }

      $bytes = substr($bytes, 0, $count);
    }

    return $bytes;
  }

  private function encodeBytes($input){
    // The following is code from the PHP Password Hashing Framework
    $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

    $output = '';
    $i = 0;
    do {
      $c1 = ord($input[$i++]);
      $output .= $itoa64[$c1 >> 2];
      $c1 = ($c1 & 0x03) << 4;
      if ($i >= 16) {
        $output .= $itoa64[$c1];
        break;
      }

      $c2 = ord($input[$i++]);
      $c1 |= $c2 >> 4;
      $output .= $itoa64[$c1];
      $c1 = ($c2 & 0x0f) << 2;

      $c2 = ord($input[$i++]);
      $c1 |= $c2 >> 6;
      $output .= $itoa64[$c1];
      $output .= $itoa64[$c2 & 0x3f];
    } while (true);

    return $output;
  }
}

আপনি এই কোডটি এভাবে ব্যবহার করতে পারেন:

$bcrypt = new Bcrypt(15);

$hash = $bcrypt->hash('password');
$isGood = $bcrypt->verify('password', $hash);

বিকল্পভাবে, আপনি পোর্টেবল পিএইচপি হ্যাশিং ফ্রেমওয়ার্কও ব্যবহার করতে পারেন ।


7
@ দ্য উইকড ফ্লাই: আপনাকে হতাশ করার জন্য দুঃখিত, তবে mt_rand()বর্তমান সময় এবং বর্তমান প্রক্রিয়া আইডি ব্যবহার করে বদ্ধমূলও হয়েছে। দয়া করে দেখুন GENERATE_SEED()মধ্যে/ext/standard/php_rand.h
অ্যান্ড্রু মুর

53
@ মাইক: এগিয়ে যান, ঠিক সেই কারণেই আছে!
অ্যান্ড্রু মুর

14
যে কেউ ভাবেন যে তাদের getSalt ফাংশনে লবণের স্ট্রিংয়ের শুরুটি সংশোধন করা দরকার, এটি প্রয়োজনীয় নয়। $ 2a $ __ CRYPT_BLOWFISH লবণের অংশ। দস্তাবেজগুলি থেকে: "ব্লোফিশ হশিং নিম্নরূপে একটি লবণ সহ:" $ 2 এ $ ", একটি দুই অঙ্কের দামের প্যারামিটার," $ ", এবং বর্ণমালা থেকে 22 অঙ্ক"।
jwinn

18
@ মিশেলল্যাং: ভাল জিনিসটি crypt()পিয়ার-পর্যালোচনা করা হয় এবং ততক্ষণে যাচাই করা হয়। উপরের কোডটি crypt()পিএইচপি'র কল করে, যা পসিক্স crypt()ফাংশনটিকে কল করে । সকল উপরের কোড কল করার আগে (, লবণ একটি গোপন বিবেচনা করা হয় না, যা ক্রিপ্টোগ্রাফি হতে নিরাপদ করার জন্য নেই) করে আরো একটি র্যান্ডম লবণ উৎপাদিত হয় crypt()নেকড়ে ডাকার আগে আপনার নিজের কিছুটা গবেষণা করা উচিত।
অ্যান্ড্রু মুর

31
দয়া করে মনে রাখবেন যে এই উত্তরটি যদিও ভাল, তার বয়স দেখানো শুরু করে। এই কোডটি (কোনও পিএইচপি বাস্তবায়নের উপর নির্ভর করে crypt()) 5.3.7 পূর্বের সুরক্ষার দুর্বলতার সাপেক্ষে এবং 5.3.7 পরবর্তী পোস্টে (খুব সামান্য) অক্ষম - প্রাসঙ্গিক সমস্যার বিশদটি এখানে পাওয়া যাবে । দয়া করে নোট করুন যে নতুন পাসওয়ার্ড হ্যাশিং এপিআই ( ব্যাকওয়ার্ড কমপ্যাট লাইব ) এখন আপনার অ্যাপ্লিকেশনটিতে বিসিআরপিট পাসওয়ার্ড হ্যাশিং প্রয়োগ করার পছন্দনীয় পদ্ধতি।
ডেভর্যান্ডম

295

সুতরাং, আপনি bcrypt ব্যবহার করতে চান? অসাধারণ! তবে, ক্রিপ্টোগ্রাফির অন্যান্য ক্ষেত্রগুলির মতো, আপনি নিজে এটি করা উচিত নয়। কীগুলি পরিচালনা করা, বা সল্ট সংরক্ষণ করা বা এলোমেলো সংখ্যা উত্পন্ন করার মতো কিছু সম্পর্কে আপনার যদি উদ্বিগ্ন হওয়ার দরকার হয় তবে আপনি এটি ভুল করছেন।

কারণটি সহজ: ব্র্যাক্রিপ্ট স্ক্রু আপ করা এত তুচ্ছ সহজ । প্রকৃতপক্ষে, আপনি যদি এই পৃষ্ঠার প্রায় প্রতিটি টুকরো কোডের দিকে লক্ষ্য করেন তবে আপনি লক্ষ্য করবেন যে এটি কমপক্ষে এই সাধারণ সমস্যাগুলির একটি লঙ্ঘন করছে।

এটি মুখোমুখি, ক্রিপ্টোগ্রাফি হার্ড।

বিশেষজ্ঞদের জন্য এটি ছেড়ে দিন। এই লাইব্রেরিগুলি রক্ষণাবেক্ষণ করা যাদের কাজ এটি তাদের জন্য ছেড়ে দিন। আপনার যদি সিদ্ধান্ত নেওয়ার দরকার হয় তবে আপনি এটি ভুল করছেন।

পরিবর্তে, কেবল একটি লাইব্রেরি ব্যবহার করুন। আপনার প্রয়োজনীয়তার উপর নির্ভর করে বেশ কয়েকটি বিদ্যমান।

লাইব্রেরি

আরও কয়েকটি সাধারণ এপিআইয়ের একটি ব্রেকডাউন এখানে।

পিএইচপি 5.5 এপিআই - (5.3.7+ এর জন্য উপলব্ধ)

পিএইচপি 5.5 থেকে শুরু করে হ্যাশিং পাসওয়ার্ডগুলির জন্য একটি নতুন এপিআই চালু করা হচ্ছে। 5.3.7+ এর জন্য (আমার দ্বারা) রক্ষণাবেক্ষণ করা একটি শিম সামঞ্জস্য গ্রন্থাগারও রয়েছে। এটি পিয়ার-পর্যালোচনা এবং প্রয়োগ বাস্তবায়নের সহজ হওয়ার সুবিধা রয়েছে ।

function register($username, $password) {
    $hash = password_hash($password, PASSWORD_BCRYPT);
    save($username, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    if (password_verify($password, $hash)) {
        //login
    } else {
        // failure
    }
}

সত্যিই, এটি অত্যন্ত সাধারণ হওয়ার লক্ষ্য।

সম্পদ:

জেন্ড \ ক্রিপ্ট \ পাসওয়ার্ড \ বিক্রিপ্ট (5.3.2+)

এটি পিএইচপি 5.5 এর অনুরূপ অন্য একটি এপিআই এবং একই উদ্দেশ্যে কাজ করে।

function register($username, $password) {
    $bcrypt = new Zend\Crypt\Password\Bcrypt();
    $hash = $bcrypt->create($password);
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $bcrypt = new Zend\Crypt\Password\Bcrypt();
    if ($bcrypt->verify($password, $hash)) {
        //login
    } else {
        // failure
    }
}

সম্পদ:

PasswordLib

পাসওয়ার্ড হ্যাশিংয়ের ক্ষেত্রে এটি কিছুটা ভিন্ন পদ্ধতি। কেবলমাত্র bcrypt সমর্থন করার পরিবর্তে, পাসওয়ার্ডলিব প্রচুর সংখ্যক হ্যাশিং অ্যালগরিদমকে সমর্থন করে। এটি মূলত প্রসঙ্গে যেখানে আপনার নিয়ন্ত্রণের বাইরে থাকতে পারে এমন উত্তরাধিকারসূত্র এবং পৃথকীকরণ ব্যবস্থার সাথে সামঞ্জস্যতা আপনার সমর্থন প্রয়োজন useful এটি বিপুল সংখ্যক হ্যাশিং অ্যালগরিদমকে সমর্থন করে। এবং 5.3.2+ সমর্থিত

function register($username, $password) {
    $lib = new PasswordLib\PasswordLib();
    $hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $lib = new PasswordLib\PasswordLib();
    if ($lib->verifyPasswordHash($password, $hash)) {
        //login
    } else {
        // failure
    }
}

তথ্যসূত্র:

PHPASS

এটি এমন একটি স্তর যা বিক্রিপ্টকে সমর্থন করে, তবে আপনার যদি পিএইচপি> = 5.3.2 এ অ্যাক্সেস না থাকে তবে কার্যকরভাবে যথেষ্ট শক্তিশালী অ্যালগরিদম সমর্থন করে ... এটি আসলে পিএইচপি 3.0+ সমর্থন করে (যদিও বিসিক্রিপ্টের সাথে নয়)।

function register($username, $password) {
    $phpass = new PasswordHash(12, false);
    $hash = $phpass->HashPassword($password);
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $phpass = new PasswordHash(12, false);
    if ($phpass->CheckPassword($password, $hash)) {
        //login
    } else {
        // failure
    }
}

সম্পদ

দ্রষ্টব্য: পিএইচপিএসএস বিকল্পগুলি ওপেনওয়ালে হোস্ট করা হয় না, সেগুলি বিভিন্ন প্রকল্প !!!

বিসিপ্রিপ্ট সম্পর্কে

যদি আপনি লক্ষ্য করেন তবে এই লাইব্রেরির প্রত্যেকটিই একটি একক স্ট্রিং প্রদান করে। বিসিক্রিপ অভ্যন্তরীণভাবে কীভাবে কাজ করে তার কারণেই। এবং সে সম্পর্কে উত্তরগুলির একটি টোন রয়েছে। এখানে আমি একটি নির্বাচন লিখেছি যে আমি এখানে অনুলিপি / পেস্ট করব না, তবে লিঙ্ক করুন:

শেষ করি

বিভিন্ন পছন্দ আছে। যা আপনি চয়ন আপনার উপর নির্ভর করে। যাইহোক, আমি চাই অত্যন্ত সুপারিশ করছি যে আপনি আপনার জন্য এই পরিচালনা করার জন্য উপরে লাইব্রেরি ব্যবহার করুন।

আবার আপনি যদি crypt()সরাসরি ব্যবহার করেন তবে আপনি সম্ভবত কিছু ভুল করছেন। যদি আপনার কোড ব্যবহার করছে hash()(অথবা md5()বা sha1()) সরাসরি, আপনি প্রায় কিছু উল্টাপাল্টা করছেন।

কেবল একটি লাইব্রেরি ব্যবহার করুন ...


7
লবণের এলোমেলোভাবে উত্পাদন করতে হবে, তবে এটি কোনও নিরাপদ এলোমেলো উত্স থেকে আসার প্রয়োজন নেই। লবণ কোনও গোপন বিষয় নয় । পরবর্তী লবণের অনুমান করতে সক্ষম হওয়ার কোনও প্রকৃত সুরক্ষা প্রভাব নেই; যতক্ষণ না তারা প্রতিটি পাসওয়ার্ড এনকোডযুক্ত বিভিন্ন লবণের জন্য যথেষ্ট পরিমাণে বিশাল ডেটা থেকে আসে, আপনি ভাল আছেন you মনে রাখবেন, যদি আপনার হ্যাশগুলি খারাপ হাতে আসে তবে রেইনবো টেবিলের ব্যবহার প্রতিরোধ করার জন্য লবণ রয়েছে। তারা গোপন নয়।
অ্যান্ড্রু মুর

7
@ এন্ড্রুমুর একেবারে সঠিক! তবে পরিসংখ্যানগতভাবে স্বতন্ত্র হওয়ার জন্য লবণের যথেষ্ট এনট্রপি থাকতে হবে। কেবল আপনার অ্যাপ্লিকেশনটিতে নয়, সমস্ত অ্যাপ্লিকেশনগুলিতে। সুতরাং mt_rand()একটি উচ্চ পর্যাপ্ত সময়কাল আছে, তবে বীজের মান মাত্র 32 বিট। সুতরাং mt_rand()কার্যকরভাবে ব্যবহার আপনাকে এনট্রপির মাত্র 32 বিটের মধ্যে সীমাবদ্ধ। জন্মদিনের সমস্যার জন্য ধন্যবাদ যার অর্থ আপনার কেবলমাত্র 7 কে উত্পন্ন লবণ (বিশ্বব্যাপী) এ সংঘর্ষের 50% সম্ভাবনা রয়েছে। যেহেতু bcrypt128 বিট লবণ গ্রহণ করে, এমন একটি উত্স ব্যবহার করা ভাল যা সমস্ত 128 বিট সরবরাহ করতে পারে ;-)। (128 বিটে, 2e19 হ্যাশগুলিতে সংঘর্ষের 50% সম্ভাবনা রয়েছে) ...
একারম্যাক্সেল

1
@ কিরম্যাক্সেল: "যথেষ্ট পরিমাণে ডেটা সরবরাহের বৃহত পুল" হ্যান্স করুন। তবে আপনার উত্সটি খুব উচ্চতর এনট্রপি উত্স হতে হবে না, এটি কেবলমাত্র 128 বিটের জন্য যথেষ্ট। তবে, আপনি যদি আপনার সমস্ত উপলভ্য উত্সগুলি (ওপেনএসএসএল, ইত্যাদি নেই) বন্ধ করে দিয়ে থাকেন এবং আপনার একমাত্র ফ্যালব্যাকটি এমটি_রেন্ড () হয় তবে এটি বিকল্পের (যা র্যান্ড ()) এর চেয়ে আরও ভাল।
অ্যান্ড্রু মুর

4
@ অ্যান্ড্রুমুর: একেবারে। তর্ক করছেন না। কেবল এটি mt_randএবং uniqid(এবং তাই lcg_valueএবং rand) প্রথম পছন্দ নয় ...
একারম্যাক্সেল

1
আর্কম্যাক্সেল, 5.3.xx ওয়েবসাইটের পাসওয়ার্ড_কম্প্যাট লাইব্রেরির জন্য আপনাকে অনেক ধন্যবাদ, আমরা এর আগে এর প্রয়োজন ছিল না তবে এখন আমরা 5.3.xx পিএইচপি সার্ভারে করেছি এবং এই যুক্তিটি না করার জন্য আপনার স্পষ্ট পরামর্শের জন্য আপনাকে ধন্যবাদ নিজেকে।
টিকটিকি

47

রেইনবো টেবিলের সাথে পর্যাপ্ত পরিমাণে আপনি প্রচুর তথ্য পাবেন : নিরাপদ পাসওয়ার্ড স্কিম বা পোর্টেবল পিএইচপি পাসওয়ার্ড হ্যাশিং ফ্রেমওয়ার্ক সম্পর্কে আপনার যা জানা দরকার

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


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

41
পাসওয়ার্ড হ্যাশিং একটি আক্রমণ থেকে রক্ষা করতে ব্যবহৃত হয়: কেউ আপনার ডাটাবেস চুরি করেছে এবং ক্লিয়ারটেক্সট লগইন + পাসওয়ার্ড পেতে চায়।
আরখ

4
@ জো কে। আমি আপনাকে কিছু সহজ পাসওয়ার্ড ফ্যাপাসের মাধ্যমে সুরক্ষিত করার পরে ক্র্যাক করার চেষ্টা করতে উত্সাহিত করি যাতে এটি আপনার ওয়েবসভারে গণনা করতে 1 মিমি এবং 10 মিমি লাগে।
আরখ

3
একমত। তবে যে ধরণের ব্যবহারকারীর পাসওয়ার্ড হিসাবে কিওয়ার্টি ব্যবহার করবে তা হ'ল ধরণের ব্যবহারকারী যিনি যে কোনও জটিলকে চিহ্নিত করেছেন যে কোনও জায়গায় তিনি (এবং আক্রমণকারীরা) সহজেই এটি পড়তে পারেন। বিসিআরপিট কমপ্লিটস ব্যবহার করে তা হ'ল আপনার ডিবি যখন আপনার ইচ্ছার বিরুদ্ধে প্রকাশ্যে আসে, আপনি যদি একটি পাসে sha512 ব্যবহার করেন তবে user | $$ & ZL6- like এর মতো কিছু পাসওয়ার্ড ব্যবহারকারীর কাছে পাওয়া শক্ত হবে be
আরখ

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

36

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

পিএইচপি - ক্রিপ্ট ফাংশন


4
এটি সঠিক পদ্ধতির - পিএইচপি এর crypt()ফাংশন ব্যবহার করুন , যা বিভিন্ন পাসওয়ার্ড হ্যাশিং ফাংশন সমর্থন করে। নিশ্চিত হয়ে নিন যে আপনি ব্যবহার করছেন না CRYPT_STD_DESবা CRYPT_EXT_DES- অন্যান্য সমর্থিত ধরণের যে কোনও একটি ভাল (এবং নামের মধ্যে বিসিক্রিপ্ট রয়েছে CRYPT_BLOWFISH)।
ক্যাফে

4
'রাউন্ড' বিকল্পের মাধ্যমে SHA এর প্রকৃতপক্ষে একটি ব্যয় প্যারামিটারও রয়েছে। এটি ব্যবহার করার সময়, আমি বিসিক্রিপ্টের পক্ষে কোনও কারণ দেখি না।
পিটার এনেস

3
প্রকৃতপক্ষে, একটি পাসওয়ার্ডের একটিও SHA-1 (বা MD5) এখনও লবণের সাথে বা ছাড়াই সহজেই ব্রুট-ফোর্স-সক্ষম হয় (লবণ রেঞ্জবোর্ডের টেবিলগুলির বিরুদ্ধে সহায়তা করে, ব্রুট-জোর করার বিরুদ্ধে নয়)। Bcrypt ব্যবহার করুন।
পাওলো ইবারম্যান

আমি এটিকে বিরক্তিকর বলে মনে করি যে পিএইচপি-র ক্রিপ্ট () বলতে যখন বোঝায় সবাই "বিসিক্রিপ্ট" বলে বলে মনে হচ্ছে।
স্লিক

3
@ পানিক কেন? অ্যালগরিদমকে বিক্রিপ্ট বলা হয় । ধ্রুবকের cryptসাথে মিল রেখে বিক্রিপ্ট সহ বেশ কয়েকটি পাসওয়ার্ড হ্যাশ প্রকাশিত হয় CRYPT_BLOWFISH। Bcrypt বর্তমানে সমর্থিত সবচেয়ে শক্তিশালী অ্যালগরিদম cryptএবং এটি সমর্থিত বেশ কয়েকটি অন্যান্য বেশ দুর্বল।
কোডসইনচওস

34

সম্পাদনা করুন: 2013.01.15 - আপনার সার্ভার যদি এটি সমর্থন করে তবে পরিবর্তে মার্টিনস্টোইকিলির সমাধানটি ব্যবহার করুন।


সবাই এটিকে আরও জটিল করে তুলতে চায়। ক্রিপ্ট () ফাংশন বেশিরভাগ কাজ করে।

function blowfishCrypt($password,$cost)
{
    $chars='./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $salt=sprintf('$2y$%02d$',$cost);
//For PHP < PHP 5.3.7 use this instead
//    $salt=sprintf('$2a$%02d$',$cost);
    //Create a 22 character salt -edit- 2013.01.15 - replaced rand with mt_rand
    mt_srand();
    for($i=0;$i<22;$i++) $salt.=$chars[mt_rand(0,63)];
    return crypt($password,$salt);
}

উদাহরণ:

$hash=blowfishCrypt('password',10); //This creates the hash
$hash=blowfishCrypt('password',12); //This creates a more secure hash
if(crypt('password',$hash)==$hash){ /*ok*/ } //This checks a password

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


3
লবণ তৈরির উন্নতি হতে পারে (ওএসের এলোমেলো উত্স ব্যবহার করুন), অন্যথায় এটি আমার কাছে ভাল লাগছে। আরও নতুন পিএইচপি সংস্করণগুলির 2yপরিবর্তে এটি ব্যবহার করা ভাল 2a
মার্টিনস্টোকেলি

mcrypt_create_iv($size, MCRYPT_DEV_URANDOM)লবণের উত্স হিসাবে ব্যবহার করুন ।
কোডসইনচওস

আমি যখন একটি মুহুর্ত পাই তখন আমি mcrypt_create_iv () এর কাছাকাছি নজর রাখব, যদি অন্য কিছু না হয় তবে এটির পারফরম্যান্সটি কিছুটা উন্নত করা উচিত।
জন হুলকা

2
বেস 64 এনকোডিং যুক্ত করুন এবং কাস্টম বর্ণমালা bcryptব্যবহারগুলিতে অনুবাদ করুন । mcrypt_create_iv(17, MCRYPT_DEV_URANDOM), str_replace('+', '.', base64_encode($rawSalt)),$salt = substr($salt, 0, 22);
CodesInChaos

1
@ জনহুলকা - পিএইচপি'র সামঞ্জস্যতা প্যাক [লাইন 127] দেখুন, এটি একটি সরল বাস্তবায়ন।
মার্টিনস্টোকেলি

29

পিএইচপি-র 5.5 সংস্করণে বিসিক্রিপ, ফাংশন password_hash()এবং এর জন্য অন্তর্নির্মিত সমর্থন থাকবে password_verify()। প্রকৃতপক্ষে এগুলি কেবল ফাংশনটির চারপাশে মোড়ক crypt()এবং এটিকে সঠিকভাবে ব্যবহার করা সহজ করে তুলবে। এটি নিরাপদ এলোমেলো লবণের প্রজন্মের যত্ন নেয় এবং ভাল ডিফল্ট মান সরবরাহ করে।

এই ফাংশনগুলি ব্যবহার করার সবচেয়ে সহজ উপায় হ'ল:

$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

এই কোডটি বিসিক্রিপ্ট (অ্যালগরিদম 2y) এর সাথে পাসওয়ার্ডটি হ্যাশ করবে , ওএস র্যান্ডম উত্স থেকে একটি এলোমেলো লবণ উত্পন্ন করবে এবং ডিফল্ট ব্যয় প্যারামিটার ব্যবহার করবে (এই মুহুর্তে এটি 10) 10 দ্বিতীয় লাইনটি পরীক্ষা করে যদি ব্যবহারকারী পাসওয়ার্ড প্রবেশ করিয়ে দেয় তবে ইতিমধ্যে সঞ্চিত হ্যাশ-মানটির সাথে মেলে।

আপনি যদি খরচের প্যারামিটারটি পরিবর্তন করতে চান, আপনি এটির মতো করে ব্যয় প্যারামিটারটিকে 1 দ্বারা বাড়িয়ে, হ্যাশ মান গণনার জন্য প্রয়োজনীয় সময়কে দ্বিগুণ করতে পারেন:

$hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));

"cost"প্যারামিটারের বিপরীতে, প্যারামিটারটি বাদ দেওয়া ভাল "salt", কারণ ফাংশন ইতিমধ্যে একটি ক্রিপ্টোগ্রাফিকভাবে নিরাপদ লবণ তৈরি করতে সেরা চেষ্টা করে।

পিএইচপি সংস্করণ 5.3.7 এবং তার পরে, একই লেখক যে ফাংশনটি তৈরি করেছিলেন তার একটি সামঞ্জস্য প্যাক উপস্থিত রয়েছে password_hash()। পিএইচপি সংস্করণগুলির জন্য 5.3.7 এর আগে ইউনিকোড নিরাপদ বিসিক্রিপ অ্যালগরিদম crypt()সহ কোনও সমর্থন নেই 2y। এর পরিবর্তে যে কোনও এটির সাথে প্রতিস্থাপন করতে পারে 2aযা পূর্ববর্তী পিএইচপি সংস্করণগুলির জন্য সেরা বিকল্প।


3
আমি এটি পড়ার পরে, আমার প্রথম চিন্তাটি হয়েছিল "উত্পন্ন নুন আপনি কীভাবে সংরক্ষণ করবেন"? ডক্সের মাধ্যমে পোকার পরে, পাসওয়ার্ড_হ্যাশ () ফাংশনটি একটি স্ট্রিং তৈরি করে যা এনক্রিপশন পদ্ধতি, লবণ এবং উত্পন্ন হ্যাশ সংরক্ষণ করে। সুতরাং, এটি পাসওয়ার্ড_ওয়ারিফাই () ফাংশনটি কাজ করার জন্য এটি কেবল একটি স্ট্রিংয়ে প্রয়োজনীয় সমস্ত কিছু সঞ্চয় করে। কেবল এটি উল্লেখ করতে চেয়েছিলেন কারণ এটি অন্যদের যখন এটি দেখবে তখন তাদের সহায়তা করতে পারে।
jzimmerman2011

@ jzimmerman2011 - ঠিক অন্য কোনও উত্তরে আমি একটি উদাহরণ দিয়ে এই স্টোরেজ ফর্ম্যাটটি ব্যাখ্যা করার চেষ্টা করেছি।
মার্টিনস্টোইকেলি

7

বর্তমান চিন্তাভাবনা: হ্যাশগুলি দ্রুততম সম্ভব নয়, ধীরে ধীরে উপলব্ধ হওয়া উচিত। এটি রেইনবো টেবিলের আক্রমণগুলিকে দমন করে ।

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

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


আমি মনে করি তারা ধরে নিয়েছে যে আক্রমণকারী ইতিমধ্যে অন্য কোনও মাধ্যমে আমার ডিবি চুরি করতে সক্ষম হয়েছে এবং পেপ্যাল ​​বা কোনও কিছুর জন্য চেষ্টা করে পাসওয়ার্ডগুলি বের করার চেষ্টা করছে।
ভিলেক্স-

4
২০১২ সালের অর্ধেক পথ এবং এই উত্তরটি এখনও চমকপ্রদ, কীভাবে ধীরে ধীরে হ্যাশিং অ্যালগোরিদম রেইনবো টেবিলের আক্রমণগুলিকে আটকাবে? আমি ভাবলাম এলোমেলো বাইট রেঞ্জের লবণ কি করেছে? আমি সবসময় ভেবেছিলাম যে হ্যাশিং অ্যালগরিদমের গতি হ্যাশের বিরুদ্ধে তারা কতগুলি পুনরাবৃত্তি পাঠাতে পারে তা নির্ধারণ করে যে তারা আপনাকে নির্দিষ্ট সময়ে ফর্ম করে। ফেইলড লগিন এটেম্পটস-এ থাকা কোনও ব্যবহারকারী কখনও ব্লক করবেন না আপনার বিশ্বাস আমার ব্যবহারকারীরা বিরক্ত হয়ে পড়বেন, প্রায়শই কিছু সাইটের জন্য আমার পাসওয়ার্ডটি মনে রাখার আগে মাঝে মাঝে প্রায় 5 গুণ বেশি লগইন করতে হবে। এছাড়াও দ্বিতীয় পাসের স্তরটি কাজ করে না, যদিও মোবাইল ফোন কোড সহ দুটি পদক্ষেপ লেখক পারে।
সামায়ায়ে

1
@ সাম্ময়ে আমি এটিতে একমত হতে পারি to আমি 5 টি ব্যর্থ লগইন প্রয়াসের উপর একটি ব্লক সেটআপ করেছি, এটি দ্রুত বাড়িয়ে নেওয়ার আগে 7, তারপরে 10 টি এখন 20 এ বসে আছে No কোনও সাধারণ ব্যবহারকারীর 20 টি ব্যর্থ লগইন প্রচেষ্টা থাকা উচিত নয় তবে এটি ব্রুটে আক্রমণের আক্রমণ সহজেই বন্ধ করতে যথেষ্ট পরিমাণে কম
ব্রুস অলড্রিজ

@ ব্রুসএলড্রিজ আমি ব্যক্তিগতভাবে মনে করব যে আপনার স্ক্রিপ্টটি এলোমেলো সময়ের জন্য একটি এলোমেলো সময়ের জন্য বলার পরে 7 টি ব্যর্থ লগইন করা এবং ব্লক না করে একটি ক্যাপচা প্রদর্শন করা ভাল। অবরুদ্ধ করা একটি খুব আগ্রাসী পদক্ষেপ।
সম্মেয়ে

1
@ সাম্মায়ে আমি স্বীকার করি স্থায়ী ব্লকগুলি খারাপ। আমি একটি অস্থায়ী ব্লকের উল্লেখ করছি যা ব্যর্থ চেষ্টার সংখ্যার সাথে বৃদ্ধি পায়।
ব্রুস আল্ড্রিজে

7

এই পুরানো প্রশ্নের একটি আপডেট উত্তর এখানে!

5.5 যেহেতু পিএইচপিতে হ্যাশ পাসওয়ার্ডের সঠিক উপায়টি রয়েছে password_hash()এবং সেগুলি যাচাই করার সঠিক উপায়টি রয়েছে এবং এটি password_verify()পিএইচপি 8.0 এ এখনও সত্য। এই ফাংশনগুলি ডিফল্টরূপে bcrypt হ্যাশ ব্যবহার করে তবে অন্যান্য শক্তিশালী অ্যালগরিদম যুক্ত করা হয়েছে। password_hashপরামিতিগুলির মাধ্যমে আপনি কাজের ফ্যাক্টরটি (কার্যকরভাবে এনক্রিপশনটি কতটা "শক্তিশালী") পরিবর্তন করতে পারেন ।

তবে, যদিও এটি এখনও যথেষ্ট পরিমাণে শক্তিশালী, ব্র্যাক্রিপ্টকে আর অত্যাধুনিক হিসাবে বিবেচনা করা হয় না ; পাসওয়ার্ডের হ্যাশ অ্যালগরিদমগুলির একটি আরও ভাল সেট এসে পৌঁছেছে আরগন 2, আরগন 2i, আর্গন 2 ডি এবং আরগন 2 আইড ভেরিয়েন্টের সাথে। তাদের মধ্যে পার্থক্য ( এখানে বর্ণিত হিসাবে ):

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

আরগোন 2i সমর্থন পিএইচপি 7.2 এ যুক্ত হয়েছিল এবং আপনি এটির জন্য অনুরোধ করেছেন:

$hash = password_hash('mypassword', PASSWORD_ARGON2I);

এবং পিএসপি 7.3 এ আরগন 2 এইড সমর্থন যুক্ত করা হয়েছিল:

$hash = password_hash('mypassword', PASSWORD_ARGON2ID);

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

বেশ পৃথকভাবে (এবং কিছুটা অপ্রয়োজনীয়), লাইবসোডিয়াম (পিএইচপি .2.২ এ যুক্ত) এছাড়াও sodium_crypto_pwhash_str ()এবং sodium_crypto_pwhash_str_verify()ফাংশনগুলির মাধ্যমে আর্গন 2 হ্যাশিং সরবরাহ করে, যা পিএইচপি বিল্ট-ইনগুলির মতো একইভাবে কাজ করে। এগুলি ব্যবহারের একটি সম্ভাব্য কারণ হ'ল পিএইচপি কখনও কখনও লিবারগোন 2 ছাড়াই সংকলিত হতে পারে, যা আর্গন 2 অ্যালগরিদমগুলিকে পাসওয়ার্ড_হ্যাশ ফাংশনে অনুপলব্ধ করে তোলে; পিএইচপি .2.২ এবং উচ্চতর ক্ষেত্রে সর্বদা লিবসোডিয়াম সক্ষম থাকা উচিত তবে এটি তা নাও পারে - তবে কমপক্ষে দুটি উপায় আছে যা আপনি সেই অ্যালগরিদমে পেতে পারেন। আপনি কীভাবে লিবসোডিয়াম সহ একটি আর্গন 2 এইড হ্যাশ তৈরি করতে পারেন তা এখানে (এমনকি পিএইচপি 7.2 তেও রয়েছে, যার মধ্যে আরগন 2 আইড সমর্থন নেই):

$hash = sodium_crypto_pwhash_str(
    'mypassword',
    SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);

দ্রষ্টব্য যে এটি আপনাকে ম্যানুয়ালি একটি লবণ নির্দিষ্ট করতে দেয় না; এটি লাইবসোডিয়ামের নীতিশাস্ত্রের অংশ - ব্যবহারকারীদের এমন মানগুলিতে প্যারাম স্থাপনের অনুমতি দেবেন না যা সুরক্ষার সাথে আপোস করতে পারে - উদাহরণস্বরূপ পিএইচপি-র password_hashফাংশনে একটি খালি লবণের স্ট্রিংটি পাস করা থেকে বিরত করার মতো কিছুই নেই ; লাইবসোডিয়াম আপনাকে এত নির্বোধ কিছু করতে দেয় না!



1

যেহেতু আমরা সবাই জানি ডেটাবেসে পরিষ্কার পাঠ্যে পাসওয়ার্ড সংরক্ষণ করা নিরাপদ নয়। বিসিআরপিট হ্যাশিং পাসওয়ার্ড কৌশল। এটি পাসওয়ার্ড সুরক্ষা তৈরিতে ব্যবহৃত হয়। বিক্রিপ্টের একটি আশ্চর্যজনক কাজ হ'ল এটি হ্যাকারদের থেকে আমাদের বাঁচায় এটি হ্যাকিং আক্রমণ থেকে পাসওয়ার্ডকে সুরক্ষিত করতে ব্যবহৃত হয় কারণ পাসওয়ার্ডটি বিক্রিপ্টযুক্ত আকারে সংরক্ষণ করা হয়।

পাসওয়ার্ড_হ্যাশ () ফাংশনটি একটি নতুন পাসওয়ার্ড হ্যাশ তৈরি করতে ব্যবহৃত হয়। এটি একটি শক্তিশালী ও শক্তিশালী হ্যাশিং অ্যালগরিদম ব্যবহার করে password সুতরাং, ক্রিপ্ট () দ্বারা তৈরি পাসওয়ার্ড হ্যাশগুলি পাসওয়ার্ড_হ্যাশ () এবং তদ্বিপরীত দ্বারা ব্যবহৃত হতে পারে। ফাংশন পাসওয়ার্ড_ওয়ারিফাই () এবং পাসওয়ার্ড_হ্যাশ () ফাংশনটির চারপাশে কেবল র‌্যাপগুলি () এবং এটি এটিকে নির্ভুলভাবে ব্যবহার করা সহজ করে দেয়।

বাক্য গঠন

string password_hash($password , $algo , $options)

নিম্নলিখিত আলগোরিদিমগুলি বর্তমানে পাসওয়ার্ড_হ্যাশ () ফাংশন দ্বারা সমর্থিত:

পাসওয়ার্ড_ডিএফএলএফএস পাসওয়ার্ড_বিসিআরপিটি পাসওয়ার্ড_আরজোন ২ আই পাসওয়ার্ড_আরগন ২ আইডি

পরামিতি: এই ফাংশনটি উপরে বর্ণিত এবং নীচে বর্ণিত হিসাবে তিনটি পরামিতি গ্রহণ করে:

পাসওয়ার্ড : এটি ব্যবহারকারীর পাসওয়ার্ড সংরক্ষণ করে। অ্যালগো : এটি পাসওয়ার্ড অ্যালগরিদম ধ্রুবক যা অ্যালগরিদমকে চিহ্নিত করার সময় অবিচ্ছিন্নভাবে ব্যবহৃত হয় যা পাসওয়ার্ডের হ্যাশিংয়ের সময় ব্যবহৃত হয়। বিকল্পগুলি : এটি একটি সহযোগী অ্যারে, যা বিকল্পগুলি ধারণ করে। যদি এটি মুছে ফেলা হয় এবং এতে অন্তর্ভুক্ত না হয় তবে একটি এলোমেলো লবণ ব্যবহার করা হবে এবং একটি ডিফল্ট ব্যয়ের ব্যবহার ঘটবে। প্রত্যাবর্তনের মান : এটি সাফল্যের জন্য হ্যাশ পাসওয়ার্ড বা ব্যর্থতার ক্ষেত্রে মিথ্যা প্রদান করে।

উদাহরণ :

Input : echo password_hash("GFG@123", PASSWORD_DEFAULT); Output : $2y$10$.vGA19Jh8YrwSJFDodbfoHJIOFH)DfhuofGv3Fykk1a

নীচে প্রোগ্রামগুলি পিএইচপি-তে পাসওয়ার্ড_হ্যাশ () ফাংশন চিত্রিত করে:

<?php echo password_hash("GFG@123", PASSWORD_DEFAULT); ?>

আউটপুট

$2y$10$Z166W1fBdsLcXPVQVfPw/uRq1ueWMA6sLt9bmdUFz9AmOGLdM393G

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