Java: ¿Cómo puedo generar PrivateKey de una cadena?

Estoy intentando codificar un mensaje con SH1 RSA pero no tengo ninguna experiencia con el tema de la seguridad excepto alguna imformación básica sobre RSA . He dado una clave privada como String . He manejado escribir el bloque siguiente del código para hacer el trabajo pero no estoy seguro si estoy haciendo el trabajo seguro y derecho.

No soy un experto, pero poner mi privete clave como cadena en el código no seguro supongo. ¿Puede alguien guiarme?

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

Mi clave privada está en forma como:

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

Su formato clave es una clave privada codificada en PKCS8 codificada en base64 sin cifrar. Aquí hay un ejemplo de cómo decodificarlo en una clave privada. (No se preocupe por la seguridad de la clave privada en este ejemplo, es sólo un tiro para el ejemplo).

 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); } } 
  • RSA PKCS1-OAEP padding es compatible con bouncycastle?
  • Cómo crear un inicio de sesión sin contraseña para aplicaciones para móviles
  • ¿Hay alguna forma de comprobar si la firma de una aplicación está depurada o publicada?
  • ¿Cómo verifica facebook la autenticidad de la aplicación con hash clave?
  • Seguridad de aplicaciones móviles híbridas
  • Usar bloqueo de pantalla en mi aplicación
  • ¿Cómo puedo validar un android.net.http.SsLCertificate con un X509TrustManager?
  • Android Central Keystore
  • Proveedor de contenido privado de Android?
  • Esquema de autenticación para una aplicación de Android: cuando la tarjeta SIM está bloqueada o cambiada por otra, la aplicación deja de funcionar
  • Cómo proteger la contraseña SFTP en APK?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.