だから、あなたはbcryptを使いたいですか?驚くばかり!ただし、暗号化の他の領域と同様に、自分で行うべきではありません。キーの管理、ソルトの保存、乱数の生成などについて心配する必要がある場合は、間違っています。
その理由は簡単です。bcryptを台無しにするのは簡単なことです。実際、このページのほとんどすべてのコードを見ると、これらの一般的な問題の少なくとも1つに違反していることがわかります。
それに直面して、暗号化は難しいです。
専門家にお任せください。これらのライブラリを維持するのが仕事の人のために残してください。決定を下す必要がある場合、それは間違っています。
代わりに、ライブラリを使用してください。要件に応じていくつか存在します。
図書館
以下は、より一般的なAPIの内訳です。
PHP 5.5 API-(5.3.7以降で利用可能)
PHP 5.5以降、パスワードをハッシュするための新しいAPIが導入されています。5.3.7以降用に維持されている(私が)シム互換性ライブラリもあります。これは、ピアレビューおよびという利点がある簡単な使用への実装を。
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
}
}
本当に、それは非常にシンプルであることを目指しています。
リソース:
Zend \ Crypt \ Password \ Bcrypt(5.3.2+)
これは、PHP 5.5に似た別のAPIであり、同様の目的を果たします。
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
}
}
リソース:
PasswordLib
これは、パスワードハッシュに対する少し異なるアプローチです。PasswordLibは単にbcryptをサポートするのではなく、多数のハッシュアルゴリズムをサポートしています。これは主に、制御できない可能性があるレガシーシステムと異種システムとの互換性をサポートする必要がある状況で役立ちます。多数のハッシュアルゴリズムをサポートしています。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
}
}
参照:
PHPASS
これはbcryptをサポートする層ですが、PHP> = 5.3.2にアクセスできない場合に便利なかなり強力なアルゴリズムもサポートします。
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
}
}
資源
注意: OpenwallでホストされていないPHPASSの代替を使用しないでこれらは別のプロジェクトです!!!
BCryptについて
気づいたら、これらのライブラリはすべて1つの文字列を返します。これは、BCryptが内部でどのように機能するかによるものです。そして、それについてたくさんの答えがあります。ここに私が書いたセレクションがあります。ここにはコピー/貼り付けしませんが、リンクします。
要約
多くの異なる選択肢があります。どちらを選ぶかはあなた次第です。ただし、これを処理するには、上記のライブラリのいずれかを使用することを強くお勧めします。
繰り返しますが、crypt()
直接使用している場合は、おそらく何かが間違っています。コードがhash()
(またはmd5()
またはsha1()
)を直接使用している場合は、ほぼ間違いなく何かが間違っています。
ライブラリを使用するだけ...