online - ¿Cómo firmar un texto genérico con clave RSA y codificar con Base64 en Java?
java.util.base64 jar (3)
Puede usar la API de seguridad JDK . Eche un vistazo a esta muestra de trabajo, espero que pueda comenzar:
public static void main(String[] args) throws Exception {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair keyPair = kpg.genKeyPair();
byte[] data = "test".getBytes("UTF8");
Signature sig = Signature.getInstance("MD5WithRSA");
sig.initSign(keyPair.getPrivate());
sig.update(data);
byte[] signatureBytes = sig.sign();
System.out.println("Singature:" + new BASE64Encoder().encode(signatureBytes));
sig.initVerify(keyPair.getPublic());
sig.update(data);
System.out.println(sig.verify(signatureBytes));
}
EDITAR: El ejemplo anterior usa el codificador interno de Sun ( sun.misc.BASE64Encoder
). Lo mejor es usar algo como Base64 de Commons Codec
.
Tengo el siguiente código en bash:
signed_request = $(printf "PLAIN TEXT REQUEST" |
openssl rsautl -sign -inkey "keyfile.pem" | openssl enc -base64 | _chomp )
Básicamente, este código toma un texto sin formato, lo firma con una clave privada y codifica con Base64
¿Cómo podría hacer un código con exactamente la misma funcionalidad en Java?
Copio el enlace @Aqua publicado como una nueva respuesta, porque creo que es MUCHO más útil que cualquiera de las respuestas dadas hasta ahora. Utilice ESTO para leer / escribir claves privadas / públicas desde archivos: http://codeartisan.blogspot.ru/2009/05/public-key-cryptography-in-java.html
El enlace no dice nada sobre la firma y verificación, pero la firma es mucho más fácil. Usé este código para firmar:
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initSign(privateKey);
signature.update("text to sign".getBytes());
signature.sign();
Y para verificar:
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initVerify(publicKey);
signature.update("text to sign".getBytes);
signature.verify(signatureMadeEarlier);
Además, puede usar not-yet-commons-ssl para obtener la clave privada de un archivo y codificar usando org.apache.commons.ssl.Base64
. Usando el ejemplo de Max:
import java.security.Signature;
import org.apache.commons.ssl.Base64;
import org.apache.commons.ssl.PKCS8Key;
// [...]
PKCS8Key pkcs8 = new PKCS8Key(new FileInputStream("keyfile.pem"),
"changeit".toCharArray());
Signature sig = Signature.getInstance("MD5WithRSA");
sig.initSign(pkcs8.getPrivateKey());
sig.update(data);
byte[] signatureBytes = sig.sign();
System.out.println("Singature: " +
Base64.encodeBase64String(signatureBytes));