1

一意のソルトが必要なアプリケーションを再設計しています。

私はそれが正しい方法で機能しないか、それとも他の方法で改善できるかを聞くのを楽しみにしています.

public function generatesalt($x=0)
{
    $x++;

    $string = md5(uniqid(rand(), true));
    $salt = substr($string, 0, 12);

    $stored = array();
    $qw = $this->registry->dbi->query("SELECT `salt` FROM `".PRE."membership`")->results();
    foreach ($qw as $k => $v)
        $stored[] = $v['salt'];


    if (in_array($salt,$stored))
        return $this->generatesalt($x);

    return $salt." /// ".$x;
}   

ありがとう。繰り返しますが、私の質問は、これが正しい方法で機能しているように見え、重大な欠点が見られないかどうかです。

4

2 に答える 2

3

理論的には、ソルトは、そのソルトを使用して他のパスワードをハッシュしてはならないという意味でのみ一意である必要があります。アイデアは、悪者がハッシュをクラックすることを不可能にすることです。ソルトを使用し、パスワードを正しくハッシュした場合 (つまり、bcrypt、scrypt、pbkdf2 などを使用)、ほんの一握りのパスワードをクラックするだけでも、データベース全体は言うまでもなく長い時間がかかります。

実際には、十分に長いランダムに生成されたソルトは、複数回発生する可能性は低いため、十分に優れている必要があります。

PHP でソルトを生成する簡単な方法は、mcrypt_create_iv(). システムからランダムなビットを生成します。これは、簡単に保管できるようにエンコードできます。

function randomSalt($length = 16) {
    $bits = mcrypt_create_iv($length);
    $encoded = base64_encode($bits);
    return substr($encoded, 0, $length);
}
echo randomSalt(); // Something like: "Yt5iX/LvdxOyxCiX"

最後に、塩は秘密である必要はありません。それが塩が使われる理由ではありません。角の店に歩いて行きたいと想像してください。5分かかります。ここで、24 時間の迂回を余儀なくされていると想像してください。それが塩です。ハッシュ化された新しいパスワードをクラックするたびに、悪者が乗り越えなければならないのは大きな困難です。(注: 24 時間は単なる例です。所要時間はいくつかの要因によって異なりますが、おわかりいただけると思います。)

于 2013-02-23T23:46:55.863 に答える
0

パスワードハッシュも含むデータベースにソルトを保存することは、事前にハッシュされた文字列に未知の文字列を追加するという目的を無効にしますか?

ハッカーがデータベースへのアクセスを取得し、データベースへのアクセスのみを取得した場合、彼らはソルトとハッシュを取得します。PHP定義で宣言された静的ソルトがある場合、同じ情報を取得するにはサーバーアクセスとデータベースアクセスが必要になります。

また、可能であればSQLユーザーから出力権限を削除して、ハッカーがデータベースアクセスだけでシェルをサーバーに配置してPHP定義のソルトを取得できないようにする必要があります。

于 2013-02-23T23:16:33.857 に答える