Stosowanie metody KeyGenerator
jest preferowaną metodą. Jak wskazywał Duncan, na pewno dałbym klucz wielkości podczas inicjalizacji. KeyFactory
to metoda, która powinna być używana dla wcześniej istniejących kluczy.
OK, więc przejdźmy do nitty-piaszczysty tego. Zasadniczo klucze AES mogą mieć dowolną wartość. Nie ma "słabych kluczy" jak w (3) DES. Nie ma też bitów, które mają konkretne znaczenie jak w (3) bitach parzystości DES. Zatem generowanie klucza może być tak proste, jak generowanie tablicy bajtów z losowymi wartościami i tworzenie wokół niej SecretKeySpec
.
Ale nadal istnieją zalety metody, której używasz: KeyGenerator
jest specjalnie stworzony do generowania kluczy. Oznacza to, że kod może być zoptymalizowany dla tej generacji. Ten może ma korzyści wydajności i bezpieczeństwa. Może być zaprogramowany tak, aby uniknąć ataków na boczny kanał czasu, które mogłyby na przykład odsłonić klucz. Zauważ, że dobrym pomysłem może być wyczyszczenie wszystkich byte[]
, które przechowują kluczowe informacje, ponieważ mogą zostać ujawnione w pliku wymiany (i tak może być i tak).
Ponadto, jak wspomniano, nie wszystkie algorytmy używają całkowicie losowych kluczy. Tak więc używanie KeyGenerator
ułatwiłoby przełączanie się na inne algorytmy. Bardziej nowoczesne szyfry będą akceptować tylko w pełni losowe klucze; jest to postrzegane jako główna korzyść w stosunku do np. DES.
Wreszcie, w moim przypadku najważniejszy powód, dla którego metoda KeyGenerator
jest jedynym prawidłowym sposobem obsługi kluczy AES w bezpiecznym tokenie (karta inteligentna, moduł TPM, token USB lub HSM). Jeśli utworzysz byte[]
z SecretKeySpec
, klucz musi pochodzić z pamięci. Oznacza to, że klucz można umieścić w bezpiecznym tokenie, ale klucz jest odsłonięty w pamięci niezależnie. Zwykle bezpieczne tokeny działają tylko z kluczami, które są generowane w bezpiecznym tokenie lub są wstrzykiwane przez np. karta inteligentna lub ceremonia kluczowa. A KeyGenerator
może być dostarczony z dostawcą, dzięki czemu klucz jest generowany bezpośrednio w bezpiecznym tokenie.
Jak wskazano w Duncan's answer: należy zawsze wyraźnie określić rozmiar klucza (i wszelkie inne parametry). Nie należy polegać na domyślnych ustawieniach dostawcy, ponieważ to spowoduje, że nie będzie jasne, co robi aplikacja, a każdy dostawca może mieć własne ustawienia domyślne.
To pomoże mighth http://stackoverflow.com/questions/10252449/is-aes-key-random – Tala
@Tala Tam znalazłem [cytowany kod] (http://stackoverflow.com/a/10252662/1005481). Ale z tego posta nie mogłem ustalić konsensusu co do tego, jak stworzyć losowy klucz i dlaczego to był bezpieczny sposób. –