PHP හි මුරපද හැෂ් කිරීම සඳහා ඔබ bcrypt භාවිතා කරන්නේ කෙසේද?


1261

"PHP, bcrypt නීති වල මුරපද ගබඩා කිරීම සඳහා bcrypt භාවිතා කරන්න" යන උපදෙස් සෑම විටම මට අසන්නට ලැබේ.

නමුත් කුමක්ද bcrypt? PHP, ගොනු-කේතනය උපයෝගීතා හා වෙබ් අඩවි සෙවුම් විකිපීඩියා, නිදහස් විශ්වකෝෂය පිළිබඳ babbles පමණක් ක නිර්මාණයන් කිහිපයක් හෙළි, එවැනි කාර්යයන් සපයන්නේ නැත Blowfish , විවිධ භාෂා වලින්. දැන් Blowfish PHP හරහා ද ලබා ගත හැකිය mcrypt, නමුත් එය මුරපද ගබඩා කිරීමට උපකාරී වන්නේ කෙසේද? Blowfish යනු පොදු අරමුණු කේතාංකයකි, එය ක්‍රම දෙකක් ක්‍රියාත්මක කරයි. එය සංකේතනය කළ හැකි නම්, එය විකේතනය කළ හැකිය. මුරපද සඳහා එක්-මාර්ග හැෂිං ශ්‍රිතයක් අවශ්‍ය වේ.

පැහැදිලි කිරීම කුමක්ද?


13
මෙම ප්‍රශ්නය මීට පෙර ආමන්ත්‍රණය කර ඇති අතර සම්මත පුස්තකාලයක් භාවිතා කිරීම පිළිබඳ ඔවුන්ගේ යෝජනාව විශිෂ්ටයි. ආරක්ෂාව යනු සංකීර්ණ කාරණයක් වන අතර, ඔවුන් කරන්නේ කුමක්දැයි දන්නා අයෙකු විසින් නිර්මාණය කරන ලද පැකේජයක් භාවිතා කිරීමෙන් ඔබ ඔබටම උදව් කරයි.
eykanal

59
kyykanal - එම පිටුවේ bcrypt ගැනවත් සඳහන් නොවේ, එය කුමක්දැයි පැහැදිලි නොකරයි .
විල්ක්ස්-

8
kyykanal - එය ක්‍රියාත්මක වන ආකාරය පිළිබඳ පැහැදිලි කිරීමක් මම අසන්නේ නැත. මට එය කුමක්දැයි දැන ගැනීමට අවශ්‍යයි. "Bcrypt" යතුර යටතේ මට ජාලයෙන් හාරා ගත හැකි ඕනෑම දෙයක් මුරපද හැෂ් කිරීම සඳහා කිසිසේත් භාවිතා කළ නොහැකි බැවිනි. කෙලින්ම නොවේ, සහ PHP හි නොවේ. හරි, මේ වන විට එය ඇත්ත වශයෙන්ම "phpass" පැකේජය වන අතර එය ඔබගේ මුරපදයෙන් ලබාගත් යතුරක් සමඟ ඔබේ මුරපදය සංකේතනය කිරීමට බ්ලූෆිෂ් භාවිතා කරයි (සාරාංශයක් ලෙස මුරපදයම සංකේතනය කිරීම). නමුත් එය "bcrypt" ලෙස සඳහන් කිරීම දැඩි ලෙස නොමඟ යවන සුළු වන අතර, මෙම ප්‍රශ්නයේදී මට පැහැදිලි කිරීමට අවශ්‍ය වූයේ එයයි.
විල්ක්ස්-

3
Il විල්ක්ස්: මගේ පිළිතුරෙහිbcrypt සංකේතාංකන යෝජනා ක්‍රමයට එදිරිව එක්-මාර්ග හැෂිං ඇල්ගොරිතමයක් වන්නේ ඇයිද යන්න පිළිබඳ වැඩි විස්තර මම එකතු කර ඇත්තෙමි . කේතාංකයේ ආරම්භක තත්වය (ලුණු, රවුම්, යතුර) නොදැන සරල පා text ය කේතාංක පා text යෙන් ලබා ගත නොහැකි බව සහතික කරන මුළුමනින්ම වෙනස් ප්‍රධාන කාලසටහනක් ඇති විට මෙම සම්පූර්ණ වැරදි වැටහීම තිබේ. bcrypt
මුවර්

1
Openwall හි අතේ ගෙන යා හැකි PHP මුරපද හැෂිං රාමුව (PHPass) ද බලන්න. පරිශීලක මුරපද වලට පොදු ප්‍රහාර ගණනාවකට එරෙහිව එය දැඩි කර ඇත.
jww

Answers:


1067

bcryptයනු දෘඩාංග සමඟ පරිමාණය කළ හැකි (වින්‍යාසගත කළ හැකි වට ගණනක් හරහා) හැෂිං ඇල්ගොරිතමයකි. එහි මන්දගාමී බව සහ බහු වටයන් මඟින් ඔබේ මුරපද බිඳ දැමීමට හැකි වන පරිදි ප්‍රහාරකයා විසින් විශාල අරමුදල් සහ දෘඩාංග යෙදවිය යුතු බව සහතික කරයි. එම එක් මුරපද ලවණවලට (අවශ්‍ය bcryptලවණ) එකතු කරන්න, හාස්‍යජනක අරමුදල් හෝ දෘඩාංග නොමැතිව ප්‍රහාරයක් පාහේ කළ නොහැකි බව ඔබට සහතික විය හැකිය.

bcryptමුරපද හැෂ් කිරීමට Eksblowfish ඇල්ගොරිතම භාවිතා කරයි . Eksblowfish සහ Blowfish වල සංකේතාංකන අවධිය හරියටම සමාන වන අතර, Eksblowfish හි ප්‍රධාන උපලේඛන අවධිය මඟින් ඕනෑම පසුකාලීන තත්වයක් ලුණු සහ යතුර (පරිශීලක මුරපදය) මත රඳා පවතින බව සහතික කරයි. මෙම ප්‍රධාන වෙනස නිසා, bcryptඑක්-මාර්ග හැෂිං ඇල්ගොරිතමයකි. ලුණු, රවුම් සහ යතුර (මුරපදය) නොදැන දැනටමත් ඔබට සාමාන්‍ය පෙළ මුරපදය ලබා ගත නොහැක . [ මූලාශ්‍රය ]

Bcrypt භාවිතා කරන්නේ කෙසේද:

PHP> = 5.5-DEV භාවිතා කිරීම

මුරපද හෑෂ් කිරීමේ කාර්යයන් දැන් කෙලින්ම PHP> = 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 භාවිතා කිරීම (RedHat PHP> = 5.3.3)

ඉහත ක්‍රියාකාරකම්වල ප්‍රභව කේතය මත පදනම්ව නිර්මාණය කරන ලද GitHub හි අනුකූලතා පුස්තකාලයක් ඇත , එය මුලින් C හි ලියා ඇති අතර එය එකම ක්‍රියාකාරීත්වයක් සපයයි. අනුකූලතා පුස්තකාලය ස්ථාපනය කළ පසු, භාවිතය ඉහත ආකාරයටම වේ (ඔබ තවමත් 5.3.x ශාඛාවේ සිටී නම් කෙටිමං අරා අංකනය us ණ කරන්න).

PHP <5.3.7 භාවිතා කිරීම (අවලංගු කරන ලදි)

crypt()ආදාන නූල් වල bcrypt හෑෂ් ජනනය කිරීමට ඔබට ශ්‍රිතය භාවිතා කළ හැකිය . මෙම පන්තියට ස්වයංක්‍රීයව ලවණ උත්පාදනය කළ හැකි අතර ආදානයකට එරෙහිව පවතින හැෂ් සත්‍යාපනය කළ හැකිය. ඔබ PHP අනුවාදයක් 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);

විකල්පයක් ලෙස, ඔබට අතේ ගෙන යා හැකි PHP හැෂිං රාමුව ද භාවිතා කළ හැකිය .


7
Wick දුෂ්ට මැක්කන්: ඔබව කලකිරීමට කණගාටුයි, නමුත් mt_rand()වත්මන් කාලය සහ වර්තමාන ක්‍රියාවලි හැඳුනුම්පත භාවිතා කරමින් බීජ ලබා ගනී. බලන්න, GENERATE_SEED()දී/ext/standard/php_rand.h .
ඇන්ඩ rew මුවර්

53
Ike මයික්: ඉදිරියට යන්න, එය හරියටම එම හේතුව නිසා!
ඇන්ඩ rew මුවර්

14
GetSalt ශ්‍රිතයේ $ ලුණු නූල් වල ආරම්භය වෙනස් කළ යුතු යැයි සිතන ඕනෑම කෙනෙකුට එය අවශ්‍ය නොවේ. Y 2a $ __ යනු CRYPT_BLOWFISH ලුණු වල කොටසකි. ලියකියවිලි වලින්: "ලුණු සහිත බ්ලූෆිෂ් හැෂිං පහත පරිදි වේ:" $ 2a $ ", ඉලක්කම් දෙකක පිරිවැය පරාමිතියක්," $ "සහ හෝඩියේ සිට ඉලක්කම් 22".
jwinn

18
Ic මයිකල් ලැන්ග්: හොඳ දෙය crypt()සම-සමාලෝචනය කර සත්‍යාපනය කරනු ලැබේ. ඉහත කේතය PHP crypt()ලෙස හඳුන්වන අතර එය POSIX crypt()ශ්‍රිතය ලෙස හැඳින්වේ . ඉහත සඳහන් සියලු කේතයන් ඇමතීමට පෙර අහඹු ලුණු උත්පාදනය කරයි (එය ගුප්ත විද්‍යාත්මකව ආරක්ෂිත විය යුතු නැත, ලුණු රහසක් ලෙස නොසැලකේ) crypt(). සමහර විට ඔබ වෘකයා ඇමතීමට පෙර ඔබ ගැන මඳක් පර්යේෂණ කළ යුතුය.
මුවර්

31
මෙම පිළිතුර හොඳ වුවත් එහි වයස පෙන්වීමට පටන් ගෙන ඇති බව කරුණාවෙන් සලකන්න. මෙම කේතය (ඕනෑම PHP ක්‍රියාත්මක කිරීමක් මත රඳා පවතී crypt()) 5.3.7 ට පෙර ආරක්ෂක අවදානමකට යටත් වන අතර (5.3.7 න් පසු (ඉතා සුළු වශයෙන්) අකාර්යක්ෂම වේ - අදාළ ගැටළුව පිළිබඳ විස්තර මෙහි සොයාගත හැකිය . නව මුරපද හැෂිං ඒපීඅයි ( පසුපසට අනුකූල ලිබ් ) දැන් ඔබේ යෙදුමේ bcrypt මුරපද හැෂිං ක්‍රියාත්මක කිරීමේ වඩාත් සුදුසු ක්‍රමය බව කරුණාවෙන් සලකන්න .
ඩේව් රැන්ඩම්

297

ඉතින්, ඔබට bcrypt භාවිතා කිරීමට අවශ්‍යද? නියමයි! කෙසේ වෙතත්, ගුප්ත විද්‍යාවේ වෙනත් අංශ මෙන්, ඔබ එය තනිවම නොකළ යුතුය. යතුරු කළමනාකරණය කිරීම, හෝ ලවණ ගබඩා කිරීම හෝ අහඹු සංඛ්‍යා උත්පාදනය කිරීම වැනි දෙයක් ගැන ඔබට කරදර වීමට අවශ්‍ය නම්, ඔබ එය වැරදිය.

හේතුව සරලයි: bcrypt ඉස්කුරුප්පු කිරීම එතරම් සුළු දෙයක් නොවේ . ඇත්ත වශයෙන්ම, ඔබ මෙම පිටුවේ ඇති සෑම කේතයක්ම පාහේ බැලුවහොත්, එය අවම වශයෙන් මෙම පොදු ගැටළු වලින් එකක්වත් උල්ලං ting නය කරන බව ඔබට පෙනෙනු ඇත.

එයට මුහුණ දෙන්න, ගුප්ත ලේඛනකරණය දුෂ්කර ය.

විශේෂ .යින් සඳහා එය තබන්න. මෙම පුස්තකාල නඩත්තු කිරීම රැකියාවක් කරන පුද්ගලයින් සඳහා එය තබන්න. ඔබට තීරණයක් ගැනීමට අවශ්‍ය නම්, ඔබ එය වැරදිය.

ඒ වෙනුවට පුස්තකාලයක් භාවිතා කරන්න. ඔබගේ අවශ්‍යතා අනුව කිහිපයක් පවතී.

පුස්තකාල

මෙන්න වඩාත් පොදු API වල බිඳවැටීමකි.

PHP 5.5 API - (5.3.7+ සඳහා ලබා ගත හැකිය)

PHP 5.5 සිට, මුරපද හෑෂ් කිරීම සඳහා නව API එකක් හඳුන්වා දෙනු ලැබේ. 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
    }
}

ඇත්ත වශයෙන්ම, එය අතිශයින්ම සරල වීම අරමුණු කර ගෙන ඇත.

සම්පත්:

Zend \ Crypt \ මුරපදය \ Bcrypt (5.3.2+)

මෙය PHP 5.5 ට සමාන තවත් API එකක් වන අතර ඒ හා සමාන අරමුණක් කරයි.

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
    }
}

සම්පත්:

මුරපද ලිබ්

මුරපද හෑෂ් කිරීම සඳහා මෙය තරමක් වෙනස් ප්‍රවේශයකි. පාස්වර්ඩ්ලිබ් හුදෙක් හැෂිං ඇල්ගොරිතම විශාල සංඛ්‍යාවක් සඳහා සහය දක්වයි. ඔබගේ පාලනයෙන් බැහැර විය හැකි උරුමයන් සහ අසමාන පද්ධති සමඟ අනුකූලතාවයට සහාය දැක්වීමට අවශ්‍ය සන්දර්භය තුළ එය ප්‍රධාන වශයෙන් ප්‍රයෝජනවත් වේ. එය හැෂිං ඇල්ගොරිතම විශාල සංඛ්‍යාවක් සඳහා සහය දක්වයි. සහ 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
    }
}

යොමුව:

  • ප්‍රභව කේතය / ප්‍රලේඛනය: GitHub

PHPASS

මෙය bcrypt සඳහා සහය දක්වන තට්ටුවක් වන අතර ඔබට PHP> = 5.3.2 වෙත ප්‍රවේශය නොමැති නම් ප්‍රයෝජනවත් වන තරමක් ශක්තිමත් ඇල්ගොරිතමයකට සහය දක්වයි ... එය ඇත්ත වශයෙන්ම PHP 3.0+ සඳහා සහය දක්වයි (bcrypt සමඟ නොවුනත්).

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
    }
}

සම්පත්

සටහන: විවෘත පවුරේ සත්කාරක නොවන PHPASS විකල්ප භාවිතා නොකරන්න, ඒවා වෙනස් ව්‍යාපෘති වේ !!!

BCrypt ගැන

ඔබ දුටුවහොත්, මෙම සෑම පුස්තකාලයක්ම තනි නූලක් ලබා දෙයි. එයට හේතුව BCrypt අභ්‍යන්තරව ක්‍රියා කරන ආකාරයයි. ඒ ගැන පිළිතුරු ටොන් ගණනක් තිබේ. මෙන්න මම ලියා ඇති තේරීමක්, මම මෙහි පිටපත් / අලවන්නේ නැත, නමුත් මෙයට සබැඳිය:

අවසන් කරන්න

විවිධ තේරීම් තිබේ. ඔබ තෝරාගන්නා දේ ඔබට භාරයි. කෙසේ වෙතත්, මම ඇත ඉතා ඉහල, ඔබ මේ සම්බන්ධයෙන් කටයුතු කිරීම සඳහා ඉහත පුස්තකාල වලින් එකක් භාවිතා බව නිර්දේශ කරමු.

නැවතත්, ඔබ crypt()කෙලින්ම භාවිතා කරන්නේ නම් , ඔබ බොහෝ විට වැරදි දෙයක් කරයි. ඔබගේ කේතය භාවිතා කරන්නේ නම් hash()(හෝ md5()හෝ sha1()සෘජුව), ඔබ පාහේ අනිවාර්යයෙන්ම යමක් වැරදි කරන්නේ.

පුස්තකාලයක් භාවිතා කරන්න ...


7
ලුණු අහඹු ලෙස ජනනය කළ යුතුය, කෙසේ වෙතත් එය ආරක්ෂිත අහඹු ප්‍රභවයකින් පැමිණීමට අවශ්‍ය නොවේ. ලුණු රහසක් නොවේ . ඊළඟ ලුණු අනුමාන කිරීමට හැකිවීම සැබෑ ආරක්ෂක බලපෑමක් නැත; කේතනය කර ඇති එක් එක් මුරපදය සඳහා විවිධ ලවණ ජනනය කිරීම සඳහා ප්‍රමාණවත් තරම් විශාල දත්ත සංචිතයකින් ඔවුන් පැමිණෙන තාක් කල්, ඔබ හොඳයි. ඔබේ හැෂ් නරක අතට පත්වුවහොත් දේදුන්න මේස භාවිතය වැළැක්වීම සඳහා ලුණු ඇති බව මතක තබා ගන්න. ඒවා රහසක් නොවේ.
ඇන්ඩ rew මුවර්

7
Nd ඇන්ඩ rew මූර් ඇත්තෙන්ම නිවැරදිය! කෙසේ වෙතත්, ලුණු වලට සංඛ්‍යානමය වශයෙන් අද්විතීය වීමට තරම් එන්ට්‍රොපිය තිබිය යුතුය. ඔබගේ යෙදුමේ පමණක් නොව, සියලු යෙදුම්වල. එබැවින් mt_rand()ප්‍රමාණවත් තරම් ඉහළ කාල පරිච්ඡේදයක් ඇත, නමුත් බීජ වටිනාකම බිටු 32 ක් පමණි. එබැවින් mt_rand()effectively ලදායී ලෙස භාවිතා කිරීම මඟින් එන්ට්‍රොපි බිටු 32 කට පමණක් සීමා වේ. උපන්දින ගැටලුවට ස්තූතිවන්ත වන අතර ඔබට ජනනය කළ ලවණ 7k (ගෝලීයව) පමණක් ගැටීමට 50% ක අවස්ථාවක් තිබේ. bcryptලුණු බිටු 128 ක් පිළිගන්නා බැවින්, බිටු 128 ක් සැපයිය හැකි ප්‍රභවයක් භාවිතා කිරීම වඩා හොඳය ;-). (බිටු 128 දී, 2e19 හැෂ් වලදී ision ට්ටනය වීමේ 50% ක අවස්ථාවක්) ...
ircmaxell

1
circmaxell: "ප්‍රමාණවත් තරම් විශාල දත්ත සංචිතයක්" හෙන්ස් කරන්න. කෙසේ වෙතත් ඔබේ මූලාශ්‍රය ඉතා ඉහළ එන්ට්‍රොපි ප්‍රභවයක් විය යුතු නැත, එය බිටු 128 සඳහා ප්‍රමාණවත් තරම් ඉහළය. කෙසේ වෙතත්, ඔබ සතුව ඇති සියලුම ප්‍රභවයන් අවසන් වී ඇත්නම් (OpenSSL, ආදිය නොමැත ...) සහ ඔබේ එකම පසුබෑම mt_rand () නම්, එය විකල්පයට වඩා හොඳය (එය සසම්භාවී ()).
ඇන්ඩ rew මුවර්

4
Nd ඇන්ඩ rew මූර්: නියත වශයෙන්ම. එය තර්ක නොකරයි. එය mt_randසහ uniqid(සහ ඒ නිසා lcg_valueසහ rand) පළමු තේරීම් නොවේ ...
ircmaxell

1
ircmaxell, 5.3.xx සඳහා මුරපද_කොම්පට් පුස්තකාලයට බොහොම ස්තූතියි, අපට මෙය මීට පෙර අවශ්‍ය නොවූ නමුත් දැන් අපි 5.3.xx php සේවාදායකයක් මත කරන්නෙමු, මෙම තර්කනය කිරීමට උත්සාහ නොකිරීමට ඔබගේ පැහැදිලි උපදෙස් වලට ස්තූතියි තමන්ම.
Lizardx

47

දේදුන්න වගු සමඟ ඇති තරම් තොරතුරු ඔබට ලැබෙනු ඇත : ආරක්ෂිත මුරපද යෝජනා ක්‍රම හෝ අතේ ගෙන යා හැකි PHP මුරපද හැෂිං රාමුව ගැන ඔබ දැනගත යුතු දේ .

ඉලක්කය වන්නේ මුරපදය මන්දගාමී දෙයක් සමඟ හෑෂ් කිරීමයි, එබැවින් ඔබගේ මුරපද දත්ත ගබඩාව ලබා ගන්නා අයෙකු එය තිරිසන් ලෙස බල කිරීමට උත්සාහ කරමින් මිය යනු ඇත (මුරපදයක් පරීක්ෂා කිරීමට එම්එස් 10 ප්‍රමාද වීම ඔබට කිසිවක් නොවේ, යමෙකු එය බලහත්කාරයෙන් බලෙන් පැටවීමට උත්සාහ කරයි). Bcrypt මන්දගාමී වන අතර එය කෙතරම් මන්දගාමීද යන්න තෝරා ගැනීමට පරාමිතියක් සමඟ භාවිතා කළ හැකිය.


7
ඔබට අවශ්‍ය ඕනෑම දෙයක් බලාත්මක කරන්න, පරිශීලකයන් එකම මුරපදය ඉස්කුරුප්පු කර විවිධ දේ සඳහා භාවිතා කරයි. එබැවින් ඔබට එය හැකි තරම් ආරක්ෂා කිරීමට හෝ මුරපදයක් (SSO, openID ආදිය) ගබඩා කිරීමට අවශ්‍ය නොවන දෙයක් ක්‍රියාත්මක කිරීමට සිදුවේ.
ආර්ක්

41
මුරපද හැෂිං භාවිතා කරනුයේ එක් ප්‍රහාරයකින් ආරක්ෂා වීමට ය: යමෙක් ඔබේ දත්ත ගබඩාව සොරකම් කර පැහැදිලි පා lo ක පිවිසුම් + මුරපද ලබා ගැනීමට අවශ්‍යය.
ආර්ක්

4
@ ජොෂ් කේ. සරල මුරපද කිහිපයක් phpass සුසර කිරීමෙන් පසු ඒවා බිඳ දැමීමට උත්සාහ කරන ලෙස මම ඔබව දිරිමත් කරමි, එවිට එය ඔබේ වෙබ් සේවාදායකයේ ගණනය කිරීමට 1ms සහ 10ms අතර කාලයක් ගතවේ.
ආර්ක්

3
එකඟ විය. නමුත් මුරපදයක් ලෙස qwerty භාවිතා කරන ආකාරයේ පරිශීලකයෙක් ඔහුට (සහ ප්‍රහාරකයින්ට) පහසුවෙන් කියවිය හැකි ඕනෑම තැනක ඕනෑම සංකීර්ණ එකක් සලකුණු කරන ආකාරයේ පරිශීලකයෙකි. Bcrypt භාවිතා කරන දෙය නම්, ඔබේ කැමැත්තට පටහැනිව ඔබේ ඩීබී ප්‍රසිද්ධියට පත්වන විට, pass | $$ & ZL6- as වැනි මුරපදයක් ඇති පරිශීලකයා වෙත ලබා ගැනීම දුෂ්කර වනු ඇත.
ආර්ක්

4
එය කිරීම කිසිසේත් අවහිර නොකිරීමට වඩා හානිකර බව සඳහන් කිරීම වටී. එය "සේවා ප්‍රතික්ෂේප කිරීම" දෛශිකයක් ලෙස පහසුවෙන් සැලකේ. දන්නා ඕනෑම ගිණුමක නරක පිවිසුම් අයාචිත තැපැල් කිරීම ආරම්භ කරන්න, එවිට ඔබට බොහෝ පරිශීලකයින් ඉතා පහසුවෙන් කඩාකප්පල් කළ හැකිය. ප්රවේශය සම්පූර්ණයෙන්ම ප්රතික්ෂේප කිරීම වඩා ප්රහාරකයාට තාර දැමීම (ප්රමාද කිරීම) වඩා හොඳය, විශේෂයෙන් එය ගෙවන පාරිභෝගිකයෙකු නම්.
ඩේමියන්බ්

36

ඔබට PHP හි crypt()ක්‍රියාකාරීත්වය භාවිතා කර bcrypt සමඟ එක්-මාර්ග හැෂ් එකක් සෑදිය හැකිය . සමස්ත සමීකරණයේ වැදගත්ම දෙය නම් A) ඇල්ගොරිතම සම්මුතියකට ලක් නොවීම සහ B) ඔබ එක් එක් මුරපදය නිසි ලෙස ලුණු දැමීමයි . යෙදුම පුරා ලුණු භාවිතා නොකරන්න; එමඟින් රේන්බෝ වගු එකකින් පහර දීමට ඔබේ මුළු යෙදුමම විවෘත වේ.

PHP - ගුප්ත ක්‍රියාකාරිත්වය


4
මෙය නිවැරදි ප්‍රවේශයයි - crypt()විවිධ මුරපද හැෂිං කාර්යයන් සඳහා සහය දක්වන PHP හි ශ්‍රිතය භාවිතා කරන්න . ඔබ භාවිතා නොකරන බවට වග බලා ගන්න CRYPT_STD_DESහෝ CRYPT_EXT_DES- වෙනත් ඕනෑම ආධාරක වර්ගයක් හොඳයි (සහ නම යටතේ bcrypt ඇතුළත් වේ CRYPT_BLOWFISH).
කැෆේ

4
SHA සැබවින්ම පිරිවැය පරාමිතියක් ද ඇත, 'වට' විකල්පය හරහා. එය භාවිතා කරන විට, bcrypt ට අනුග්‍රහය දැක්වීමට කිසිදු හේතුවක් මා දකින්නේ නැත.
පීටර් එනස්

3
ඇත්ත වශයෙන්ම, මුරපදයේ තනි SHA-1 (හෝ MD5) තවමත් පහසුවෙන් තිරිසන්-බලයෙන් ක්‍රියා කළ හැකි අතර, ලුණු සමඟ හෝ රහිතව (ලුණු දේදුන්න මේසවලට එරෙහිව මිස තිරිසන් බල කිරීමට එරෙහිව නොවේ). Bcrypt භාවිතා කරන්න.
Paŭlo Ebermann

සෑම කෙනෙකුම php හි ගුප්ත () යනුවෙන් අදහස් කරන විට "bcrypt" යැයි පැවසීම මට කරදරයක් ලෙස පෙනේ.
ස්ලික්

3
An පනික් ඇයි? ඇල්ගොරිතම bcrypt ලෙස හැඳින්වේ . cryptමුරපද හැෂ් කිහිපයක් නිරාවරණය කරයි, bcrypt CRYPT_BLOWFISHනියතයට අනුරූප වේ. Bcrypt දැනට සහාය දක්වන ශක්තිමත්ම ඇල්ගොරිතම වන cryptඅතර එය සහාය දක්වන තවත් කිහිප දෙනෙක් තරමක් දුර්වල ය.
CodesInChaos

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
ලුණු සෑදීම වැඩිදියුණු කළ හැකිය (මෙහෙයුම් පද්ධතියේ අහඹු ප්‍රභවය භාවිතා කරන්න), එසේ නොමැතිනම් එය මට හොඳ පෙනුමක්. නව PHP අනුවාද සඳහා 2yඒ වෙනුවට භාවිතා කිරීම වඩා හොඳය 2a.
martinstoeckli

mcrypt_create_iv($size, MCRYPT_DEV_URANDOM)ලුණු සඳහා ප්‍රභවයක් ලෙස භාවිතා කරන්න .
කෝඩ්ස්ඉන්චෝස්

මට මොහොතක් ලැබුණු විට mcrypt_create_iv () දෙස සමීප බැල්මක් හෙළමි, වෙන කිසිවක් නොමැති නම් එය කාර්ය සාධනය තරමක් දියුණු කළ යුතුය.
ජෝන් හුල්කා

2
Base64 කේතන ක්‍රමය එකතු කර අභිරුචි හෝඩියේ bcryptභාවිතයට පරිවර්තනය කරන්න . mcrypt_create_iv(17, MCRYPT_DEV_URANDOM), str_replace('+', '.', base64_encode($rawSalt)),$salt = substr($salt, 0, 22);
CodesInChaos

1
On ජොන්හුල්කා - PHP හි අනුකූලතා ඇසුරුම [127 වන පේළිය] දෙස බලන්න , මෙය සරල ක්‍රියාත්මක කිරීමකි.
martinstoeckli

29

PHP හි 5.5 අනුවාදයට BCrypt, කාර්යයන් password_hash()සහ password_verify(). ඇත්ත වශයෙන්ම මේවා ශ්‍රිතය වටා එතීම පමණක් වන අතර crypt()එය නිවැරදිව භාවිතා කිරීම පහසු කරයි. එය ආරක්ෂිත අහඹු ලුණු උත්පාදනය ගැන සැලකිලිමත් වන අතර හොඳ පෙරනිමි අගයන් සපයයි.

මෙම කාර්යයන් භාවිතා කිරීමට පහසුම ක්‍රමය වනුයේ:

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

මෙම කේතය මඟින් මුරපදය BCrypt (ඇල්ගොරිතම 2y) සමඟ හෑෂ් කරනු ඇත , මෙහෙයුම් පද්ධතියේ අහඹු ප්‍රභවයෙන් අහඹු ලුණු ජනනය කරයි, සහ පෙරනිමි පිරිවැය පරාමිතිය භාවිතා කරයි (මේ මොහොතේ මෙය 10 වේ). පරිශීලකයා මුරපදය ඇතුළත් කළ විට දැනටමත් ගබඩා කර ඇති හැෂ් අගයට ගැලපේදැයි දෙවන පේළිය පරීක්ෂා කරයි.

ඔබට පිරිවැය පරාමිතිය වෙනස් කිරීමට අවශ්‍ය නම්, ඔබට මෙය මේ ආකාරයෙන් කළ හැකිය, පිරිවැය පරාමිතිය 1 කින් වැඩි කිරීම, හැෂ් අගය ගණනය කිරීමට අවශ්‍ය කාලය දෙගුණ කරයි:

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

"cost"පරාමිතියට හාත්පසින්ම වෙනස්ව, පරාමිතිය මඟ හැරීම වඩාත් සුදුසුය "salt", මන්දයත් ගුප්ත විද්‍යාත්මකව ආරක්ෂිත ලුණු නිර්මාණය කිරීම සඳහා ශ්‍රිතය දැනටමත් උපරිම උත්සාහයක් දරන බැවිනි.

PHP අනුවාදය 5.3.7 සහ ඊට පසුව, ශ්‍රිතය සෑදූ එම කතුවරයාගේම අනුකූලතා ඇසුරුමක්password_hash() තිබේ. 5.3.7 ට පෙර PHP අනුවාද සඳහා , යුනිකෝඩ් ආරක්ෂිත BCrypt ඇල්ගොරිතම crypt()සමඟ සහය නොමැත 2y. යමෙකුට එය වෙනුවට ආදේශ කළ හැකිය, එය 2aපෙර PHP අනුවාද සඳහා හොඳම විකල්පයයි.


3
මම මෙය කියවීමෙන් පසු මගේ පළමු සිතුවිල්ල වූයේ "ඔබ ජනනය කරන ලුණු ගබඩා කරන්නේ කෙසේද" යන්නයි. ඩොක්ස් හරහා සිදුරු කිරීමෙන් පසුව, මුරපදය_හෂ් () ශ්‍රිතය සංකේතාංකන ක්‍රමය, ලුණු සහ ජනනය කළ හැෂ් ගබඩා කරන නූලක් ජනනය කරයි. එබැවින්, එය මුරපදය_වෛරීකරණය () ක්‍රියාකාරීත්වය සඳහා අවශ්‍ය සෑම දෙයක්ම එක පේළියක ගබඩා කරයි. මෙය සඳහන් කිරීමට අවශ්‍ය වූයේ එය අන් අයට පෙනෙන විට එය ප්‍රයෝජනවත් විය හැකි බැවිනි.
jzimmerman2011

z jzimmerman2011 - හරියටම, වෙනත් පිළිතුරකින් මම මෙම ගබඩා ආකෘතිය උදාහරණයකින් පැහැදිලි කිරීමට උත්සාහ කළෙමි .
martinstoeckli

7

වර්තමාන චින්තනය: හැෂ් ලබා ගත හැකි වේගය අඩු විය යුතුය, හැකි වේගවත්ම නොවේ. මෙය දේදුන්න මේස ප්‍රහාර මැඩපවත්වයි .

ඒ හා සම්බන්ධ, නමුත් පූර්වාරක්ෂාව: ප්‍රහාරකයාට කිසි විටෙකත් ඔබගේ පිවිසුම් තිරයට අසීමිත ප්‍රවේශයක් නොතිබිය යුතුය. එය වලක්වා ගැනීම සඳහා: යූආර්අයි සමඟ සෑම පහරක්ම සටහන් කරන IP ලිපින ෙසොයා ගැනීෙම් වගුවක් සකසන්න. ඕනෑම මිනිත්තු පහක කාලයක් තුළ එකම IP ලිපිනයෙන් පිවිසීමට උත්සාහයන් 5 කට වඩා තිබේ නම්, පැහැදිලි කිරීම සමඟ අවහිර කරන්න. ද්විතීයික ප්‍රවේශයක් නම් බැංකු මෙන් ද්වි-ස්ථර මුරපද ක්‍රමයක් තිබීමයි. දෙවන මුරපදයේ අසමත් වීම සඳහා අගුළු දැමීම ආරක්ෂාව වැඩි කරයි.

සාරාංශය: කාලය ගතවන හැෂ් කාර්යයන් භාවිතා කරමින් ප්‍රහාරකයාගේ වේගය අඩු කරන්න. එසේම, ඔබගේ පිවිසුමට බොහෝ ප්‍රවේශයන් අවහිර කර දෙවන මුරපද ස්ථරයක් එක් කරන්න.


මම හිතන්නේ ඔවුන් සිතන්නේ වෙනත් ආකාරයකින් මාගේ ඩීබී සොරකම් කිරීමට ප්‍රහාරකයා දැනටමත් සමත් වී ඇති අතර, දැන් මුරපද ලබා ගැනීමට උත්සාහ කරන්නේ ඒවා පේපෑල් හෝ වෙනත් දෙයක් මත අත්හදා බැලීමට ය.
විල්ක්ස්-

4
2012 න් අඩක් ගෙවී ඇති අතර මෙම පිළිතුර තවමත් විස්මයජනක ය, මන්දගාමී හැෂිං ඇල්ගොරිතම දේදුන්න මේස ප්‍රහාර වළක්වා ගන්නේ කෙසේද? මම හිතුවේ අහඹු බයිට් පරාසයක ලුණු කළා කියලා? හැෂිං ඇල්ගොරිතමයේ වේගය මඟින් ඔවුන් ලබා ගත් හැෂ් වලට එරෙහිව කොපමණ වාර ගණනක් යැවිය හැකිදැයි මම නිතරම සිතුවෙමි. අසාර්ථක ලොජින් ප්‍රයත්නයන්හි පරිශීලකයෙකු කිසි විටෙකත් අවහිර නොකරන්න, ඔබේ පරිශීලකයින් පෝෂණය වනු ඇතැයි මා විශ්වාස කරයි, බොහෝ විට සමහර වෙබ් අඩවි වල මගේ මුරපදය මතක තබා ගැනීමට පෙර 5 ගුණයකින් වැඩි වාර ගණනක් ප්‍රවේශ විය යුතුය. දෙවන පාස් ස්ථරය ක්‍රියා නොකරයි, ජංගම දුරකථන කේතය සහිත පියවර දෙකක සහතිකයක් වුවද.
සම්මේ

1
Am සම්මායි මම මේකට එකඟ වෙමි. අසාර්ථක පිවිසුම් උත්සාහයන් 5 ක් මත මම වාරණයක් සකසා, එය ඉක්මණින් 7 දක්වා ඉහළ නැංවීමට පෙර, දැන් 10 හි 20 හි වාඩි වී සිටිමි. සාමාන්‍ය පරිශීලකයෙකුට අසාර්ථක පිවිසුම් උත්සාහයන් 20 ක් නොතිබිය යුතු නමුත් තිරිසන් බල ප්‍රහාර පහසුවෙන් නැවැත්විය හැකි තරම් අඩුය
ru ස් ඇල්ඩ්‍රිජ්

Ru බ ru ස් ඇල්ඩ්‍රිජ් මම පෞද්ගලිකව සිතන්නේ ඔබේ ස්ක්‍රිප්ට් එක අහඹු ලෙස කාලයක් සඳහා විරාමයක් තැබීම වඩා හොඳ වනු ඇති බවයි. අවහිර කිරීම යනු ඉතා ආක්‍රමණශීලී පියවරකි.
සම්මේ

1
Am සම්මායි මම එකඟයි ස්ථිර කුට්ටි නරකයි. මා සඳහන් කරන්නේ අසාර්ථක උත්සාහයන් ගණන සමඟ වැඩි වන තාවකාලික වාරණයකි.
ru ස් ඇල්ඩ්‍රිජ්

7

මෙන්න මෙම පැරණි ප්‍රශ්නයට යාවත්කාලීන පිළිතුරක්!

5.5 සිට PHP හි මුරපද හැෂ් password_hash()කිරීමට නිවැරදි ක්‍රමය සමඟ ඇති අතර ඒවා සත්‍යාපනය කිරීමේ නිවැරදි ක්‍රමය සමඟ ඇති password_verify()අතර මෙය PHP 8.0 හි තවමත් සත්‍ය වේ. මෙම කාර්යයන් පෙරනිමියෙන් bcrypt හෑෂ් භාවිතා කරයි, නමුත් වෙනත් ශක්තිමත් ඇල්ගොරිතම එකතු කර ඇත. password_hashපරාමිතීන් හරහා ඔබට වැඩ සාධකය වෙනස් කළ හැකිය (ගුප්තකේතනය කෙතරම් “ශක්තිමත්ද”) .

කෙසේ වෙතත්, එය තවමත් ප්‍රමාණවත් තරම් ශක්තිමත් වුවත්, bcrypt තවදුරටත් නවීනතම ලෙස නොසැලකේ ; රහස් පදය එහි පූරක ගණිත ක්රමයක් වඩා හොඳ කට්ටලයක් ලෙස පැමිණ ඇත Argon2 Argon2i, Argon2d සමග, සහ Argon2id ප්රභේද්යයන්. ඔවුන් අතර වෙනස ( මෙහි විස්තර කර ඇති පරිදි ):

Argon2 ට එක් ප්‍රාථමික ප්‍රභේදයක් ඇත: Argon2id, සහ අතිරේක ප්‍රභේද දෙකක්: Argon2d සහ Argon2i. Argon2d දත්ත මත පදනම් වූ මතක ප්‍රවේශය භාවිතා කරයි, එමඟින් ගුප්ත-මුදල් හා වැඩ-සනාථ කිරීමේ යෙදුම් සඳහා අතුරු නාලිකා කාල ප්‍රහාර වලින් තර්ජනයක් නොමැත. Argon2i දත්ත-ස්වාධීන මතක ප්‍රවේශය භාවිතා කරයි, එය මුරපද හෑෂ් කිරීම සහ මුරපදය මත පදනම් වූ යතුරු ව්‍යුත්පන්නය සඳහා වඩාත් සුදුසු වේ. ආර්ගොන් 2 අයිඩී මතකයේ පළමු පුනරාවර්තනයේ පළමු භාගය සඳහා ආර්ගොන් 2 අයි ලෙසද, ඉතිරි කොටස සඳහා ආර්ගොන් 2 ඩී ලෙසද ක්‍රියා කරයි, එමඟින් කාල-මතක වෙළඳාම හේතුවෙන් පැති නාලිකා ප්‍රහාර ආරක්ෂාව සහ තිරිසන් බල පිරිවැය ඉතිරිකිරීම් සපයයි.

ආර්ගොන් 2i සහය PHP 7.2 හි එකතු කරන ලද අතර ඔබ එය මේ ආකාරයෙන් ඉල්ලා සිටී:

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

සහ PHP 7.3 හි Argon2id සහය එක් කරන ලදි:

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

මුරපද සත්‍යාපනය සඳහා කිසිදු වෙනසක් අවශ්‍ය නොවන බැවින් එහි ප්‍රති has ලයක් ලෙස ඇති හැෂ් නූල් වල ඇල්ගොරිතම, ලුණු සහ වැඩ කරන සාධක භාවිතා කරන විට එය භාවිතා කරන ලද්දේ කෙසේද යන්න පිළිබඳ තොරතුරු අඩංගු වේ.

බෙහෙවින් වෙන වෙනම (සහ තරමක් අතිරික්තව), ලිබ්සෝඩියම් (PHP 7.2 හි එකතු කර ඇත) ද ආර්ගොන් 2 හැෂිං sodium_crypto_pwhash_str ()සහ sodium_crypto_pwhash_str_verify()ශ්‍රිත හරහා සපයයි , එය PHP බිල්ට්-ඉන් වලට සමාන ආකාරයකින් ක්‍රියා කරයි. මේවා භාවිතා කිරීමට එක් හේතුවක් නම්, සමහර විට PHP ලිබාර්ගන් 2 නොමැතිව සම්පාදනය කළ හැකි අතර, එමඟින් ආගෝන් 2 ඇල්ගොරිතම මුරපදය_හෂ් ශ්‍රිතයට ලබා ගත නොහැක. PHP 7.2 සහ ඊට වැඩි සෑම විටම ලිබ්සෝඩියම් සක්‍රීය කර තිබිය යුතුය, නමුත් එය එසේ නොවිය හැකිය - නමුත් අවම වශයෙන් ඔබට එම ඇල්ගොරිතමයෙන් ලබා ගත හැකි ක්‍රම දෙකක් තිබේ. මෙන්න ඔබට ලිබ්සෝඩියම් සමඟ Argon2id හෑෂ් එකක් සාදා ගත හැකි ආකාරය (PHP 7.2 හි පවා, වෙනත් ආකාරයකින් Argon2id සහය නොමැති)):

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

අතින් ලුණු නියම කිරීමට එය ඔබට ඉඩ නොදෙන බව සලකන්න; මෙය ලිබ්සෝඩියම් ආචාර ධර්මවල කොටසකි - ආරක්ෂාව අඩාල කළ හැකි අගයන් සඳහා පරාමිතීන් සැකසීමට පරිශීලකයින්ට ඉඩ නොදෙන්න - නිදසුනක් ලෙස PHP හි password_hashක්‍රියාකාරීත්වයට හිස් ලුණු නූලක් යැවීමෙන් ඔබව වළක්වන කිසිවක් නැත ; ලිබ්සෝඩියම් ඔබට එතරම් මෝඩ දෙයක් කිරීමට ඉඩ නොදේ!



1

මුරපදය පැහැදිලි පා text යක් දත්ත ගබඩාවේ ගබඩා කිරීම අප කවුරුත් දන්නා පරිදි ආරක්ෂිත නොවේ. bcrypt යනු හෑෂ් කිරීමේ මුරපද තාක්‍ෂණයකි. එය මුරපද ආරක්ෂාව සඳහා භාවිතා කරයි. bcrypt හි පුදුමාකාර කාර්යයක් වන්නේ එය අපව හැකර්වරුන්ගෙන් ගලවා ගැනීමයි. එය මුරපදය අනවසරයෙන් ආරක්ෂා කිරීමට භාවිතා කරයි.

password_hash () ශ්‍රිතය නව මුරපද හැෂ් එකක් සෑදීමට භාවිතා කරයි. එය ශක්තිමත් සහ ශක්තිමත් හැෂිං ඇල්ගොරිතමයක් භාවිතා කරයි. මුරපදය_හෂ් () ශ්‍රිතය ගුප්ත () ශ්‍රිතයට බෙහෙවින් අනුකූල වේ. එබැවින්, ගුප්ත () විසින් සාදන ලද මුරපද හැෂ් මුරපද_හෂ් () සමඟ භාවිතා කළ හැකිය. Password_verify () සහ password_hash () යන ශ්‍රිත ගුප්ත () වටා ඇති එතීම් පමණක් වන අතර ඒවා නිවැරදිව භාවිතා කිරීම පහසු කරයි.

සින්ටැක්ස්

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

මුරපදය_හෂ් () ශ්‍රිතය මඟින් පහත දැක්වෙන ඇල්ගොරිතම සඳහා දැනට සහය දක්වයි:

PASSWORD_DEFAULT PASSWORD_BCRYPT PASSWORD_ARGON2I PASSWORD_ARGON2ID

පරාමිතීන්: මෙම ශ්‍රිතය ඉහත සඳහන් කළ පරිදි පරාමිති තුනක් පිළිගෙන පහත විස්තර කර ඇත:

මුරපදය : එය පරිශීලකයාගේ මුරපදය ගබඩා කරයි. ඇල්ගෝ : මුරපදය හැෂ් කිරීම සිදුවන විට භාවිතා කළ යුතු ඇල්ගොරිතම දක්වමින් අඛණ්ඩව භාවිතා කරනුයේ මුරපද ඇල්ගොරිතම නියතයයි. විකල්ප : එය සහායක අරාවකි, එහි විකල්ප අඩංගු වේ. මෙය ඉවත් කර ඇතුළත් නොකළහොත් අහඹු ලුණු භාවිතා කිරීමට යන අතර පෙරනිමි පිරිවැයක් භාවිතා කිරීම සිදුවනු ඇත. ප්‍රතිලාභ අගය : එය සාර්ථකත්වය පිළිබඳ හැෂ් මුරපදය හෝ අසාර්ථකත්වය පිළිබඳ අසත්‍යය ලබා දෙයි.

උදාහරණය :

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

පහත වැඩසටහන් මඟින් PHP හි මුරපදය_හෂ් () ශ්‍රිතය නිරූපණය කරයි:

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

පිටත

$2y$10$Z166W1fBdsLcXPVQVfPw/uRq1ueWMA6sLt9bmdUFz9AmOGLdM393G

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.