2016-01-27 3 views
4

Мы заметили, что набор из почти 200 000 UUID переиграл два месяца, и мне интересно, видел ли кто-нибудь подобное.Повторяющийся набор UUID от UUID.randomUUID()

UUID генерируются с использованием UUID.randomUUID(). В этом случае (смотря на источник java), randomUUID() использует SecureRandom() под капотом, который, в свою очередь, использует NativePRNG. Я понимаю, что NativePRNG использует/dev/urandom для получения своего семени. Несомненно, подразумевается, что каким-то образом/dev/urandom возвратил одно и то же семя в NativePRNG на два месяца. Из того, что я могу сказать, когда-то созданный экземпляр PRNG не заново семена. Это долго работающая работа, которая прослушивает сообщения и использует UUID в качестве идентификатора для нее. Псевдокод просто:

< receive message> String uuid = UUID.randomUUID().toString(); String fname = h.composeArtifact(uuid);

ОС Centos 6, на экземпляре AWS EC2 работает JDK1.6. Это что-то, что кто-либо видел/переживал в прошлом? Похоже на то, что должно «никогда не происходить» ...

+0

Я не уверен, что это вопрос безопасности, но вопрос о внутренней структуре Java. – schroeder

+0

Были ли они созданы из недавно созданного экземпляра в обоих случаях? – SilverlightFox

+1

Что делать, если какое-либо внутреннее хранилище, используемое для хранения этого 'UUID seed' thingy, является файлом, который управляется через Chef/Puppet/часть моментального снимка VM?Я думаю, что это законно спросить, как это предположительно уникальное семя хранится и управляется, и есть ли вероятность того, каким образом ОС удалось заставить его быть сброшенным до прошлого значения. Столь же интересен вопрос о том, может ли PRNG, используемый в Java, превзойти небольшое подмножество значений, как часто и как злоумышленник обнаружит это. –

ответ

12

От источника JDK 1.6, действительно, UUID.randomUUID() подает на экземпляр java.util.SecureRandom. Если вы получили повторную последовательность UUID, то либо вам очень повезло (или очень неудачно, в зависимости от точки зрения), либо кто-то играл с моментальными снимками VM, либо в вашей конфигурации Java есть что-то подозрительное.

При выполнении моментального снимка виртуальной машины вы записываете полное состояние в реальном времени машины, процессы и оперативную память. Если бы существовал живой процесс с уже созданным экземпляром SecureRandom, восстановление моментального снимка вернет это состояние, поэтому последовательность случайных величин, выводимых этим SecureRandom, будет одинаковой при каждом восстановлении до тех пор, пока SecureRandom не переместится с /dev/urandom (/dev/urandom непрерывно собирает «случайные» физические события, но они не будут влиять на состояние SecureRandom до следующего повторения).

конфигурация может повлиять на Java SecureRandom, в том, что SecureRandom НЕ ПСЧ, но оболочка вокруг экземпляра SecureRandomSpi, предоставленной надлежащим образом зарегистрированного криптографического провайдера. Sun JDK поставляется со стандартной реализацией, которая обычно питается ресурсами системы (/dev/urandom на Linux). Однако это можно настроить; найдите java.security.egd системное свойство, а также свойство securerandom.source в файле java.security. Поставщик по умолчанию также может быть заменен в целом альтернативной реализацией, которая делает вещи по-другому (и, возможно, очень плохо). См. this answer для некоторых деталей. Проверка того, какой случайный источник действительно используется, может быть немного сложной, но вы можете попробовать запустить свой процесс с strace, который будет отображать системные вызовы, поэтому в какой-то момент открывается /dev/random или /dev/urandom.

Если конфигурация Java отлично, и не было никакой игры с VM снимками, и вы уверены, что вы действительно получили ту же последовательность UUID как и ранее, то вы действительно действительно должны купили Вместо этого в билет на Powerball (но я честно не верю в этот сценарий).

+0

Я был просто потрясен, обнаружив, что я, очевидно, полностью отказался от этого ответа, не намереваясь, и я не могу отменить его, потому что это было слишком давно. Я, должно быть, незаметно щелкнул, пока я читал. Не то чтобы это негативно повлияло на ваш рейтинг репутации 203k, но, к сожалению, не предназначался. – Craig

Смежные вопросы