SORU
25 Ocak 2011, Salı


Nasıl PHP bir karma parolalar için bcrypt kullanıyor musunuz?

Şimdi danışmak duyuyorum "PHP, bcrypt kuralları saklamak parolalar için bcrypt Kullanın". her zaman

Ama bcrypt nedir? PHP herhangi bir tür işlevler, dosya şifreleme programı hakkında Wikipedia saçmalıyor sunmuyor ve Web aramaları sadece farklı dillerde Blowfish birkaç uygulamaları ortaya koyuyor. Şimdi balon Balığı da mcrypt ama nasıl saklamak şifreleri ki?) PHP içinde kullanılabilir Blowfish genel amaçlı bir şifreleme, iki taraflı. Eğer şifreli olabilir, çözülebilir. Şifreler tek yönlü bir fonksiyon karma gerekiyor.

Bunun açıklaması nedir?

CEVAP
13 HAZİRAN 2011, PAZARTESİ


bcrypt donanım (tur yapılandırılabilir bir sayı) ile ölçeklenebilir olan karma bir algoritma. Yavaşlık ve birden çok mermi saldırgan, büyük Fonlar ve donanım şifreleri kırmak mümkün dağıtması gerekir sağlar. Her şifre salts Ekle (bcrypt tuz GEREKTİRİR) ve bir saldırı fonlar veya donanım ya da gülünç miktarda olmadan neredeyse olanaksız olduğunu emin olabilirsiniz.

bcrypt kullanırEksblowfishkarma algoritması kullanarak şifreler. Şifreleme aşamasında ikenEksblowfishveBlowfishtam olarak aynı anahtar zamanlama aşamasıEksblowfishherhangi bir sonraki devlet hem de tuz ve anahtar bağlı olmasını sağlar (kullanıcı parolası) ve devletin de bilgisi olmadan önceden hesaplanan olabilir.Bu önemli fark, bcrypt çünkü tek yönlü karma algoritma.Olamaz zaten tuz bilerek, mermi olmadan düz metin parola almakve anahtar(parola). [Source]

Nasıl bcrypt kullanmak için:

PHP ^ kullanarak . = 5.5-DEV

Parola karma fonksiyonlar have now been built directly into PHP >= 5.5. Şimdi password_hash() herhangi bir şifre bcrypt karma oluşturmak için kullanabilirsiniz:

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

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

Bir kullanıcı, varolan bir karma karşı sağlanan parola doğrulamak için, gibi password_verify() kullanabilirsiniz:

<?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 ^ kullanarak . = 5.3.7, &; 5.5-DEV (RedHat PHP >lt = 5.3.3)

GitHub compatibility library yukarıdaki fonksiyonları aslında aynı işlevi sağlayan C ile yazılmış kaynak kodu temel alınarak oluşturulmuş. Uyumluluk kitaplığı yüklendikten sonra kullanımı yukarıdaki gibi aynı (eksi steno dizi Eğer hala 5.3 eğer gösterimde.x şube).

Kullanarak PHP < 5.3.7(Kullanım dışı)

crypt() giriş dizeleri bcrypt karma oluşturmak için işlevini kullanabilirsiniz. Bu sınıf otomatik olarak tuzlar oluşturmak ve bir giriş karşı varolan karma doğrulayabilirsiniz.Eğer PHP sürümü veya daha yüksek tavsiye edilir 5.3.7, eşit kullanıyorsanız, yerleşik bir işlev veya uyumluluğu kitaplığı kullanın. Bu alternatif tarihi amaçlı sağlanmıştır.

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$d$', $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 (1);

    return $output;
  }
}

Bu şekilde bu kodu kullanabilirsiniz:

$bcrypt = new Bcrypt(15);

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

Alternatif olarak, aynı zamanda Portable PHP Hashing Framework kullanabilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS North America

    ASUS North A

    12 AĞUSTOS 2008
  • ExcelIsFun

    ExcelIsFun

    16 ŞUBAT 2008
  • HBO

    HBO

    17 Mayıs 2006