Проблемы с шифрованием / хешированием - PullRequest
2 голосов
/ 09 октября 2011

Я работаю над небольшим сценарием, который позволит мне хранить относительно безопасную информацию в cookie-файле, чтобы подтвердить логин пользователя без использования сессий. Часть вывода представляет собой зашифрованную соль для использования при генерации hmac_hash с некоторой информацией, хранящейся в cookie, и некоторой информацией о пользователе в базе данных.

Однако после некоторого тестирования я столкнулся с проблемой шифрования / дешифрования строк и получения разных результатов хеширования.

есть:

$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 - это ключ шифрования, извлеченный из другого файла.

Я пытаюсь понять, почему отображаемые символы одинаковы, но фактические переменные разные (в противном случае результаты хеширования будут одинаковыми), и есть ли способ убедиться, что обе строки идентичны для целей хеширования

Спасибо, Райан.

1 Ответ

2 голосов
/ 09 октября 2011

Согласно комментариям, похоже, что вы получаете завершающие нули - вполне вероятно, что mcrypt имеет размер блока 32 байта и что любая зашифрованная / расшифрованная строка должна быть кратна этому числу байтов.

Взято из mcrypt_encrypt документации:

Если размер данных не n * размер блока, данные будут дополнены '\ 0'.

...