私は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つだけ:ユーザーをログイン状態に保つためにセッションを処理するより良い方法はありますか?
(申し訳ありませんが、悪い英語については、私の母国語ではありません)。
なぜ塩を2回ハッシュしていますか?また、 'checkSaltedPass'は(ハッシュされた)パスワードが一致するかどうかを決してチェックしません! –
さて、最初の部分は塩のハッシュを作成し、2番目の部分は同じように行いますが、3番目の部分の連結でパスワードを一緒に使用します。塩とパスワード(これがパスワードの最初の64文字(ハッシュ)が塩になると言っていた理由です)。だから、私は将来それをチェックすることができます。 – Foreba
salt + pass + saltをハッシュする必要はありません。ちょうどハッシュソルト+パス。塩を使用すると、2回目に暗号値が追加されません。また、パスワードごとに異なる限り、ハッシュを真にランダムにする必要はありません。 –