2015-12-24 17 views
5

Sto tentando di codificare un messaggio con SH1 RSA ma non ho esperienza con soggetti di sicurezza tranne alcune informazioni di base su RSA. Ho ricevuto una chiave privata come String. Sono riuscito a scrivere il seguente blocco di codice per fare il lavoro ma non sono sicuro se sto facendo il lavoro in modo sicuro e corretto.Java: come posso generare PrivateKey da una stringa?

Non sono un esperto ma mettere la mia chiave privata come stringa nel codice non è sicuro, suppongo. Qualcuno può guidarmi?

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()); 

La mia chiave privata è in forma come:

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

cos'è il privateKeyString? una password? o una vera chiave privata RSA numerica? e in che formato viene dato? Base64? Esadecimale? Altro? –

+0

@konstantinosChalkias, ho aggiunto il mio formato chiave. –

+0

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

risposta

8

Il formato di key è una chiave privata PKCS8 con codifica Base64-encoded in chiaro. Ecco un esempio di come decodificarlo in una chiave privata. (Non preoccuparti della sicurezza della chiave privata in questo esempio, è solo un esempio per l'esempio).

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

se stampo questo: Log.i ("", "Reversed PEM: "+ Base64.encodeToString (privkey.getEncoded(), Base64.Default)); Non dovrebbe stampare la stringa PEM originale. Nel mio caso non è lo stesso .. – Farhan

+1

@Farhan: No, non necessariamente. L'implementazione può, ad esempio, scambiare le posizioni di p e q nella forma codificata, che genererà un output diverso (ma equivalente). –

+0

Grazie per la risposta. quindi vuoi dire che non avrà alcun effetto sull'ssl handshake? – Farhan

Problemi correlati