2017-06-03 3 views
1

Ich habe die SecretKey während einer Verschlüsselungsoperation gespeichert, die ich später verwenden muss. Während Speicherung ich es in Zeichenfolge bin Umwandlung:Die Klasse com.google.gson.Gson schlägt mit javax.crypto.SecretKey fehl?

String keyAsString = new Gson().toJson(key); 

Aber während retriving versagt es für folgenden Code:

SecretKey secKey = new Gson().fromJson(keyAsString, SecretKey.class); 

Auch ich bin keinen einzigen Hinweis in LogCat sogar mit Verbose-Messaging-Filter bekommen. Ich habe versucht, den Code in Try-Catch-Umgebung wie unten mit Debug-Punkte (In der Hoffnung, kann ich jede Ausnahme Spur bekommen während des Debuggens):

try { 
SecretKey secKey = new Gson().fromJson(keyAsString, SecretKey.class); // One debug point here 
} catch (Exception e) { 
Log.e(TAG, Log.getStackTraceString(e)); // And one debug point here 
} 

Aber Debugger stoppen nicht an den beiden Debug-Punkte, sofort auf dem Gerät App stürzt ab und zeigt leider eine Anwendung abgestürzt Nachricht.

Die json Struktur für SecretKey sparen ist wie folgt:

{ 
    "algorithm": "AES", 
    "key": [ 
    integer1, integre2, .... 
    ] 
} 

Hinweis: integer1, integer2 ... sind die tatsächlichen Zahlen für die Sicherheit Zweck Ich bin nicht die ursprünglichen Ergebniszahlen veröffentlichen.

Was haben schief gegangen? Ist eine solche Speicherung von SecretKey nicht erlaubt?

aktualisieren

Converting SecretKey zu JSON-String & vice versa mit Gson schlechte Idee war, wie durch jonathanrz beantwortet unter ich seine Antwort & schrieb zwei in Android-Utility-Funktionen gefolgt SecretKey zu String & umgekehrt Funktionen sind zu konvertieren folgt als:

public static String secretKeyToString(SecretKey key) { 
    return Base64.encodeToString(key.getEncoded(), Base64.DEFAULT); 
} 

public static SecretKey encodedStringToSecretKey(String encodedKey) { 
    byte[] decodedKey = Base64.decode(encodedKey, Base64.DEFAULT); 
    return new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES"); 
} 
+0

Können Sie ein Beispiel für einen JSON posten, den Sie analysieren möchten? – jonathanrz

+0

@jonathanrz bitte Blick auf die editierte Frage – pcj

Antwort

1

Sie sollten den Schlüssel als String analysieren und dann die SecretKeyFactory.translateKey verwenden, um die Schlüssel zu analysieren.

UPDATE: nachdem Sie Ihre Frage bearbeitet, sah ich, dass die Ausgabe, die Sie haben nicht nur ein einzelnes String sind. Sie müssen also eine Klasse erstellen, die Ihren json darstellt, die Antwort damit parsen und jeden Schlüssel mit translateKey konstruieren. GSON kann einen JSON nur parsen, wenn die Klasse die Attribute mit dem gleichen Namen und dem gleichen Typ wie die Schlüssel in JSON hat, was bei SecretKey nicht der Fall ist.

UPDATE2: translateKey können keine Schlüssel aus String erstellen. Die Option zum Erstellen eines Schlüssels aus einer Zeichenfolge lautet folgendermaßen: Converting Secret Key into a String and Vice Versa

+0

Gibt es eine andere sichere Alternative auf Android die SecretKey zu speichern, außer Verwendung von Gson zu machen? Irgendein Vorschlag ? – pcj

+0

@pcj wo möchten Sie es speichern? – jonathanrz

+0

In der SQLite-Datenbank speichere ich derzeit das Gson-String-Ergebnis als String in der SQLite-Datenbank und versuche, mithilfe von Gson, das fehlschlägt, abzurufen. – pcj

Verwandte Themen