Generuję klucz i muszę go przechowywać w DB, więc konwertuję go na ciąg, ale aby odzyskać klucz z ciągu. Jakie są możliwe sposoby osiągnięcia tego?
Mój kod to
SecretKey key = KeyGenerator.getInstance("AES").generateKey();
String stringKey=key.toString();
System.out.println(stringKey);
Jak mogę odzyskać klucz z String?
java
string
encryption
Princeyesuraj
źródło
źródło
String
Javie nie ma jawnej metody niszczenia instancji, podczas gdy kluczowe obiekty i tablice bajtów mogą zostać wyczyszczone. Oznacza to, że klucze mogą pozostać dostępne w pamięci przez dłuższy czas.KeyStore
Preferowane powinno być używanie (chronione hasłem) , najlepiej obsługiwane przez system / system operacyjny lub nawet sprzęt.Odpowiedzi:
Możesz przekonwertować
SecretKey
tablicę bajtów (byte[]
), a następnie zakodować ją w formacie Base64 do plikuString
. Aby przekonwertować z powrotem na aSecretKey
, Base64 dekoduje ciąg i używa go w a,SecretKeySpec
aby odbudować oryginałSecretKey
.W przypadku języka Java 8
SecretKey to String:
Ciąg do SecretKey:
Java 7 i starsze (w tym Android):
UWAGA I: możesz pominąć część kodowania / dekodowania Base64 i po prostu zapisać
byte[]
w SQLite. To powiedziawszy, wykonywanie kodowania / dekodowania Base64 nie jest kosztowną operacją i można przechowywać ciągi znaków w prawie każdej bazie danych bez problemów.UWAGA II: Wcześniejsze wersje Java nie zawierają Base64 w żadnym z pakietów
java.lang
lubjava.util
. Możliwe jest jednak użycie kodeków z Apache Commons Codec , Bouncy Castle lub Guava .SecretKey to String:
Ciąg do SecretKey:
źródło
Aby pokazać, jak fajnie jest tworzyć niektóre funkcje, które szybko zawodzą , napisałem następujące 3 funkcje.
Jeden tworzy klucz AES, jeden go koduje, a drugi dekoduje z powrotem. Te trzy metody mogą być używane z Javą 8 (bez zależności od klas wewnętrznych lub zewnętrznych zależności):
źródło
getEncoded()
nie jest dostępny).Właściwie to, co zaproponował Luis, nie zadziałało dla mnie. Musiałem wymyślić inny sposób. To mi pomogło. Może ci też pomóc. Spinki do mankietów:
* .getEncoded (): https://docs.oracle.com/javase/7/docs/api/java/security/Key.html
Informacje o enkoderze: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html
Informacje o dekoderze: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Decoder.html
Fragmenty kodu: do kodowania:
Do dekodowania:
źródło
Nie chcesz używać
.toString()
.Zauważ, że SecretKey dziedziczy po java.security.Key, która sama dziedziczy po Serializable. Zatem kluczem tutaj (gra słów nie jest zamierzona) jest serializacja klucza do ByteArrayOutputStream, pobranie tablicy bajtów [] i zapisanie jej w bazie danych. Odwrotnym procesem byłoby pobranie tablicy bajtów [] z bazy danych, utworzenie ByteArrayInputStream z tablicy bajtów [] i deserializacja klucza SecretKey z niej ...
... lub nawet prościej, po prostu użyj
.getEncoded()
metody odziedziczonej po java.security.Key (która jest interfejsem nadrzędnym SecretKey). Ta metoda zwraca zakodowaną tablicę byte [] poza Key / SecretKey, którą można przechowywać lub pobierać z bazy danych.To wszystko przy założeniu, że Twoja implementacja SecretKey obsługuje kodowanie. W przeciwnym razie
getEncoded()
zwróci wartość null.edytować:
Powinieneś spojrzeć na javadocs Key / SecretKey (dostępne na początku strony Google):
http://download.oracle.com/javase/6/docs/api/java/security/Key.html
Lub to z CodeRanch (również znalezione w tej samej wyszukiwarce Google):
http://www.coderanch.com/t/429127/java/java/Convertion-between-SecretKey-String-or
źródło
Konwersja SecretKeySpec String i odwrotnie: można użyć
getEncoded()
metody wSecretKeySpec
których dabyteArray
, z których można użyćencodeToString()
, aby uzyskaćstring
wartość odSecretKeySpec
wBase64
obiekcie.Konwertując
SecretKeySpec
naString
: użyjdecode()
wBase64
dabyteArray
, z tego możesz utworzyć instancję dlaSecretKeySpec
z parametrami jakobyteArray
do odtworzenia twojegoSecretKeySpec
.źródło
spróbuj tego, działa bez Base64 (który jest zawarty tylko w JDK 1.8), ten kod działa również w poprzedniej wersji java :)
źródło