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