パスワードストレージスキームを安全にする最も簡単な方法は、標準ライブラリを使用することです。
セキュリティは、ほとんどのプログラマーが単独で取り組むよりもはるかに複雑で、目に見えない失敗の可能性がある傾向があるため、標準ライブラリを使用するのがほとんどの場合、最も簡単で最も安全な(唯一ではないにしても)利用可能なオプションです。
新しいPHPパスワードAPI(5.5.0+)
PHPバージョン5.5.0以降を使用している場合は、新しい簡略化されたパスワードハッシュAPIを使用できます。
PHPのパスワードAPIを使用したコードの例:
<?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';
}
(レガシー5.3.7以降をまだ使用している場合は、ircmaxell / password_compatをインストールして、組み込み関数にアクセスできます)
塩漬けハッシュの改善:コショウを追加
追加のセキュリティが必要な場合、セキュリティ担当者は現在(2017)、(自動的に)ソルトされたパスワードハッシュに「ペッパー」を追加することを推奨しています。
このパターンを安全に実装する単純なドロップインクラスがあります
。Netsilik/PepperedPasswords
(github)をお勧めします。
MITライセンスが付属しているので、プロプライエタリプロジェクトでも好きなように使用できます。
を使用したコードの例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';
}
OLD標準ライブラリ
注意:これはもう必要ないはずです!これは歴史的な目的のためだけにここにあります。
ご覧ください:ポータブルPHPパスワードハッシュフレームワーク:phpassCRYPT_BLOWFISH
そして可能な限りアルゴリズムを使用することを確認してください。
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は、いくつかの非常によく知られているプロジェクトに実装されています。
- phpBB3
- WordPress2.5+およびbbPress
- Drupal 7リリース(Drupal 5および6で利用可能なモジュール)
- その他
良い点は、詳細について心配する必要がないことです。これらの詳細は、経験豊富な人々によってプログラムされ、インターネット上の多くの人々によってレビューされています。
パスワードの保存スキームの詳細については、Jeffのブログ投稿を参照してください:パスワードを誤って保存している可能性があります
あなたが「私はそれを自分でやる、ありがとう」のアプローチのために行くならあなたが何をするにしても、使わないMD5
か、SHA1
もう。これらは優れたハッシュアルゴリズムですが、セキュリティ上の理由から壊れていると見なされます。
現在、cryptを使用し、CRYPT_BLOWFISHを使用するのがベストプラクティスです。
PHPのCRYPT_BLOWFISHは、Bcryptハッシュの実装です。BcryptはBlowfishブロック暗号に基づいており、アルゴリズムを遅くするために高価なキー設定を利用しています。