2015-12-24 7 views
5

Ich versuche, eine Nachricht mit SH1 RSA zu codieren, aber ich habe keine Erfahrung mit Sicherheit Thema außer einigen Basisinformationen über RSA. Ich habe einen privaten Schlüssel als String erhalten. Ich habe es geschafft, den folgenden Code-Block zu schreiben, um den Job zu machen, aber ich bin mir nicht sicher, ob ich den Job sicher und richtig mache.Java: Wie kann ich PrivateKey aus einer Zeichenfolge generieren?

Ich bin kein Experte, aber meine privaten Schlüssel als String in Code ist nicht sicher, denke ich. Kann mir jemand helfen?

String privateKeyString = "mykeyhere..."; 
byte[] privateKeyBytes = privateKeyString.getBytes(); 
String encodedPrivateKey = Base64.encodeToString(privateKeyBytes, Base64.URL_SAFE); 

KeyFactory factory = KeyFactory.getInstance(RSA); 
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedPrivateKey.getBytes()); 
RSAPrivateKey privateKey = (RSAPrivateKey) factory.generatePrivate(keySpec); 

Signature instance = Signature.getInstance(ALGORITHM); 
instance.initSign(privateKey); 
instance.update(content.getBytes()); 
return new String(instance.sign()); 

Meine privaten Schlüssel ist in Form wie:

"-----BEGIN PRIVATE KEY-----\n"+ 
"MIIE...\n"+ 
"cH0iRj...\n"+ 
"O0Hhj...\n"+ 
. 
. 
. 
"fG6...\n"+ 
"B6/hF...\n"+ 
"3Mq38...\n"+ 
"-----END PRIVATE KEY-----\n" 
+0

Was ist der privateKeyString? ein Passwort? oder ein echter numerischer privater RSA-Schlüssel? und in welchem ​​Format ist angegeben? Base64? Verhexen? Andere? –

+0

@konstantinosChalkias, Ich habe mein Schlüsselformat hinzugefügt. –

+0

Haben Sie Keystore ausprobiert? http://stackoverflow.com/questions/9890313/how-to-use-keystore-in-java-to-store-private-key#answer-27869798 –

Antwort

8

Ihr Schlüssel-Format ist ein unverschlüsseltes Base64-codierte PKCS8-codierten privaten Schlüssel. Hier ist ein Beispiel, wie man es in einen privaten Schlüssel entschlüsseln kann. (Machen Sie sich in diesem Beispiel keine Gedanken über die Sicherheit des privaten Schlüssels, es ist nur ein Wegwerfprodukt für das Beispiel).

import java.io.*; 
import java.security.KeyFactory; 
import java.security.PrivateKey; 
import java.security.spec.PKCS8EncodedKeySpec; 
import android.util.Base64; 

public class ReadPKCS8Pem { 

    private final static String PRIVATE_KEY = 
      "-----BEGIN PRIVATE KEY-----\n" 
      + "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAM7t8Ub1DP+B91NJ\n" 
      + "nC45zqIvd1QXkQ5Ac1EJl8mUglWFzUyFbhjSuF4mEjrcecwERfRummASbLoyeMXl\n" 
      + "eiPg7jvSaz2szpuV+afoUo9c1T+ORNUzq31NvM7IW6+4KhtttwbMq4wbbPpBfVXA\n" 
      + "IAhvnLnCp/VyY/npkkjAid4c7RoVAgMBAAECgYBcCuy6kj+g20+G5YQp756g95oN\n" 
      + "dpoYC8T/c9PnXz6GCgkik2tAcWJ+xlJviihG/lObgSL7vtZMEC02YXdtxBxTBNmd\n" 
      + "upkruOkL0ElIu4S8CUwD6It8oNnHFGcIhwXUbdpSCr1cx62A0jDcMVgneQ8vv6vB\n" 
      + "/YKlj2dD2SBq3aaCYQJBAOvc5NDyfrdMYYTY+jJBaj82JLtQ/6K1vFIwdxM0siRF\n" 
      + "UYqSRA7G8A4ga+GobTewgeN6URFwWKvWY8EGb3HTwFkCQQDgmKtjjJlX3BotgnGD\n" 
      + "gdxVgvfYG39BL2GnotSwUbjjce/yZBtrbcClfqrrOWWw7lPcX1d0v8o3hJfLF5dT\n" 
      + "6NAdAkA8qAQYUCSSUwxJM9u0DOqb8vqjSYNUftQ9dsVIpSai+UitEEx8WGDn4SKd\n" 
      + "V8kupy/gJlau22uSVYI148fJSCGRAkBz+GEHFiJX657YwPI8JWHQBcBUJl6fGggi\n" 
      + "t0F7ibceOkbbsjU2U4WV7sHyk8Cei3Fh6RkPf7i60gxPIe9RtHVBAkAnPQD+BmND\n" 
      + "By8q5f0Kwtxgo2+YkxGDP5bxDV6P1vd2C7U5/XxaN53Kc0G8zu9UlcwhZcQ5BljH\n" 
      + "N24cUWZOo+60\n" 
      + "-----END PRIVATE KEY-----"; 

    public static void main(String[] args) throws Exception { 
     // Read in the key into a String 
     StringBuilder pkcs8Lines = new StringBuilder(); 
     BufferedReader rdr = new BufferedReader(new StringReader(PRIVATE_KEY)); 
     String line; 
     while ((line = rdr.readLine()) != null) { 
      pkcs8Lines.append(line); 
     } 

     // Remove the "BEGIN" and "END" lines, as well as any whitespace 

     String pkcs8Pem = pkcs8Lines.toString(); 
     pkcs8Pem = pkcs8Pem.replace("-----BEGIN PRIVATE KEY-----", ""); 
     pkcs8Pem = pkcs8Pem.replace("-----END PRIVATE KEY-----", ""); 
     pkcs8Pem = pkcs8Pem.replaceAll("\\s+",""); 

     // Base64 decode the result 

     byte [] pkcs8EncodedBytes = Base64.decode(pkcs8Pem, Base64.DEFAULT); 

     // extract the private key 

     PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8EncodedBytes); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     PrivateKey privKey = kf.generatePrivate(keySpec); 
     System.out.println(privKey); 
    } 

} 
+0

Wenn ich dies drucken: Log.i ("", "Reversed PEM: "+ Base64.encodeToString (privkey.getEncoded(), Base64.Default)); Sollte es nicht die ursprüngliche Pem-Zeichenfolge drucken. In meinem Fall ist es nicht gleich .. – Farhan

+1

@Farhan: Nein, nicht unbedingt. Die Implementierung kann beispielsweise die Positionen von p und q in der codierten Form vertauschen, was zu einer anderen (aber äquivalenten) Ausgabe führt. –

+0

danke für die antwort. also meinst du, es wird keinen effekt auf ssl handshake haben? – Farhan