Попробуйте назвать внешние ключи для employeeid и changeid, так как они ссылаются на один и тот же столбец идентификаторов таблицы Employee.
В отличие от этого, java.util.Random
класс, java.security.SecureRandom
класс должен произвести недетерминированный вывод на каждом вызове.
то, Что это означает, в случае java.util.Random
, если бы необходимо было воссоздать экземпляр с тем же семенем каждый раз, когда Вам было нужно новое случайное число, Вы по существу добрались бы тот же , заканчиваются каждый раз. Однако SecureRandom
, как гарантируют, НЕ сделает это - так, создавая единственный экземпляр или создавая новый, который каждый раз делает не , влияют на случайность случайных байтов, которые она генерирует.
Так, от просто нормальной хорошей точки наблюдения методов кодирования, почему создают слишком много экземпляров, когда каждый сделает?
Инициализируйте статический экземпляр и используйте его для всех пар ключей. Это больше не будет или менее случайно.
Я не полагался бы на SecureRandom, чтобы быть чем-либо кроме криптографически безопасного PRNG. Полная кавычка, которую Gowri использует от javadocs:
Кроме того, SecureRandom должен произвести недетерминированный вывод, и поэтому требуется, что материал семени непредсказуем и что вывод SecureRandom быть криптографически сильными последовательностями, как описано в RFC 1750: Рекомендации Случайности для безопасности.
менее, чем ясно из этого, что реальное ожидание - RFC 1750 детализирует использование аппаратных средств для улучшения генерации случайных чисел, но javadocs говорят "поэтому, что требуется, что материал семени непредсказуем", который, казалось бы, противоречил бы этому.
самое безопасное предположение, чтобы продолжить работать - то, что Ваша реализация SecureRandom является просто криптографически безопасным PRNG, и поэтому что Ваши ключи не более безопасны, чем случайное семя, которое Вы используете. Таким образом инициализируя новый SecureRandom с новым (уникальный, действительно случайный) семя для каждого ключа было бы самой безопасной ставкой.
Однажды должен быть достаточно. Мой опыт также состоял в том, что инициализация генераторов типа SecureRandom может иногда быть медленной также (из-за того, как случайность достигается), таким образом, необходимо принять это во внимание.
Почему Вы хотели бы создать новый экземпляр каждый раз? Это не похоже, который был бы [еще 110] случайный. Я думаю, что было бы лучше инициализировать однажды и использовать его для всех пар.
Каждое поколение SecureRandom
засевается из некоторого пула энтропии. В зависимости от используемой ОС, это может быть пул энтропии, поддерживаемый ОС, например / dev / random
в Linux, или это может быть что-то, что готовит JVM. В некоторых более ранних реализациях Sun JVM использовалась для порождения ряда потоков и использования их временных данных для создания начального числа.
Создание нового SecureRandom
при каждом вызове может замедлять работу приложения с момента создания. семян может блокировать. Лучше повторно использовать статически созданный экземпляр, но не забудьте повторно заполнить его после того, как из него извлечено фиксированное число случайных байтов.
new SecureRandom ()
- это не что иное, как оболочка для / dev / random
, и каждый вызов nextBytes
или generateSeed
фактически истощает энтропию ОС бассейн. В Linux и Solaris для создания SecureRandom
лучше использовать поставщика JCE.
Для SecureRandom вы могли бы иногда рассмотреть возможность повторного заполнения ( с использованием системной энтропии в большинстве случаев ) с помощью такого вызова:
mySecureRandom.setSeed(mySecureRandom.generateSeed(someInt));
, чтобы дать потенциальному злоумышленнику что-то меньшее чем неограниченное время, чтобы найти свой ключ.
В блоге Лига справедливости есть несколько замечательных статей об этом.