5

Kohana v 2.3.4 で認証モジュールを使用しています。

ユーザーの認証に関しては、2 段階のプロセスがあります。エントリ ポイントは関数 login です。最初のタスクは、データベースに保存されているパスワードを取得し、パスワードを取得してソルト値を決定することです。ソルトは、値の配列によって決定されると思われます。各値は、ソルトのさらに別の部分を導入するために $salt.$password ハッシュ値内のポイントに対応します。私の場合、md5 を使用しています。

問題:

  1. この SALT 値の構成が見つかりません。データベースに保存されているパスワード内に既に存在するものに依存しているようです。このログインは移植可能で再現可能である必要があるため、AUTH を構成する必要がありますか? ソルトを検出できない場合、 hash_password ルーチンで、デフォルトで uniqid() を使用しますが、これはまったく移植可能ではないと思います。

  2. ユーザーの追加に関して、この機能を追加するために Auth ライブラリを変更することは理にかなっていますか? つまり、私が言うことができる独自のカスタマイズされた SALT を導入し、それに対して MD5 ハッシュを実行し、salt によって生成されたその md5 を使用して、md5sum の特定のポイントでパスワードをシードしますか?

  3. 私はセキュリティの専門家ではありませんが、これは行き過ぎですか? 確かに、md5 パスワード リストにアクセスしようとしていた誰かが、事前に定義されたハッシュの md5 ルックアップを使用するのを防ぎます。

  4. 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;
}
4

2 に答える 2

3

ポイント 1 に関して、このhash_password()関数は、データベースに保存されるパスワード ハッシュ (ソルトに対して、ソルトを含む) を生成する (サインアップ時など) だけでなく、パスワードが必要なときにそのハッシュを再作成するためにも使用されます。検証済み (例: ログイン時)。この関数は、パスワード ハッシュ自体で指定されたhash_password()(または何も指定されていない場合) ソルトをエンコードします。これは、 がキーuniqid()である暗号化の形式です。salt_patternを秘密にしておくことができる場合salt_pattern、ハッシュの方法が再現できないため、敵対者がオフラインでハッシュの総当たり攻撃を行うことができないため、追加のセキュリティが提供されます (を秘密にできる場合)。salt_pattern

// Signup time; forget about uniqid(); you can use any salt that
// you please; once the password hash is stored in the database there
// is no need to know where your salt came from since it will be
// included in the password hash.
$password_hash = hash_password($password, FALSE);

// Login time; note that the salt is taken from the password hash itself.
$reproduced = hash_password($password, find_salt($password_hash));
$verifies   = $password_hash == $reproduced;

このhash_password()関数は、最初にソルトに対してパスワードをハッシュし、次にソルトの各文字をパスワード ハッシュの対応するsalt_patternオフセットに挿入します。find_salt()ハッシュを再現できるように、これらのソルト文字を抽出します。hash_password()ソルトの暗号化と復号化として見ることができますfind_salt()hash_password()ソルトを隠して見つけていることもわかりますが、この暗号化方法はステガノグラフィーfind_salt()とは呼べないと思います。なぜなら、パスワードハッシュと共に保存されたソルトがあることはコードから明らかだからです(塩は秘密ではありません)。

ポイント 2 に関しては、独自のソルトを使用するのは簡単で、Auth モジュールおよび既存のデータベースと完全に互換性があります。

ポイント 3 に関しては、ユーザーごとのソルト (uniqid()デフォルト)を使用することはやり過ぎではありません。特に MD5 はセキュリティ上の目的で壊れており、今日の技術では衝突の検出がすでに実用的です。bcrypt()ブルートフォーシングの試みを阻止するために、意図的に遅いハッシュアルゴリズムを使用するものを使用することをお勧めします。

ポイント 4 については、Kohana フレームワークを使用したことがありませんが、Auth モジュールの再現または移植は簡単です。salt_patternはハッシュ アルゴリズムの重要な部分であるため、忘れたり紛失したりしないように注意する必要があります。決定的な敵対者がパスワードハッシュを総当たり攻撃するのを防ぐ唯一salt_patternのものであるため、これも秘密にしておく必要があります。は合理的なデフォルトであり、必要なものに置き換えることができます (ユーザーごとであり、サイト全体の値ではない場合)。uniqid()


また、ポータブルbcrypt()および PHPに関するスタックオーバーフローに関する非常に良い回答があります。当然、それは Auth モジュールと互換性がありませんsalt_pattenが、スロー ハッシュを使用し、 .

于 2009-11-16T08:08:40.330 に答える
3

問題 1.ソルト構成は に保存されていconfig/auth.phpます。そのファイルを で見つけmodules/auth/config、次に自分のapp/configフォルダーで見つけます (すでにご存知かもしれませんが、Kohana はカスケード ファイル システム メカニズムを使用しています)。フォルダーにカスタマイズすることをお勧めするデフォルトのファイルはapp/config/、次のようになります。

<?php defined('SYSPATH') OR die('No direct access allowed.');

return array
(
  'driver' => 'ORM',
  'hash_method' => 'sha1',
  'salt_pattern' => '1, 3, 5, 9, 14, 15, 20, 21, 28, 30',
  'lifetime' => 1209600,
  'session_key' => 'auth_user',
  'users' => array
  (
      // 'admin' => 'b3154acf3a344170077d11bdb5fff31532f679a1919e716a02',
  ),
);

問題 2.私の意見では、Salt を挿入した SHA1 である Auth で使用されるパスワード ハッシュ メカニズムは、salt、つまりauth.phpファイルを安全に保つ限り、非常に安全です。

問題 3. Auth の組み込みハッシュ メカニズムは SHA1 を使用しますが、これは MD5 よりも比較的クラックプルーフです。セキュリティの専門家である Thomas Ptacek は、ブログで次のように書いています。

いいえ、本当に。他人のパスワード システムを使用します。自分でビルドしないでください。

業界で最悪のセキュリティ問題 (悪名高い LANMAN ハッシュなど) のほとんどは、賢明な開発者が残りのコードと同じ方法でセキュリティ コードにアプローチしたために発生しました。

問題 4.はい、Kohana を使用して小さな会社の Web サイトといくつかのクライアントの Web サイトを構築しています。実際のセキュリティ関連の Web サイトに使用しました。しかし、一般的に言えば、Kohana は、特にカスケード ファイルシステム メカニズムを備えた優れたフレームワークであると言えます。

于 2009-11-16T09:58:07.800 に答える