Безопасно ли использовать bin2hex()
на выходе openssl_random_pseudo_bytes()
и mcrypt_create_iv()
, чтобы иметь их как Hex вместо двоичных необработанных данных для использования в качестве IV, или это риск для безопасности и не рекомендуется?Можно ли использовать bin2hex() на выходе openssl_random_pseudo_bytes?
ответ
Инициализационный вектор (IV) является максимальным размером блока для большинства режимов блочного шифрования. Его использование заключается в рандомизации шифрования, так что если вы шифруете одно и то же сообщение с одним и тем же ключом, каждый раз появляется что-то другое. Это важное свойство семантической безопасности.
Если вы кодируете необработанный вывод openssl_random_pseudo_bytes()
в шестнадцатеричный, то вы теряете установленную половину бит IV до известного значения (0).
Примеры:
Важным свойством IV в режиме CBC является то, что он должен быть непредсказуемы. Если вы используете AES с размером блока 128 бит, это приведет к IV с 64 переменными битами, что упростит прогнозирование IV, но не обязательно легко. См. this example.
В режиме CTR, ХВ должен быть уникальным и, как правило, называют Nonce. Если ИВ повторно используется, тогда может быть возможно вывести открытые тексты оригинала и нового сообщения. Если вы используете AES, то обычно используется IV из 96 бит, но ваша шестнадцатеричная кодировка уменьшит это до 48 переменных бит. Если принять во внимание парадокс дня рождения, вы, вероятно, увидите тот же IV после 2 шифрования с тем же ключом. В принципе, это быстро нарушает безопасность вашей системы. Поведение для блочных шифров с меньшими размерами блоков, такими как DES, полностью нарушает безопасность даже для небольшого количества сообщений с одним и тем же ключом.
Всегда используйте полный необработанный вывод openssl_random_pseudo_bytes()
и mcrypt_create_iv()
для капельницы или ключей. Использование меньше энтропии может значительно облегчить жизнь злоумышленнику вашей системы.
Однако вы можете использовать bin2hex()
и base64_encode()
для печати таких случайно сгенерированных байтов для целей отладки или текстовой передачи, но не забудьте их декодировать в свои непечатаемые копии, прежде чем использовать их снова.
Sidenote: реализация PHP не используется, t соответствуют [стандартам кодирования криптографии] (https://cryptocoding.net/index.php/Coding_rules) и, таким образом, могут утечка информации через разницу во времени при пропуске кэша. На данный момент нет хорошего смягчения, хотя PHP 7.1 может это исправить. Я не видел никаких практических эксплойтов, так что это может быть не очень важно. –
как это будет представлять угрозу безопасности? Все, что вы делаете, это взять несколько байтов и преобразовать их в некоторые другие байты. Риск исходит из того, как вы ** ИСПОЛЬЗУЕТ ** эти байты. –
Если преобразование некоторых байтов в другие байты не имеет никакого отношения к безопасности, то почему эти функции php и 'random_bytes()' существуют вообще? так как любой может просто генерировать некоторые случайные байты? – user4271704
, потому что bin2hex принципиально не меняет байты, он просто преобразует их в другой ФОРМАТ ДИСПЛЕЯ. значения не изменяются, как люди могут их просматривать. Они все еще случайные байты, они просто печатаются как шестнадцатеричные значения, а не «мусор» на вашем экране. –