2

セッションを使用せずにユーザーのログインを検証するために、比較的安全な情報を Cookie に保存できるようにする小さなスクリプトに取り組んでいます。出力の一部は、Cookie に格納されている一部の情報とデータベース内の一部のユーザー情報を使用して hmac_hash を生成するときに使用する暗号化されたソルトです。

ただし、いくつかのテストの後、文字列の暗号化/復号化の問題に遭遇し、異なるハッシュ結果が発生しました。

すなわち:

$str = '123456abcdef';
$hash1 = sha1($str);

$v1 = do_encrypt($str);
$v2 = do_decrypt($v1);

$hash2 = sha1($v2);

そして私は

$hash1 - d4fbef92af33c1789d9130384a56737d181cc6df 
$hash2 - 0d6034f417c2cfe1d60d263101dc0f8354a1216f

しかし、両方の文字列をエコーすると、両方とも 123456abcdef になります。

do_encrypt 関数は次のとおりです。

function do_encrypt($value) {

    $salt = generate_salt();
    $td = mcrypt_module_open('rijndael-256', '', 'cbc', '');
    mcrypt_generic_init($td, $ek, $salt);
    $encrypted_data = mcrypt_generic($td, $value);

    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return base64_encode($salt.$encrypted_data);    
}

do_decrypt 関数:

function do_decrypt($value) {

    $data = base64_decode($value);
    $salt = substr($data, 0, 32);
    $data = substr($data, 32, strlen($data));
    $td = mcrypt_module_open('rijndael-256', '', 'cbc', '');
    mcrypt_generic_init($td, $ek, $salt);
    $decrypted_data = mdecrypt_generic($td, $data);

    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $decrypted_data;
}

どちらの関数でも、$ek は別のファイルから取得した暗号化キーです。

表示される文字が同じである理由を理解しようとしていますが、実際の変数は異なります (それ以外の場合、ハッシュ結果は同じになります)。ハッシュの目的で両方の文字列が同一であることを確認する方法はありますか?

ありがとう、ライアン。

4

1 に答える 1

2

コメントによると、末尾のヌルを取得しているようです-mcrypt のブロックサイズは 32 バイトであり、暗号化/復号化された文字列はこのバイト数の倍数である必要があります。

mcrypt_encrypt ドキュメントから取得:

データのサイズが n * ブロックサイズでない場合、データは '\0' で埋められます。

于 2011-10-09T06:40:49.270 に答える