2015-08-05 11 views
3

В Java я хотел бы создать открытый и закрытый ключ на основе строки в моем приложении.Генерировать открытый и закрытый ключ с использованием строки

Я не пойду на безопасность, я собираюсь «Могу ли я сгенерировать тот же общедоступный и закрытый ключ, используя эту строку».

Как бы я это сделал?

Я смотрел на этих методах:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN"); 
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); 
keyGen.initialize(1024, random); 

Но я хочу, чтобы засеять генератор ключей паров с моей строкой, которая в идеале получить хеширована эти алгоритмы. KeyGen принимает только объект SecureRandom. Я хочу получить ту же результирующую пару ключей, когда я передаю эту строку.

ответ

3

Попробуйте добавить следующую строку после инициализации random:

random.setSeed(myString.hasCode())

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

Если вы хотите сгенерировать хэш, который будет гарантирован одинаковым во время нескольких исполнений программы, или если вы хотите быть уверенным, что действительно невозможно найти две строки, которые генерируют один и тот же хеш, попробуйте использовать что-то как MessageDigest вместо String.hashCode(). Как это:

MessageDigest md = MessageDigest.getInstance("SHA-256"); 
random.setSeed(md.digest(myString.getBytes()) 

Кроме того, обратите внимание, что строка всегда должна иметь такую ​​же кодировку символов каждый раз для того, чтобы генерировать тот же MessageDigest значение и пару открытого и секретного ключа.

+3

«Считается неосуществимым, чтобы найти две строки с одним и тем же хэш-кодом» - это справедливо только для криптографической хеш-функции, которой не является метод Java String.hashCode. Также нет гарантии, что 'hashCode' вернет одно и то же значение для той же строки в разных прогонах программы; он должен быть согласован только в одном исполнении. Криптографическая хеш-функция, такая как SHA-256, здесь намного лучше, чем хэш-код Java. – Wyzard

+0

Спасибо! Я отредактировал свой ответ, чтобы ответить на ваши комментарии и проблему кодировок символов, влияющих на хэш. –

+0

Я бы даже не сказал, что «очень маловероятно» найти хэш-столкновение с методом «hashCode» Java. Читайте о [атаке на день рождения] (https://en.wikipedia.org/wiki/Birthday_attack): поскольку 'hashCode' производит 32-битный результат, вам нужно всего около 77 000 (случайных) строк, чтобы иметь 50% вероятность того, что два из них будут иметь один и тот же хэш-код. А алгоритмы, используемые для реализации 'hashCode', не предназначены для противодействия [preimage attack] (https://en.wikipedia.org/wiki/Preimage_attack), поэтому для кого-то нетрудно преднамеренно * сделать * строку с выбранный хэш-код. – Wyzard