パスワードストレージスキームを安全にする最も簡単な方法は、標準ライブラリを使用することです。
セキュリティは、ほとんどのプログラマが単独で取り組むよりもはるかに複雑で目に見えない混乱の可能性がある傾向があるため、標準ライブラリを使用することは、ほとんど常に最も簡単で最も安全な(唯一ではないにせよ)利用可能なオプションです。
新しい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年)、(自動的に)ソルトされたパスワードハッシュに' pepper 'を追加することを推奨しています。
このパターンを安全に実装する単純なドロップインクラスがあります。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
- WordPress 2.5以降およびbbPress
- Drupal 7リリース(Drupal 5および6で利用可能なモジュール)
- その他
良い点は、詳細について心配する必要がないことです。これらの詳細は、経験を持つ人々によってプログラムされ、インターネット上の多くの人々によってレビューされています。
パスワードの保存方法の詳細については、Jeffのブログ投稿を読んでください:パスワードを誤って保存している可能性があります
「私は自分でやるよ、ありがとう」というアプローチをとるなら、何をするにMD5
せよ、SHA1
もう使わないでください。これらは優れたハッシュアルゴリズムですが、セキュリティ上の理由から壊れていると考えられています。
現在、CRYPT_BLOWFISHでcryptを使用することがベストプラクティスです。
PHPのCRYPT_BLOWFISHは、Bcryptハッシュの実装です。BcryptはBlowfishブロック暗号に基づいており、アルゴリズムの速度を落とすために高価なキー設定を利用しています。