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
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.
Nasıl JavaScript ile boş bir dize için...
Veritabanı öğeleri için kaynak kontrol...
Nasıl uygulamak için !önemli kullanıyo...
Nasıl Karma bir anahtarı kaldırın ve R...
Nasıl NSAttributedString kullanıyor mu...