Kohana v 2.3.4 で認証モジュールを使用しています。
ユーザーの認証に関しては、2 段階のプロセスがあります。エントリ ポイントは関数 login です。最初のタスクは、データベースに保存されているパスワードを取得し、パスワードを取得してソルト値を決定することです。ソルトは、値の配列によって決定されると思われます。各値は、ソルトのさらに別の部分を導入するために $salt.$password ハッシュ値内のポイントに対応します。私の場合、md5 を使用しています。
問題:
この SALT 値の構成が見つかりません。データベースに保存されているパスワード内に既に存在するものに依存しているようです。このログインは移植可能で再現可能である必要があるため、AUTH を構成する必要がありますか? ソルトを検出できない場合、 hash_password ルーチンで、デフォルトで uniqid() を使用しますが、これはまったく移植可能ではないと思います。
ユーザーの追加に関して、この機能を追加するために Auth ライブラリを変更することは理にかなっていますか? つまり、私が言うことができる独自のカスタマイズされた SALT を導入し、それに対して MD5 ハッシュを実行し、salt によって生成されたその md5 を使用して、md5sum の特定のポイントでパスワードをシードしますか?
私はセキュリティの専門家ではありませんが、これは行き過ぎですか? 確かに、md5 パスワード リストにアクセスしようとしていた誰かが、事前に定義されたハッシュの md5 ルックアップを使用するのを防ぎます。
Kohana PHP フレームワークを使用したことがある場合、この問題に対する適切なアプローチについて洞察を与える可能性のある、それを使用した後に学んだ教訓や経験があれば、お知らせください。私はそれについて多くのフォーラムやウィキを読んでいますが、私が見た実際の具体的な意見はまだありません. 私は基本的に、PHP を使用して、最終的には iPhone などのモバイル デバイスから、このサイトで誰かを認証するための再現可能なアプローチを得ようとしています。また、最終的には、openID のサポートと統合のために Google フレンド コネクトのサポートを追加することも考えています。
以下は、対象の関数に関する Kohana の Auth モジュールのスニペットです。何が起こっているのかをよりよく理解しようとしているので、それらにはいくつかのデバッグがあります。
public function login($username, $password, $remember = FALSE)
{
if (empty($password))
return FALSE;
if (is_string($password))
{
// Get the salt from the stored password
$salt = $this->find_salt($this->driver->password($username));
Kohana::log('debug', "--- Auth_Core login salt = $salt ");
Kohana::log('debug', "--- Auth_Core login pass = $password ");
// Create a hashed password using the salt from the stored password
$password = $this->hash_password($password, $salt);
}
Kohana::log('debug', "--- Auth_Core login pass_hash = $password ");
return $this->driver->login($username, $password, $remember);
}
public function find_salt($password)
{
$salt = '';
foreach ($this->config['salt_pattern'] as $i => $offset)
{
// Find salt characters, take a good long look...
//$salt .= $password[$offset + $i];
$salt .= substr($password, $offset + $i, 0);
}
return $salt;
}
public function hash_password($password, $salt = FALSE)
{
Kohana::log('debug', "--- Auth_Core Original Pass = $password ");
if ($salt === FALSE)
{
// Create a salt seed, same length as the number of offsets in the pattern
$salt = substr($this->hash(uniqid(NULL, TRUE)), 0, count($this->config['salt_pattern']));
Kohana::log('debug', "--- Auth_Core salt created = $salt ");
}
// Password hash that the salt will be inserted into
$hash = $this->hash($salt.$password);
// Change salt to an array
$salt = str_split($salt, 1);
// Returned password
$password = '';
// Used to calculate the length of splits
$last_offset = 0;
foreach ($this->config['salt_pattern'] as $offset)
{
// Split a new part of the hash off
$part = substr($hash, 0, $offset - $last_offset);
// Cut the current part out of the hash
$hash = substr($hash, $offset - $last_offset);
// Add the part to the password, appending the salt character
$password .= $part.array_shift($salt);
// Set the last offset to the current offset
$last_offset = $offset;
}
Kohana::log('debug', "--- Auth_Core hashpw = $password + $hash ");
// Return the password, with the remaining hash appended
return $password.$hash;
}