Генерация ключа с использованием PHP не является небезопасной, если принять некоторые меры предосторожности. В то время как ваш вопрос может привлекать много основанных на мнении предложений, которые могут быть правильными, я бы предложил несколько указателей
md5 следует по возможности избегать. В наши дни коллизионные атаки для md5 достаточно просты, чтобы их можно было считать тривиальными, даже если вы используете случайное создание хеш-кода. Вы должны, по крайней мере, использовать sha1 (который также несколько легко сталкивается, хотя не так легко, как md5) или sha256.
Существует множество альтернатив на случай, если вы захотите держаться подальше от sha1 / sha256, хотя sha256, по стандартам 2018 года, достаточно безопасен в качестве алгоритма хеширования. Однако я бы использовал что-то кроме microtime в качестве входного параметра хеширования. Даже если вы солите это, это вполне предсказуемо. Просто чтобы ошибиться в безопасности предсказуемости, я бы посоветовал конкатенировать что-то лишнее (то есть microtime.mt_rand.something_else_which_is_also_random)
Что касается секрета, я бы предложил что-то более надежное. С криптологической точки зрения в PHP нет такой вещи, как настоящая случайность, поэтому random_bytes может быть более предсказуемым и пригодным для использования, чем это может показаться на первый взгляд. Это в сочетании с тем фактом, что bin2hex является просто преобразованием, а не односторонней функцией, делает весь секрет слабым звеном. Я бы использовал более длинную строку (32 кажется слабой) и комбинировал бы ее с чем-то другим (возможно, побитовым XOR со случайной строкой равной длины)