Это означает, что самый портативный способ определить реализации метода шаблонных классов состоит в том, чтобы определить их в определении шаблонного класса.
template < typename ... >
class MyClass
{
int myMethod()
{
// Not just declaration. Add method implementation here
}
};
UUID имеет ширину 128 бит и уникальность, присущую способу его генерации. Хеш MD5 имеет ширину 128 бит и не гарантирует уникальности, только низкую вероятность коллизии. Хэш MD5 не меньше, чем UUID, поэтому он не помогает с хранилищем.
Если вы знаете, что хеш от UUID, его гораздо легче атаковать, потому что домен действительных UUID на самом деле довольно предсказуем, если вы что-то знаете о машине, генерирующей их.
Если вам нужно предоставить защищенный токен, вам нужно будет использовать криптографически безопасный генератор случайных чисел. (1) UUID не предназначены для криптографической безопасности, только гарантированно уникальный. Монотонно возрастающая последовательность, ограниченная уникальными машинными идентификаторами (обычно MAC) и временем, по-прежнему является совершенно допустимым UUID, но очень предсказуемой, если вы можете реконструировать единственный UUID из последовательности токенов.
Обратите внимание, что uniqid ()
возвращает не UUID , а «уникальную» строку, основанную на текущем времени:
$ php -r 'echo uniqid("prefix_", true);'
prefix_4a8aaada61b0f0.86531181
Если вы сделайте это несколько раз, вы получите очень похожие выходные строки, и каждый, кто знаком с uniqid ()
, узнает исходный алгоритм. Таким образом, довольно легко предсказать следующие идентификаторы, которые будут сгенерированы.
Преимущество вывода md5 () вместе со строкой соли или случайным числом для конкретного приложения состоит в том, что угадать строку труднее:
$ php -r 'echo md5(uniqid("prefix_", true));'
3dbb5221b203888fc0f41f5ef960f51b
В отличие от простого uniqid ()
, это дает очень разные выходные данные каждую микросекунду. Кроме того, он не раскрывает ни вашу строку "prefix salt", ни то, что вы используете uniqid ()
под капотом. Не зная соли,
MD5-определение UUID бессмысленно, потому что UUID уже уникальны и имеют фиксированную длину (короткие), свойства, которые являются одной из причин, по которым люди часто используют MD5 для начала. Так что, я полагаю, это зависит от того, что вы планируете делать с UUID, но в целом UUID имеет те же свойства, что и некоторые данные, которые были определены с помощью MD5, так почему оба варианта?
Версия 3 UUID уже имеет MD5, поэтому нет смысла делать это снова. Однако я не уверен, какую версию UUID использует PHP.
UUID уже уникальны, поэтому в MD5 нет смысла.
Что касается секретного вопроса, в целом вы можете подвергнуться атаке, если злоумышленник сможет предсказать, какой следующий уникальный идентификатор вы собираетесь сгенерировать. Если известно, что вы генерируете свои уникальные идентификаторы из UUID, набор потенциальных следующих уникальных идентификаторов намного меньше, что дает больше шансов для атаки методом грубой силы.
Это особенно верно, если злоумышленник может получить целую кучу уникальные идентификаторы от вас,
Кстати, MD5 на самом деле устарел и не должен использоваться ни в чем заслуживающем защиты - PHI, PII или PCI - с 2010 г. Федеральные органы США ввели в исполнение это требование, и любая организация, не соблюдающая правила, заплатит много долларов в виде штрафа.