Ich generiere einen Schlüssel und muss ihn in der Datenbank speichern, also konvertiere ich ihn in einen String, aber um den Schlüssel aus dem String zurückzubekommen. Was sind die möglichen Wege, um dies zu erreichen?
Mein Code ist,
SecretKey key = KeyGenerator.getInstance("AES").generateKey();
String stringKey=key.toString();
System.out.println(stringKey);
Wie kann ich den Schlüssel vom String zurückbekommen?
java
string
encryption
Princeyesuraj
quelle
quelle
String
Instanzen in Java, während Schlüsselobjekte und Bytearrays möglicherweise gelöscht werden. Dies bedeutet, dass Schlüssel für einen längeren Zeitraum im Speicher verfügbar bleiben können. Die Verwendung eines (kennwortgeschützten)KeyStore
, vorzugsweise eines, das vom Laufzeitsystem / Betriebssystem oder sogar von der Hardware unterstützt wird, sollte bevorzugt werden.Antworten:
Sie können das
SecretKey
in ein Byte-Array (byte[]
) konvertieren und Base64 das dann in ein codierenString
. Um wieder in a zu konvertierenSecretKey
, dekodiert Base64 den String und verwendet ihn in aSecretKeySpec
, um Ihr Original neu zu erstellenSecretKey
.Für Java 8
SecretKey to String:
String zu SecretKey:
Für Java 7 und früher (einschließlich Android):
HINWEIS I: Sie können den Base64-Codierungs- / Decodierungsteil überspringen und den
byte[]
in SQLite speichern . Das Durchführen der Base64-Codierung / -Decodierung ist jedoch kein teurer Vorgang, und Sie können Zeichenfolgen problemlos in nahezu jeder Datenbank speichern.HINWEIS II: Frühere Java-Versionen enthalten kein Base64 in einem der Pakete
java.lang
oderjava.util
. Es ist jedoch möglich, Codecs aus Apache Commons Codec , Bouncy Castle oder Guava zu verwenden .SecretKey to String:
String zu SecretKey:
quelle
Um zu zeigen, wie viel Spaß es macht, einige Funktionen zu erstellen, die schnell ausfallen, habe ich die folgenden 3 Funktionen geschrieben.
Man erstellt einen AES-Schlüssel, man codiert ihn und man decodiert ihn zurück. Diese drei Methoden können mit Java 8 verwendet werden (ohne Abhängigkeit von internen Klassen oder externen Abhängigkeiten):
quelle
getEncoded()
nicht verfügbar ist).Eigentlich hat das, was Luis vorgeschlagen hat, bei mir nicht funktioniert. Ich musste einen anderen Weg finden. Das hat mir geholfen. Könnte dir auch helfen. Links:
* .getEncoded (): https://docs.oracle.com/javase/7/docs/api/java/security/Key.html
Encoder-Informationen: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html
Decoder-Informationen: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Decoder.html
Codefragmente: Zum Codieren:
Zum Entschlüsseln:
quelle
Du willst nicht benutzen
.toString()
.Beachten Sie, dass SecretKey von java.security.Key erbt, das selbst von Serializable erbt. Der Schlüssel hier (kein Wortspiel beabsichtigt) besteht darin, den Schlüssel in einen ByteArrayOutputStream zu serialisieren, das Array byte [] abzurufen und in der Datenbank zu speichern. Der umgekehrte Prozess wäre, das Byte [] -Array aus der Datenbank zu entfernen, einen ByteArrayInputStream aus dem Byte [] -Array zu erstellen und den SecretKey daraus zu deserialisieren ...
... oder noch einfacher, verwenden Sie einfach die
.getEncoded()
von java.security.Key (einer übergeordneten Schnittstelle von SecretKey) geerbte Methode. Diese Methode gibt das codierte Byte [] -Array von Key / SecretKey zurück, das Sie speichern oder aus der Datenbank abrufen können.Dies alles setzt voraus, dass Ihre SecretKey-Implementierung die Codierung unterstützt. Andernfalls
getEncoded()
wird null zurückgegeben.bearbeiten:
Sie sollten sich die Key / SecretKey-Javadocs ansehen (verfügbar direkt am Anfang einer Google-Seite):
http://download.oracle.com/javase/6/docs/api/java/security/Key.html
Oder dies von CodeRanch (auch mit der gleichen Google-Suche gefunden):
http://www.coderanch.com/t/429127/java/java/Convertion-between-SecretKey-String-or
quelle
Konvertieren von SecretKeySpec in String und umgekehrt: Sie können eine
getEncoded()
Methode verwenden, mitSecretKeySpec
der angegeben wirdbyteArray
, aus der SieencodeToString()
denstring
Wert vonSecretKeySpec
inBase64
object abrufen können .Während der Konvertierung
SecretKeySpec
nachString
: usedecode()
inBase64
wird gebenbyteArray
, daraus können Sie eine InstanzSecretKeySpec
mit den Parametern erstellenbyteArray
, um Ihre zu reproduzierenSecretKeySpec
.quelle
Versuchen Sie dies, es funktioniert ohne Base64 (das nur in JDK 1.8 enthalten ist), dieser Code wird auch in der vorherigen Java-Version ausgeführt :)
quelle