-4

この機能は、パスワードと電子メールのハッシュ/暗号化に対して安全ですか? 編集:明らかに違います!

$password = mysql_real_escape_string(htmlspecialchars(trim($_POST['password'])));
$hash_algo = "sha512";
$raw_output = false;

$hash = hash($hash_algo, $password, $raw_output);
$hash_20 = substr($hash, 0, 20);

$salt = substr($hash, -20); 
$crypt = crypt ( $hash_20, $salt);
$crypt_20 = substr($crypt, 0, 20);

編集:これが私が今使っているコードです。これはかなり安全だと思います。これは、ランダム ソルト ジェネレーターを備えた PBKDF2 パスワード ハッシュ関数です。

これが PBKDF2 関数です。p はパスワードです。s は塩です。c は反復用です kl はキーの長さ用です。a はハッシュアルゴリズムです。

function pbkdf2( $p, $s, $c, $kl, $a = 'sha256' )
{ 
    $hl = strlen(hash($a, null, true)); # Hash length
    $kb = ceil($kl / $hl);              # Key blocks to compute
    $dk = '';                           # Derived key

    # Create key
    for ( $block = 1; $block <= $kb; $block ++ ) {

        # Initial hash for this block
        $ib = $b = hash_hmac($a, $s . pack('N', $block), $p, true);

        # Perform block iterations
        for ( $i = 1; $i < $c; $i ++ )

            # XOR each iterate
            $ib ^= ($b = hash_hmac($a, $b, $p, true));

        $dk .= $ib; # Append iterated block
    }

    # Return derived key of correct length
    return substr($dk, 0, $kl);
}

ソルトジェネレーター:

function salt( $length )
{
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  
    $salt="";
    $size = strlen( $chars );

    for( $i = 0; $i < $length; $i++ )
    {
        $salt.= $chars[ rand( 0, $size - 1 ) ];
    }

    return $salt;

}

使用中で:

if(isset($_POST['submit']))
{

    $Password = mysql_real_escape_string(htmlspecialchars(trim($_POST['Password'])));

    //To make sure the salt has never more chars than the password.
    $salt_length = strlen($Password); 
    $salt = salt($salt_length);

    //Hash Password 
    $hash = base64_encode(pbkdf2($Password, $salt, 100000, 32));
    //--------------//
}

少しグーグルで検索すると、100000回の反復はかなり安全ですが、10000回で十分だと思います。

4

1 に答える 1

3

入力をハッシュしているため、単純に元の値に戻すことはできません。攻撃者がこのアルゴリズムを知っていると仮定すると、問題は、パスワードをブルート フォースするのにどれくらいの時間がかかるかということです。そのために、アルゴリズムの 1 回の反復にかかる時間をテストします。次に、攻撃者がハイエンド マシンで考えられるすべてのパスワードを試すために何回試行する必要があるかを計算します。次に、アルゴリズムがどれほど「安全」かという答えが得られます。あなたは、少なくとも数千年、できればビッグバンで測定された答えを探しています。

つまり、アルゴリズムに対する実際の攻撃がないと仮定すると、攻撃者はその時間を短縮するために試みることができます。

入力自体からソルトを導出しているため、アルゴリズムを少し拡張しているだけです。入力に依存しないランダムな一意の値である実際のソルトを使用していません。そのため、それほど複雑ではないハッシュアルゴリズムで無塩の入力を使用しています。このアルゴリズムで「保護」されたパスワードのデータベース全体をブルート フォースすることはそれほど難しくないと思います。

于 2012-08-15T08:48:49.350 に答える