He utilizado KeyPairGenerator
para generar un par de claves RSA. Si no me equivoco, KeyStore solo se usa para almacenar certificados y no claves. ¿Cómo puedo almacenar correctamente la clave privada en la computadora?¿Cómo usar el almacén de claves en Java para almacenar claves privadas?
Respuesta
Usted puede hacer algo como esto:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.genKeyPair();
KeyFactory fact = KeyFactory.getInstance("RSA");
RSAPublicKeySpec pub = fact.getKeySpec(kp.getPublic(),
RSAPublicKeySpec.class);
saveToFile(PUBLIC_KEY_FILE,
pub.getModulus(), pub.getPublicExponent());
RSAPrivateKeySpec priv = fact.getKeySpec(kp.getPrivate(),
RSAPrivateKeySpec.class);
saveToFile(PRIVATE_KEY_FILE,
priv.getModulus(), priv.getPrivateExponent());
La función de ahorro:
private static void saveToFile(String fileName,
BigInteger mod, BigInteger exp)
throws SomeException {
ObjectOutputStream oout = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream(fileName)));
try {
oout.writeObject(mod);
oout.writeObject(exp);
} catch (Exception e) {
throw new SomeException(e);
} finally {
oout.close();
}
}
Y leer el mismo camino de vuelta :
private static PublicKey readPublicKey() throws SomeException {
InputStream in = new FileInputStream(PUBLIC_KEY_FILE);
ObjectInputStream oin =
new ObjectInputStream(new BufferedInputStream(in));
try {
BigInteger m = (BigInteger) oin.readObject();
BigInteger e = (BigInteger) oin.readObject();
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(m, e);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(keySpec);
return pubKey;
} catch (Exception e) {
throw new SomeException(e);
} finally {
oin.close();
}
}
lectura clave privada es similar.
http://snipplr.com/view/18368/
O
http://docs.oracle.com/javase/1.5.0/docs/api/java/security/KeyStore.html
O
http://java.sun.com/docs/books/tutorial/security/apisign/vstep2.html Esto es más prometedor
O
Es imposible asegurar una clave en un entorno no confiable. Puedes ofuscar tu código, puedes crear una clave a partir de variables arbitrarias, lo que sea. En última instancia, suponiendo que utiliza la biblioteca javax.crypto estándar, debe llamar a Mac.getInstance(), y en algún momento más tarde llamará a init() en esa instancia. Alguien que quiera tu llave lo obtendrá.
Sin embargo, creo que la solución es que ata la clave del entorno, no del programa. Una firma está destinada a decir que los datos se originaron a partir de una fuente conocida, y no se ha manipulado desde que la fuente lo proporcionó. Actualmente, intenta decir "garantizar que mi programa produjo los datos". En cambio, cambie su requisito de "garantizar que un usuario particular de mi programa haya producido los datos". La responsabilidad se transfiere a ese usuario para que cuide su clave.
Dependiendo del formato de su clave privada, puede que tenga que convertirla a un formato que pueda usar la herramienta keytool de Java.
Pero si está en un formato compatible con keytool debería poder importarlo usando la herramienta de keytool. información más en:
http://docs.oracle.com/javase/tutorial/security/toolfilex/rstep1.html
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/keytool.html
Este bloque de código generará y almacenará un KeyPair en AndroidKeyStore. (NOTA: las capturas de excepción omitidos)
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
String alias = "my_key"; // replace as required or get it as a function argument
int nBefore = keyStore.size(); // debugging variable to help convince yourself this works
// Create the keys if necessary
if (!keyStore.containsAlias(alias)) {
Calendar notBefore = Calendar.getInstance();
Calendar notAfter = Calendar.getInstance();
notAfter.add(Calendar.YEAR, 1);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(this)
.setAlias(alias)
.setKeyType("RSA")
.setKeySize(2048)
.setSubject(new X500Principal("CN=test"))
.setSerialNumber(BigInteger.ONE)
.setStartDate(notBefore.getTime())
.setEndDate(notAfter.getTime())
.build();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
generator.initialize(spec);
KeyPair keyPair = generator.generateKeyPair();
}
int nAfter = keyStore.size();
Log.v(TAG, "Before = " + nBefore + " After = " + nAfter);
// Retrieve the keys
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);
RSAPrivateKey privateKey = (RSAPrivateKey) privateKeyEntry.getPrivateKey();
RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey();
Log.v(TAG, "private key = " + privateKey.toString());
Log.v(TAG, "public key = " + publicKey.toString());
- 1. Java cifrado asimétrico: mejor forma de almacenar claves públicas/privadas
- 2. Almacenamiento de claves públicas y privadas en una base de datos o almacén de claves
- 3. Importación .pem claves públicas y privadas al almacén de claves JKS
- 4. ¿Contenedores clave, lo suficientemente seguros como para almacenar claves privadas?
- 5. Claves RSA públicas/privadas en YAML
- 6. ¿Dónde esconde Eclipse el almacén de claves?
- 7. Mejores prácticas para claves privadas personales
- 8. Intentando actualizar el almacén de claves 'caducado'
- 9. ¿Cómo usar una Hashtable para almacenar solo las claves?
- 10. ¿Puede un almacén de claves de Java importar un par de claves generado por OpenSSL?
- 11. ¿Cómo puedo generar un "Almacén de claves" para Google Play?
- 12. Certificado de almacén de claves Tomcat HTTPS
- 13. Cómo hacer correctamente la gestión de claves privadas
- 14. ¿Es una mala práctica usar el almacén de claves estándar de Java
- 15. Generación de claves de RSA y almacenamiento en el almacén de claves
- 16. Generar certificados, claves públicas y privadas con Java
- 17. Error de "versión incorrecta del almacén de claves". ¿Cómo puedo crear un certificado de almacén de claves version = 1?
- 18. ¿Qué significa "exportar claves privadas" (Makecert -pe)?
- 19. ¿Las claves públicas y privadas son intercambiables?
- 20. Definiciones de almacén de confianza y almacén de claves
- 21. Cómo cifrar datos en php usando claves públicas/privadas?
- 22. Ubicación del contenedor para claves públicas y privadas en Windows?
- 23. Cómo extraer claves privadas de un agente ssh?
- 24. GAE: ¿mejores prácticas para almacenar claves secretas?
- 25. Mejores prácticas para almacenar claves secretas
- 26. Almacén de valores/claves persistentes distribuido más simple que admite consultas de rango de claves primarias
- 27. ¿Puedo usar el mismo archivo de almacén de claves para firmar dos aplicaciones diferentes?
- 28. ¿Por qué aparece el error "No se pueden almacenar claves no privadas" al crear un socket SSL en Java?
- 29. Especificación del formato de almacén de claves JKS
- 30. ¿Es posible tener cifrado con múltiples claves privadas (PHP)?
@segfault, También hay que tener en cuenta que es necesario ' ' para añadir este en 'AndroidManifest.xml ' –
Israel
¿Es seguro almacenar la clave privada en el almacenamiento a la que se puede acceder a través de otras aplicaciones? (Corrígeme si me equivoco, pero eso es lo que se hace aquí). – cph2117
Depende de usted configurar los permisos en el archivo en el nivel del sistema operativo (por ejemplo, un usuario dedicado para la aplicación, etc.). Ovuosamente, está fuera del alcance de esta respuesta. –