#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); в строке сделал хэши одинаковыми. Спасибо!