2016-03-01 2 views
7

В Java-криптографических библиотеках существуют два разных представления ключа - Key и KeySpec. Документы подразумевают, что существует разница между двумя - a KeySpec является «прозрачным» (независимо от того, что это означает), но не имеет методов, тогда как Key имеет метод getEncoded. Вы должны использовать KeyFactory для преобразования между двумя (и он действительно получил метод getKeySpec для преобразования).В чем разница между Key и KeySpec?

Однако SecretKeySpec использует как Key, так и KeySpec! Но есть класс SecretKeyFactory, который не наследует KeyFactory.

Все это оставило меня полностью смущенным. В чем разница между Key и KeySpec, и как идут SecretKeySpec и SecretKeyFactory?

ответ

3

Transparent здесь означает, что все классы/интерфейсы реализации/расширения интерфейса KeySpec должны раскрыть метаданные о ключе, в поставщика независимым образом. Эти метаданные никогда не используются в общем использовании ключа (шифрование и т. Д.), Но используются только в том случае, если необходимо изучить математические атрибуты ключа. Знание таких независимых данных поставщика о ключе может быть полезно, например, если вы хотите сгенерировать ключ из/в поток байтов, зацепить ключ, если он находится на HSM, или даже узнать, слабый ли ключ, например:

DESKeySpec.isWeak(byte[] key, int offset) 

Независимо от того, какие метаданные вы хотите раскрывать о своем ключе, зависит от вас. KeySpec просто действует как интерфейс маркера (шаблон дизайна интерфейса маркера).

В отличие от такого возможного интроспекции с KeySpec, ключи, сгенерированные с помощью SecretKeyFactory являются «непрозрачными», в том смысле, что вы не можете получить полный математический (модуль, экспоненту, кодирование и т.д.) и другие (если это предусмотрено как DESKeySpec выше) метаданные о ключе.

SecretKeySpec с другой стороны, из ОКА по кассовым раствору для генерации ключей из байтовых потоков, и, следовательно, он реализует как Key и KeySpec - для генерирования ключа, используя KeySpec при условии, и сделать ключ доступны с помощью Key.getEncoded().

2

Ключевыми объектами и ключевыми спецификациями (KeySpecs) являются два разных представления ключевых данных.

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

Прозрачное представление ключей означает, что вы можете получить доступ к каждому значению материала материала отдельно, используя один из методов получения, определенных в соответствующем классе спецификации.

For example, DSAPrivateKeySpec defines getX, getP, getQ, and getG methods, to access the private key x, and the DSA algorithm parameters used to calculate the key(the prime p, the sub-prime q, and the base g). 

Если ключ хранится на аппаратном устройстве, его спецификация может содержать информацию, которая помогает идентифицировать ключ на представлении device.This противопоставляется с непрозрачным представлением, как определено Key интерфейс, в котором вы не имеют прямого доступа к ключевым полям материала. Другими словами, «непрозрачное» представление дает вам ограниченный доступ к ключу - только три метода, определенные интерфейсом Key: getAlgorithm, getFormat и getEncoded.

Ключ может быть указан специфичным для алгоритма способом или в формате, не зависящем от алгоритма (например, ASN.1).

For example, a DSA private key may be specified by its components x, p, q, and g (eg: DSAPrivateKeySpec), or it may be specified using its DER encoding (eg: PKCS8EncodedKeySpec). 

KeyFactory и SecretKeyFactory классы могут быть использованы для преобразования между непрозрачными и прозрачными ключевыми представлениями, что есть между клавишами и KeySpecs.

Reference и более подробную информацию можно получить в: https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#KeySpecs

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