Wie convertiere ich einen pkcs8 key in einen java lesbaren?

Thallius

Top Contributor
Hi,

ich habe für meien php scripte einen pkcs8 key im uncrypted format. Also ein textfile ala

-----BEGIN PRIVATE KEY-----
....
-----END PRIVATE KEY-----

Diesen key möchte ich nun gerne in java auch benutzen. Java verlangt den key aber irgendwie in einem anderen format damit ich ihn mit

Code:
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(file));
rsaKey = (PublicKey) inputStream.readObject();
inputStream.close();

einlesen und dann mit Cipher benutzen kann.

Wie konvertiere ich das?

Danke

Claus
 

tommysenf

Top Contributor
Was du dort versuchst ist einfach den Java Objektserialisierungsmechanismus zu verwenden. Das kann so natürlich nicht funktionieren, da dein File kein serialisiertes Java Objekt enthält.

Hier findest du ein Beispiel zum Laden eines PKCS8 Keys mit Java:
http://juliusdavies.ca/commons-ssl/pkcs8.html

Eventuell sind auch diese Grundlagentutorials für dich interessant:
https://docs.oracle.com/javase/tutorial/security/apisign/index.html
https://docs.oracle.com/javase/8/docs/technotes/guides/serialization/
 

mrBrown

Super-Moderator
Mitarbeiter
Na das das, was du da versuchst nicht klappt ist doch klar...

Ich würde mal behaupten, die Datei als byte-Array einlesen und eine der entsprechenden Factory-Methoden nutzen...
 

Thallius

Top Contributor
Was du dort versuchst ist einfach den Java Objektserialisierungsmechanismus zu verwenden. Das kann so natürlich nicht funktionieren, da dein File kein serialisiertes Java Objekt enthält.

Hier findest du ein Beispiel zum Laden eines PKCS8 Keys mit Java:
http://juliusdavies.ca/commons-ssl/pkcs8.html

Eventuell sind auch diese Grundlagentutorials für dich interessant:
https://docs.oracle.com/javase/tutorial/security/apisign/index.html
https://docs.oracle.com/javase/8/docs/technotes/guides/serialization/

Oh Mann Danke. Wie blöd muss man sein. Ich habe mindestens 2 Stunden auf den Code geschaut und den Fehler nicht gesehen. Manchmal sollte man einfach aufhören wenn die konzentration nicht mehr da ist.

Claus
 

Tobse

Top Contributor
Ich weiss, ich trete da immer jemand auf den Schlips mit sowas, aber: die Wahrscheinlichkeit, dass du auf diese Ebene wirklich selbst runter musst, geht gegen 0. Es sollte doch genügen, der Library, die damit arbeiten soll (TLS, whatever) den Pfad zum Keyfile zu geben. Von Cipher ganz zu schweigen...
 

Thallius

Top Contributor
Ich weiss, ich trete da immer jemand auf den Schlips mit sowas, aber: die Wahrscheinlichkeit, dass du auf diese Ebene wirklich selbst runter musst, geht gegen 0. Es sollte doch genügen, der Library, die damit arbeiten soll (TLS, whatever) den Pfad zum Keyfile zu geben. Von Cipher ganz zu schweigen...

Gut vielleicht hast du ja eine bessere Idee.

Es geht darum, dass sensible Daten auf einem "öffentlichen" Webserver gespeichert werden sollen. Dabei dürfen alle Clients dort Daten speichern aber nur einige wenige diese lesen.
Meine Idee war deswegen, alle Daten die zu dem Server gehen mit dem pub key zu crypten.
Damit kann der Server gerne gehackt werden, da er selber nicht im Besitz des priv keys ist kann er und damit auch der Hacker die Daten nicht entschlüsseln. Selbes gilt für alle Clients die nur mit dem pub key ausgeliefert werden. Nur die Clients, welche auch den priv key bekommen können die Daten dann auswerten.

Gruß

Claus
 

Tobse

Top Contributor
Dafür ist Kryptographie ein absolut valider Anwendungsfall - aber man muss nicht selbst mit dem Cipher hantieren dafür. Da gibts auch viel, was man falsch machen kann.

Ich persönlich würde ein Tool wie GnuPG in die Anwendung einbetten und das mit ProcessBuilder aufrufen. Dann kannst du PGP-Verschlüsselte Dateien verwenden, bekommst eine auf Herz- und Nieren geprüfte und getestete Implementierung der gesamten Kryptographie - und musst in deiner Anwendung im Prinzip nur einen Shell-Befehl absetzen.
GnuPG kann man auch für Windows kompilieren - ist also kein Problem. Obendrein benutzt du dann ein Standardardisiertes Protokoll.

Dazu kommt ja, dass JVMs von Haus aus nur AES-128 und SHA-1 untersetützen müssen (siehe Javadoc zu Cipher und MessageDigest). Damit kommt man nicht weit.
 

AndyJ

Bekanntes Mitglied
Hi,

dazu solltest du folgendes wissen:

Der key im Format

-----BEGIN PRIVATE KEY-----
....
-----END PRIVATE KEY-----

ist Base64 encoded. Den String zwischen den beiden Zeilen musst du also erstmal decoden. Was du dann hast ist die binaere Version einer ASN.1 Datenstruktur:

Code:
PrivateKeyInfo ::= SEQUENCE {
   version Version,
   privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
   privateKey PrivateKey,
   attributes [0] IMPLICIT Attributes OPTIONAL }

 Version ::= INTEGER

 PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier

 PrivateKey ::= OCTET STRING

 Attributes ::= SET OF Attribute

ASN.1 steht fuer Abstract Syntax Notation One, eine Sprache mit der Datenstrukturen sprachunabhaengig beschrieben werden. Die so beschriebene Datenstruktur muss dann natuerlich in ein Binaerformat ueberfuehrt werden. Dazu gibt es verschiedene Encodings, e.g. DER, BER, etc.. Fast alles was mit Kryptographie zu tun hat ist DER encoded (DER = Distinguished Encoding Rules).

In Java gibt es einige Klassen, die dir damit helfen. Dia API ist bekannt als JCA/JCE (Java Cryptograpy Architecture/Java Cryptography Extensions). Schau dir mal diese Klasse an:

java.security.spec.PKCS8EncodedKeySpec

Java bietet allerdings nicht wirklich viel. Die Bouncycastle Library ist ideal fuer deinen Zweck: http://bouncycastle.org/

Du solltest keine Scheu haben, mit Kryptographie zu arbeiten. Ist ein interessantes Feld und man kann eine Menge lernen. Viel Spass!

Cheers,
Andy
 

Tobse

Top Contributor
Du solltest keine Scheu haben, mit Kryptographie zu arbeiten. Ist ein interessantes Feld und man kann eine Menge lernen.
Scheu vor Kryptographie ist in der Tat nicht gut. Ein proprietäres Protokoll ist aber genauso unangebracht. Die erste und wichtigste Regel der Kryptographie ist: Never Roll your own crypto.

Damit rumzuspielen ist super interessant und das habe ich auch schon ausführlich gemacht. Aber diesen Code dann produktiv zu verwenden ist grob Fahrlässig. Wenn eine Lücke drin ist und deswegen Daten geklaut werden, ist das geheule dann groß.

Siehe diesen Post auf SecuritySE zum Thema custom security:
https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own

Es ist immer hilfreich, sich mal die Crypto-Sicherheitslücken anzusehen, die so gefunden werden. Das sind keine gewöhnlichen Bugs. Gerade wenn es um Timing-Angriffe und Memory-Leaks geht merkt man, wie super einfach man einen riesen Fehler machen kann, wenn man solchen Code selbst schreibt.
Z.B. muss man in Java wegen der Garbage-Collection alle sensiblen Daten ausschließlich in byte[]s halten, damit man sie nach getaner Arbeit zuverlässig aus dem RAM löschen kann.
 
Zuletzt bearbeitet:

AndyJ

Bekanntes Mitglied
Der Original-Poster hat doch gar nicht versucht seine eigene Krypto zu erfinden - er will nutzen was schon da ist. Manchmal denke ich mir, die Warnung nur ja nichts selbst mit Krypto zu machen ist eine Erfindung der NSA. Hat sie doch effektiv verhindert, dass sich Softwareentwickler ueberhaupt mit dem Thema befassen - und das schon mehr als ein Jahrzehnt. Deswegen ist der Stand der Dinge in Hinsicht auf Security so scheisse und die Geheimdienste haben leichtes Spiel...

Cheers,
Andy

Das hier ist doch ein Forum, das Wissen vermitteln soll. Also weg mit solchen Warnungen. Besser waere es einen Forenbereich einzurichten, wo wir den Code anderer reviewen koennen. Wie waer's damit?
 

Tobse

Top Contributor
Ich sage ja auch nicht, dass man sich nicht damit auseinandersetzen soll. Um sich das Wissen anzueignen, ist es auf jeden Fall hilfreich, das alles mal selbst implementiert zu haben, auch so low-level, die Crypto-Algorithmen selbst zu implementieren.

ABER: @Thallius arbeitet meist an teuren Projekten für Unternehmen - zumindest sagt er das. Und in diesem Umfeld ist eigens geschriebener Code (auch wenn er von 10-15 Leuten reviewt wurde) grob Fahrlässig, wenn man Zugriff auf Implementierungen hat, die von Tausenden Geprüft wurden und welche den Attacken der Größten Regierungen der Welt standhalten: die verfügbaren Open-Source implementierungen von PGP, TLS und OTR.
Wenn man das Thema beruflich betreiben möchte kann man Mathematik studieren, sich auf Cryptographie spezialisieren und dann an diesen Open-Source Projekten teilnehmen.

----
Bei Kryptographie stehen teils Menschenleben auf dem Spiel. Man blicke nur in die Türkei und auf die Journalisten dort. Diese Menschen sind auf gute Kryptographie angewiesen. Und sie haben nicht das Fachwissen, Code zu prüfen. Sie müssen sich darauf verlassen. Diesen Menschen gegenüber wäre es IMHO Respektlos, ihnen eine vglw. nicht bis minimal getestete Software als gleich sicher wie eine Millionenfach als sicher befundene Software zu verkaufen.

Analoges Beispiel: Du kennst vielleicht jemand, der gerne an Autos bastelt. Sagen wir, so einer nimmt einen alten Käfer auseinander und baut ihn wieder zusammen. Er hat kein eigenes Auto entworfen, wohl aber hat er es selbst montiert.
Du musst jetzt im Winter 5000km per Autoo zurücklegen und hast die Wahl zwischen dem selbst montierten Käfer deines Kumpels und einem Mietwagen eines Namhaften Autoherstellers (sagen wir ein VW Passat von 2016). Probefahrt nicht erlaubt, mit keinem von beidem. Was wählst du?
 

AndyJ

Bekanntes Mitglied
[QUOTE="..., wenn man Zugriff auf Implementierungen hat, die von Tausenden Geprüft wurden und welche den Attacken der Größten Regierungen der Welt standhalten: die verfügbaren Open-Source implementierungen von PGP, TLS und OTR....[/QUOTE]

Heartbleed anyone? Und etwas mehr Selbstvertrauen bitte.
 

Thallius

Top Contributor
@Tobse

Ich gebe Dir generell recht. Nur wer sagt mir, dass nicht gerade diese 1000fach getesteten Frameworks eine Backdoor für die NSA, BND, MI6, Goole, Microsoft, Apple oder wen auch immer haben? Also ganz sooo blauäugig wäre ich da vielleicht doch nicht.

Gruß

Claus
 

Tobse

Top Contributor
@AndyJ ja, es gab Heartbleed; die OS Libraries sind sicher nicht perfekt. Willst du mir sagen, dass du so einen Fehler nie machen würdest? Hättest du Heartbleed finden können?

Ich kenne deine Skills nicht, ich beurteile dich nicht. Ich vermute du bist genauso wenig ein Super Computergenie wie ich oder diejenigen, die Fehler wie Heartbleed, Goto-Fail oder Stagefright machten. In den 1000en Zeilen Code, welche für TLS nötig sind, ist sehr viel Platz und Gelegenheit für solche Fehler.

Selbst Crypto-Koriphäen wie Bruce Schneier machen schwere Fehler. Und die werden nur gefunden, weil unzählige Leute den Cose reviewen, testen, und versuchen, ihn zu knacken.

Auch wenn die Standard-Libs nicht perfekt sind, sind sie IMHO die sicherste Option, ausser

@Thallius
Wenn du dir da ernsthaft Sorgen drum machst, kann es IMO schon sinnvoll sein, etwas eigenes zu Coden. Es ist wohl gleich schwierig eine Backdoor zu finden (vllt sogar schwieriger), als eine solide Implementierung selbst zu schreiben. Das aber mit dem o.g. Risiko, Lücken drin zu haben, die sich nur durch Geheimhaltung des Codes nicht ausgenutzt werden können.

Am Ende des Tages muss man jemandem Vertrauen; die zugrundeliegenden Algorithmen kann man ohne langes Studium der Mathematik vmtl nicht prüfen
 

JStein52

Top Contributor
die zugrundeliegenden Algorithmen kann man ohne langes Studium der Mathematik vmtl nicht prüfen
Er hat kein eigenes Auto entworfen, wohl aber hat er es selbst montiert.
Irgendwie hat sich das Thema wohl verselbstständigt. @Thallius wollte doch weder eigene Algorithmen entwickeln noch wollte er ein Auto montieren. Er wollte sein Gepäck reinlegen, den Zündschlüssel nehmen und losfahren. Und er wollte nur den richtigen Weg wissen
 

Tobse

Top Contributor
Er wollte sein Gepäck reinlegen, den Zündschlüssel nehmen und losfahren. Und er wollte nur den richtigen Weg wissen

Ich hatte das anders verstanden, weil er den Schlüssel selbst parsen und dann selbst mit einem javax.crypto.Cipher verwendetn wollte. Ein einzelner aufruf an ein PGP-Binary zum Ver- und Entschlüssen wäre für mein Verständnis "Gepäck in den Mietwagen legen und losfahren"
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jose05 Umgang mit Exceptions in einen Programm Allgemeine Java-Themen 2
Robert Zenz Ich brauche bitte mal kurz einen Sanity/Reality-Check betreffend Tests. Allgemeine Java-Themen 9
R Wie gestaltet man einen Authentifizierungsflow? Allgemeine Java-Themen 6
berserkerdq2 Jemand einen Tipp wie man ein Javafx-Hintergrund "dynamisch" macht Allgemeine Java-Themen 3
berserkerdq2 Text über einen Shape anzeigen (Scenebuilder) Allgemeine Java-Themen 1
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
N Wie mache ich einen UnitTest? Allgemeine Java-Themen 16
D Klassendesign für einen Pascal Interpreter Allgemeine Java-Themen 6
Jose05 Gibt es einen Nachteil bei dem JDK 8? Allgemeine Java-Themen 7
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
O Warum kann ich so keine Elemente löschen und erhalte einen IllegalStateException? Allgemeine Java-Themen 4
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
N Validator für einen SQL-Befehl Allgemeine Java-Themen 22
ZH1896ZH Best Practice Wie erstellt man am besten einen Kalender? Allgemeine Java-Themen 3
R Java Stream: Ist es möglich, einen stream zusammenzufassen Allgemeine Java-Themen 6
Zrebna FileUtils.cleanDirectory() - aber einen sub-Ordner "verschonen" Allgemeine Java-Themen 1
MiMa Datei verschieben hat einen Fehler?? Allgemeine Java-Themen 20
L Generator für einen Parser implementieren Allgemeine Java-Themen 13
W Haben Konstruktoren in Java eigentlich immer mindestens einen Parameter? Allgemeine Java-Themen 4
J Wie kann ich von Vornherrein einen Fokus auf ein Objekt entfernen? Allgemeine Java-Themen 3
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
B Long in einen Double umwandeln und im Label anzeigen Allgemeine Java-Themen 7
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
MoxxiManagarm Ich brauche einen smarten Ansatz Allgemeine Java-Themen 23
J Gebautes Jar per Maven in einen Docker Container kopieren Allgemeine Java-Themen 0
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
E Einen Bot Programmieren. Allgemeine Java-Themen 6
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
P [Webdriver] einen Datensatz signieren Allgemeine Java-Themen 0
R MAC-Adresse eindeutig für einen PC ? Bezug zu Netzwerk, wieso ? Allgemeine Java-Themen 7
L Variablen Eigenes Objekt wie z.B. einen Integer zuweisen Allgemeine Java-Themen 3
N Wie öffne ich einen runtergeladadenen Code in IntelliJ Allgemeine Java-Themen 3
R Wie einen ClientBuilder / JarBuilder programmieren? Allgemeine Java-Themen 14
S Input/Output Beste Möglichkeit einen String in einen Datei zu Schreiben Allgemeine Java-Themen 2
L Input/Output Wie kann man in der Konsole einen Text farbig ausgeben z.b in grün Allgemeine Java-Themen 6
L Wie programmiert man einen Listener? Allgemeine Java-Themen 1
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
M Was braucht man, um einen Java Job zu bekommen? Allgemeine Java-Themen 8
G Substrings in einen String zusammenfassen Allgemeine Java-Themen 5
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
N Compiler-Fehler Warum erhalte ich einen Nullpointer Fehler? Allgemeine Java-Themen 2
P Zum src Ordner einen Projektes navigieren Allgemeine Java-Themen 8
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
MaxG. Swing Wie kann man einen Dateiordner auswählen ? Allgemeine Java-Themen 3
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
KeVoZ_ int Werte in einen String fassen Allgemeine Java-Themen 4
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
S Einen Punkt um den Ursprung drehen Allgemeine Java-Themen 5
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
M Genaues Bugtracking - jemand einen Vorschlag? Allgemeine Java-Themen 14
L Gibt es in Java einen Property Editor? Allgemeine Java-Themen 2
S Einen übergebenen String kopieren Allgemeine Java-Themen 3
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
L Wie kann ich einen Keystore aus existierenden Zertifikaten erstellen? Allgemeine Java-Themen 1
P Vectorelemente in einen anderen Vector kopieren Allgemeine Java-Themen 12
U in java an einen Rückgabewert aus matlab rankommen Allgemeine Java-Themen 2
B einen color-chooser bauen, ähnliche Farben vermeiden Allgemeine Java-Themen 5
B .txt Datei in einen kompletten String konvertieren Allgemeine Java-Themen 20
H Gibt es einen großen Unterschied zwischen Java 6 und Java 7? Allgemeine Java-Themen 3
M String in einen 2D array bringen Allgemeine Java-Themen 2
Y Prüfen ob ein Graph immer einen von mehren Enden erreicht Allgemeine Java-Themen 4
J (Java3D) Einen Faden programmieren - Logikproblem Allgemeine Java-Themen 5
Y Applet/Html - Wie Java-Methode aufrufen, die einen Parameter erwartet? Allgemeine Java-Themen 3
Rudolf In wie fern lohnt sich C++ für einen Javaentwickler Allgemeine Java-Themen 70
A Welches Speichermanagement für einen Kalkulator Allgemeine Java-Themen 7
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
J String-Typ in einen generischen Typ T umwandeln Allgemeine Java-Themen 6
S RandomAcessFile das einen InputStream wrappt..? Allgemeine Java-Themen 2
H Scanner soll einen Inputredirect einlesen, liest aber nicht jedes Wort ein. Allgemeine Java-Themen 3
H Wie erzeugt man einen Daemon? Allgemeine Java-Themen 7
S Wie beendet man einen Process in Java Platform unabhänging? Allgemeine Java-Themen 8
Z Threads Thread für einen Client Allgemeine Java-Themen 9
A nur einen Wert aus einer .conf lesen und erneuern Allgemeine Java-Themen 3
S MANIFEST DATEI hat nur einen Eintrag Allgemeine Java-Themen 14
M Einen Prozess "crashen" lassen Allgemeine Java-Themen 9
I getResponseCode(); returnt einen falschen Wert? Allgemeine Java-Themen 7
U Wie kann mit einen Java Applet Dateien erstellen,verschieben und löschen? Allgemeine Java-Themen 9
C Argument an einen Thread übergeben Allgemeine Java-Themen 4
A Framework für einen Web Service Allgemeine Java-Themen 6
I %AppData% Variable für einen Prozess setzen Allgemeine Java-Themen 23
V Gibt es einen Variablen Cast? Allgemeine Java-Themen 8
S regex für einen Link Allgemeine Java-Themen 3
M Client für einen Webservice erstellen (ONVIF) Allgemeine Java-Themen 3
T Undwandlung eines String in einen InputStream? Allgemeine Java-Themen 3
M Selbst geschriebener InputStreamReader über einen beliebigen InputStream Allgemeine Java-Themen 4
P Datei in einen String lesen Probleme bei Codierung Allgemeine Java-Themen 2
H SwingWorker statt Thread für einen Server Allgemeine Java-Themen 2
G einen Thread beim Schlafen überraschen und abschießen Allgemeine Java-Themen 3
A Variable Parameterinhalte an einen Query übergeben? Allgemeine Java-Themen 3
M einen Tag addieren Allgemeine Java-Themen 11
T In der JVM einen weiteren, unabhängigen Prozess starten Allgemeine Java-Themen 11
Schandro Datei öffnen mit... Bestimmten Dateityp mit einen Java-Programm öffnen lassen Allgemeine Java-Themen 5
B Gibt es einen Unterschied zwischen Java 1.2 und Java 2? Allgemeine Java-Themen 7
T Wie kann ich einen doppelstart vermeiden? Allgemeine Java-Themen 9
G Teilstring in einen String einfügen Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben