2013-10-09 1 views
-1

Привет У меня есть следующий фрагмент кода:В Solaris SecureRandom.setSeed («абв») обойдена

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" , "SUN"); 
secureRandom.setSeed("seed"); 
keyGen.init(DEFAULT_KEY_LENGTH, secureRandom); 
SecretKey secretKey = keyGen.generateKey(); 
byte[] encodedKey = secretKey.getEncoded(); 

«закодированный ключ» дает мне тот же результат каждый раз на окна платформы, AIX, Linux , HP-Unix, но он дает разные результаты в solaris, кажется, что setSeed() не работает для Solaris или он обходит,

Пожалуйста, помогите мне, я ломаю голову на этом, так как последние два дня.

Благодаря Шивам

+1

Зачем вам передавать семя в безопасный PRNG? В тестах, которые могут быть полезны (даже это сомнительно), в производственном коде это, конечно, не так. Если вы хотите получить случайные данные из короткого ключа, используйте четко определенный потоковый шифр (например, AES-CTR). – CodesInChaos

ответ

0

Javadoc на SecureRandom.setSeed(long) говорит:

Данные семян добавки, а не заменяет, существующие семена.

SecureRandom не работает точно так же, как java.util.Random - алгоритм Random стандартизирован во всех реализациях, в то время как нет никаких гарантий сделаны об алгоритме SecureRandom.

Также отметим, что

[...] любой семенной материал передается в объект SecureRandom должен быть непредсказуемым.

который нет здесь. Если ваш материал семян не является непредсказуемым, то случайные числа, вероятно, тоже не будут, поэтому нет необходимости использовать криптографически безопасный генератор случайных чисел.

+0

Гарантийный крипт-сильный PRNG обеспечивает то, что вам нужно много предыдущих образцов, чтобы угадать следующий номер. Проблема с предсказуемыми семенами заключается в том, что злоумышленник может использовать предыдущие наблюдения для оказания помощи в атаке, тем самым расширяя окно уязвимости. Если семя полностью предсказуемо, то они могут надежно угадать. –

+0

BUt Я не понимаю, почему я могу получить один и тот же ключ с одной и той же парольной фразой каждый раз, когда я выполняю свой код, на windows, linux и AIX, но только на Solaris я делаю это. – user2131172

+0

@ user2131172 Поскольку алгоритм SecureRandom не является стандартным. Это просто * бывает * одинаково на всех платформах, которые вы тестировали, кроме Solaris. Алгоритм Solaris также следует за спецификацией - ничто не запрещает поведение, которое вы испытываете. То, что я пытался сказать последним предложением в ответе, заключается в том, что в этом случае вам явно не нужны криптографически защищенные свойства SecureRandom: вместо этого используйте стандартную Random. – ntoskrnl

0

если вы объявите свой ключGen таким образом keyGen = KeyGenerator.getInstance ("DES", "SunJCE"); вы можете получить тот же ключ на солярии. все другие платформы используют SunJCE в качестве поставщика по умолчанию, но Solaris использует SunPKCS11-Solaris по умолчанию.

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