2012-03-24 5 views
2

私はPHPを使用してログインシステムを作成しようとしています。私のスクリプトが本当に良いかどうかはわかりません。PHPのパスワードハッシュ:私はこの権利をしていますか?

私は2つの関数を作成しました.1つはハッシュを作成し、もう1つはチェックアウトします。

は、機能をチェックアウト:

function createSaltedPass($pass = false, $username = false) { 
    if($pass && $username) 
    { 
    $salt = hash('sha256', uniqid(mt_rand(), true) . md5(date('d m Y H i s') . " # ") . $username); 

    $pass = hash('sha256', $salt . $pass . $salt); 

    $pass = $salt . $pass; 

    return $pass; 
    } 
} 

上記のスニペットは、巨大なハッシュを(特定の128個の文字であるために)作成し、それは本当に安全ですかどうかはわかりません。

前半は塩で、必要なときにチェックすることができます。

後半は実際の塩漬けのパスワードです。

パスワードの例を参照してください:最初の関数を使用した後、パスワードを確認するための機能で

939cf87873a402d48bcf66a57b64ca38d6f1db9155381ffe1aae9a469e93d1e7ec338071f2dd21a96ef5fc799a3f3921b0df3188458b17422db79271056a1fda

ルック:

function checkSaltedPass($dbPass = false, $pass = false) { 
    if($pass && $dbPass) 
    { 
    $salt = substr($dbPass, 0, 64); 

    $pass = hash('sha256', $salt . $pass . $salt); 

    $pass = $salt . $pass; 

    return $pass; 
    } 
} 

あなたはそれについてどう思いますか?私はセキュリティの専門家ではなく、誰かが私にヒントを与えることができれば幸いです。

もう1つだけ:ユーザーをログイン状態に保つためにセッションを処理するより良い方法はありますか?

(申し訳ありませんが、悪い英語については、私の母国語ではありません)。

+0

なぜ塩を2回ハッシュしていますか?また、 'checkSaltedPass'は(ハッシュされた)パスワードが一致するかどうかを決してチェックしません! –

+0

さて、最初の部分は塩のハッシュを作成し、2番目の部分は同じように行いますが、3番目の部分の連結でパスワードを一緒に使用します。塩とパスワード(これがパスワードの最初の64文字(ハッシュ)が塩になると言っていた理由です)。だから、私は将来それをチェックすることができます。 – Foreba

+0

salt + pass + saltをハッシュする必要はありません。ちょうどハッシュソルト+パス。塩を使用すると、2回目に暗号値が追加されません。また、パスワードごとに異なる限り、ハッシュを真にランダムにする必要はありません。 –

答えて

0

代わりのhash()機能を使用します。

はまた、約 timing attacks

編集をお読みください。パスワードをハッシュするのに適しています。また、塩とハッシュを一緒に保管することもできます。

ユーザーのログインを維持するために、タブ/ブラウザを閉じるとセッションが終了します。ユーザーに長い時間ログインさせる場合は、Cookieを使用する必要があります。私はそれのための "保護" クッキー使用することをお勧めします

データを|タイムスタンプ|検証ハッシュ

検証ハッシュはdata + timestamp + some predefined stringから作成されます。これにより、ユーザがdataの部分を乱していないことを確認できます。また、私はIPの使用には注意が必要です。これにより保護が強化されますが、モバイルデバイス(ラップトップも含む)の使用はやや厄介なものになります。

+0

私はちょうどここの陰謀をチェックしていました...しかし、その場合、私は同じ機能を使用することができません...少なくとも私はそうだと思う(私は確かにそれほど多くのことを実際にテストしていない) – Foreba

1

この場合、パスワードが2つのsha1ハッシュ文字列で連結されていることは明らかです。両方のハッシュをチェックして攻撃者が無理やり強制することは簡単です。あなたはやっているだけです...それは全くチェックしていません!

私の意見では、静的なセキュリティの塩は、登録日、登録IP(など)のような静的なユーザーの情報と後で連結することができます。

その後の使用は次のようになめらかになります:

$pass = sha1($password . $staticSalt . $registerDate); 

これのadventageも、攻撃者は、その後passwordフィールドに見つかった文字列を入れた後、ブルートフォースとの衝突を見つけるならば、パスワードはに評価だろうということです:

$bruteForcedPassword . $staticSalt . $registerDate 

これは、ユーザーのハッシュパスワードとはまだ異なります。

この攻撃者は、静的セキュリティーの塩、パスワード文字列とユーザーの登録日(またはパスワードに組み入れられた他のもの)の作成方法を知っておく必要があります。 それとも、あなたがcrypt()を使用する必要があり、このlibrary for password hashing

+0

しかし、ハッカーがあなたのデータベースを盗むなら、少し難しいと思っていますが、知っている人は、ブルートフォース法を使ってパスワードを作成するために必要なすべての情報を見つけることができます。 – Foreba

+0

ハードコードされた静的セキュリティーソルトを見てください。そして、たとえ彼があなたのデータベースを入手したとしても、彼は情報を持っていますが、あなたはどのようにしてハッシュを作成しているのでしょうか?どの情報をあなたが使ったのですか?彼はコードを必要とし、コードを取得すれば何もあなたを救うことはできません:P –

+0

haha​​ha、はい...私はその点であなたに同意します:) – Foreba

1

私は機能がかなり冗長だと思います uniqidはすでに現在の時刻に基づいています。

function createSaltedPass($pass) { 
    $salt = hash('sha256', uniqid(mt_rand(), true)); 
    $pass = hash('sha256', $salt . $pass); 
    return $salt . $pass; 
} 

しかし、すべてのことハッシングのものはあまり重要ではありません、私

に十分に見えます。
本当に重要なことは、パスワードの強さです。
弱いパスワードハッシュに対しては役に立たない。

+0

はい、私はそれについても考えました。私はそれを変更します。 – Foreba

関連する問題