Проблемы с шифрованием / хешированием

#php #hash #sha1 #mcrypt #rijndael

#php #хэш #sha1 #mcrypt #rijndael

Вопрос:

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

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

ie:

 $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. Шифрование / дешифрование не имеет отношения к хешированию, существует только хеширование для сопоставления одного хэшированного значения с другим сгенерированным значением хэша. != Хеширование шифрования.

3. @jaredfarrish Я знаю разницу между ними. Я шифрую дополнительную часть, которая будет сохранена в файле cookie, чтобы при ее извлечении я мог расшифровать значение для использования в качестве соли hmac.

4. @mazzzzz Я добавил функцию do_encrypt.

5. Использование вашего собственного метода шифрования может привести к ошибкам. Вам нужно было бы быть очень методичным в том, что вы делали. Если вы можете, взгляните на php.net/manual/en/book.openssl.php ; при шифровании и хешировании вам почти всегда будет лучше использовать известные, проверенные методы, чем доморощенные методы.

Ответ №1:

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

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

Если размер данных не равен n * blocksize, данные будут дополнены символом ‘ 0’.

Комментарии:

1. Вы были правы. Выполнение $ v2 = str_replace(«», «», $ v2); в строке сделал хэши одинаковыми. Спасибо!