Yani, bcrypt kullanmak ister misin? Müthiş! Ancak, diğer şifreleme alanları gibi, bunu kendiniz yapmamalısınız. Anahtarları yönetmek, tuz depolamak veya rasgele sayılar üretmek gibi bir şey hakkında endişelenmeniz gerekiyorsa, bunu yanlış yapıyorsunuz.
Nedeni basit: bcrypt'i vidalamak çok kolay . Aslında, bu sayfadaki hemen hemen her kod parçasına bakarsanız, bunun bu yaygın sorunlardan en az birini ihlal ettiğini fark edeceksiniz.
Yüzleş, Kriptografi zor.
Uzmanlara bırakın. İşi bu kütüphaneleri korumak olan insanlar için bırakın. Bir karar vermeniz gerekiyorsa, yanlış yapıyorsunuz.
Bunun yerine bir kütüphane kullanın. İhtiyaçlarınıza bağlı olarak birkaç tane var.
Kütüphaneler
Aşağıda, daha yaygın olan bazı API'ların dökümü verilmiştir.
PHP 5.5 API - (5.3.7+ için kullanılabilir)
PHP 5.5'ten başlayarak, parolaları karmaleştirmek için yeni bir API tanıtılmaktadır. 5.3.7+ için (benim tarafımdan) korunan bir şim uyumluluk kütüphanesi de var. Bunun hakemli ve kullanımı kolay bir uygulama olma avantajı vardır .
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
}
}
Gerçekten, son derece basit olması amaçlanıyor.
Kaynaklar:
Zend \ Crypt \ Password \ Bcrypt (5.3.2+)
Bu, PHP 5.5'inkine benzer başka bir API ve benzer bir amaç yapıyor.
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
}
}
Kaynaklar:
PasswordLib
Bu, parola karma işlemine biraz farklı bir yaklaşımdır. PasswordLib sadece bcrypt'i desteklemek yerine çok sayıda karma algoritmasını destekler. Temel olarak, kontrolünüz dışında olabilecek eski ve farklı sistemlerle uyumluluğu desteklemeniz gereken bağlamlarda yararlıdır. Çok sayıda karma algoritmasını destekler. Ve 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
}
}
Referanslar:
- Kaynak Kodu / Belgeler: GitHub
PHPASS
Bu, bcrypt'i destekleyen bir katmandır, ancak PHP> = 5.3.2'ye erişiminiz yoksa kullanışlı olan oldukça güçlü bir algoritmayı da destekler ... Aslında PHP 3.0+'yi destekler (bcrypt ile olmasa da).
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
}
}
kaynaklar
Not: Açık duvarda barındırılmayan PHPASS alternatiflerini kullanmayın, bunlar farklı projelerdir !!!
BCrypt Hakkında
Dikkat ederseniz, bu kitaplıkların her biri tek bir dize döndürür. Bunun nedeni BCrypt'in dahili olarak nasıl çalıştığıdır. Ve bununla ilgili bir ton TON var. Burada yazdığım, buraya kopyalayamayacağım / yapıştıramayacağım, ancak bağlantı veren bir seçim:
Sarmak
Birçok farklı seçenek var. Seçtiğiniz size kalmış. Ancak, bunu sizin için yukarıdaki kütüphanelerden birini kullanmanızı şiddetle tavsiye ederim.
Yine, crypt()
doğrudan kullanıyorsanız , muhtemelen yanlış bir şey yapıyorsunuzdur. Kodunuz doğrudan hash()
(veya md5()
veya sha1()
) kullanıyorsa , neredeyse kesinlikle yanlış bir şey yapıyorsunuzdur.
Sadece bir kütüphane kullanın ...