Najłatwiejszym sposobem zabezpieczenia schematu przechowywania haseł jest użycie biblioteki standardowej .
Ponieważ zabezpieczenia wydają się być o wiele bardziej skomplikowane i mają więcej niewidocznych możliwości zepsucia, niż większość programistów mogłaby rozwiązać samodzielnie, korzystanie z biblioteki standardowej jest prawie zawsze najłatwiejszą i najbezpieczniejszą (jeśli nie jedyną) dostępną opcją.
Nowy interfejs API haseł PHP (5.5.0+)
Jeśli używasz PHP w wersji 5.5.0 lub nowszej, możesz użyć nowego uproszczonego interfejsu API do mieszania haseł
Przykład kodu używającego API haseł PHP:
<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);
// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
(Jeśli nadal używasz starszej wersji 5.3.7 lub nowszej, możesz zainstalować ircmaxell / password_compat, aby mieć dostęp do wbudowanych funkcji)
Poprawa po solonych haszyszach: dodaj pieprz
Jeśli chcesz dodatkowego bezpieczeństwa, specjaliści od bezpieczeństwa teraz (2017) zalecają dodanie „ pieprzu ” do (automatycznie) zasolonych skrótów haseł.
Jest prosta, upuszczona klasa, która bezpiecznie implementuje ten wzorzec, polecam:
Netsilik / PepperedPasswords
( github ).
Pochodzi z licencją MIT, więc możesz go używać w dowolny sposób, nawet w projektach zastrzeżonych.
Przykład kodu wykorzystującego Netsilik/PepperedPasswords
:
<?php
use Netsilik/Lib/PepperedPasswords;
// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');
$hasher = new PepperedPasswords($config['pepper']);
// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);
// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
Stara biblioteka standardowa
Uwaga: nie powinieneś już tego potrzebować! To jest tutaj tylko w celach historycznych.
Spójrz na: Przenośny framework do haszowania haseł PHP : phpass i upewnij się, że używasz CRYPT_BLOWFISH
algorytmu, jeśli to w ogóle możliwe.
Przykład kodu wykorzystującego phpass (v0.2):
<?php
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );
// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
PHPass został zaimplementowany w kilku dobrze znanych projektach:
- phpBB3
- WordPress 2.5+ oraz bbPress
- wydanie Drupal 7 (moduł dostępny dla Drupal 5 i 6)
- inni
Dobrą rzeczą jest to, że nie musisz martwić się o szczegóły, te szczegóły zostały zaprogramowane przez ludzi z doświadczeniem i sprawdzone przez wiele osób w Internecie.
Aby uzyskać więcej informacji na temat schematów przechowywania haseł, przeczytaj wpis w blogu Jeffa : Prawdopodobnie przechowujesz hasła nieprawidłowo
Cokolwiek zrobisz, jeśli zdecydujesz się na podejście „ Zrobię to sam, dziękuję ”, nie używaj MD5
lub SHA1
więcej . Są niezłym algorytmem mieszającym, ale ze względów bezpieczeństwa uważa się, że jest uszkodzony .
Obecnie najlepszym rozwiązaniem jest używanie crypt z CRYPT_BLOWFISH.
CRYPT_BLOWFISH w PHP to implementacja skrótu Bcrypt. Bcrypt jest oparty na szyfrze blokowym Blowfish, wykorzystując kosztowną konfigurację klucza, aby spowolnić algorytm.