2016-03-01 10 views
7

W bibliotekach kryptograficznych Java istnieją dwie różne reprezentacje klucza - Key i KeySpec. Dokumenty sugerują, że istnieje różnica między tymi dwoma - a KeySpec jest "przezroczysty" (cokolwiek to znaczy), ale nie ma metod, podczas gdy Key ma metodę getEncoded. Masz zamiar użyć KeyFactory do konwersji pomiędzy tymi dwoma (i rzeczywiście ma on metodę konwersji).Jaka jest różnica między kluczem a KeySpec?

Jednak SecretKeySpec implementuje zarówno Key i KeySpec! Ale jest też klasa SecretKeyFactory, która nie dziedziczy po KeyFactory.

Wszystko to całkowicie mnie pomyliło. Czym różnią się Key i KeySpec i jak wchodzą w to SecretKeySpec i SecretKeyFactory?

Odpowiedz

3

Transparent oznacza tutaj, że wszystkie klasy/interfejsy wykonawczych/rozszerzenie interfejsu KeySpec mają ujawniać metadanych o kluczu, w sposób niezależny od dostawcy. Te metadane nigdy nie są używane w powszechnym użyciu klucza (szyfrowanie itd.), Ale są używane tylko wtedy, gdy trzeba zajrzeć do matematycznych atrybutów klucza. Znajomość takich niezależnych od dostawcy danych na temat klucza może być przydatna na przykład, jeśli chcesz wygenerować klucz ze strumienia bajtów/do strumienia bajtów, podpiąć klucz, jeśli znajduje się on na HSM, lub nawet sprawdzić, czy klucz jest słaby, jak:

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

Bez względu na to, jakie metadane chcesz ujawnić na temat swojego klucza, musisz się z tobą skontaktować. KeySpec działa tylko jako interfejs znacznika (wzór wzoru interfejsu znacznika).

W przeciwieństwie do takiego ewentualnego introspekcji z KeySpec, klucze wygenerowane za pomocą SecretKeyFactory są „nieprzezroczyste”, w tym sensie, że nie można dostać pełną matematyczne (moduł, wykładnik, kodowanie, etc.) i inne (jeżeli jest podobnie jak DESKeySpec powyżej) metadane dotyczące klucza.

SecretKeySpec z drugiej strony jest poza JCE za rozwiązania skrzynki do generowania kluczy strumieni bajtowych, a więc realizuje zarówno Key i KeySpec - generowanie klucza za pomocą KeySpec dostarczone, i sprawiają, że klucz jest dostępny przy użyciu Key.getEncoded().

2

Kluczowe obiekty i kluczowe parametry (KeySpecs) to dwie różne reprezentacje kluczowych danych.

Szyfry używają kluczy do zainicjowania swoich algorytmów szyfrowania, ale klucze mogą wymagać przekonwertowania na bardziej przenośny format do przesyłania lub przechowywania.

Przejrzyste odwzorowanie kluczy oznacza, że ​​można uzyskać dostęp do każdej wartości materiału kluczowego indywidualnie, za pomocą jednej z metod pobierania określonych w odpowiedniej klasie specyfikacji.

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). 

Jeśli klucz jest przechowywany na urządzeniu sprzętowym, jego specyfikacja może zawierać informację, która pozwala zidentyfikować klawisz na reprezentację device.This kontrastuje z nieprzezroczystego reprezentacji, zgodnie z definicją interfejsu Key, w którym nie mają bezpośredniego dostępu do kluczowych pól materiałowych. Innymi słowy, "nieprzejrzysta" reprezentacja daje ci ograniczony dostęp do klucza - tylko trzy metody zdefiniowane przez interfejs Key: getAlgorithm, getFormat i getEncoded.

Klucz może być określony w sposób specyficzny dla algorytmu lub w formacie kodowania niezależnym od algorytmu (takim jak 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 i zajęcia SecretKeyFactory może być użyty do konwersji pomiędzy nieprzezroczystych i przezroczystych najważniejszych przedstawień czyli między Keys i KeySpecs.

referencyjny i więcej szczegółów dostępne na stronie: https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#KeySpecs

Powiązane problemy