Estoy desarrollando una aplicación para Android, y necesito usar java Signature
class para la autenticación de datos.SHA256 con firma RSA devuelve diferentes salidas en varios dispositivos Android
En cada dispositivo Android, puedo firmar los datos y verificar su firma. Sin embargo, dado un trozo definido de datos para firmar, un módulo definido, un exponente privado definido y un exponente público definido, los resultados de mis firmas son diferentes, dependiendo de los dispositivos. Lo intenté con muchos dispositivos, y obtuve las mismas firmas para Android 3.2 y 3.2.1, pero diferentes para un dispositivo con Android 2.2.x.
Calculo estas firmas a partir de campos constantes que he generado previamente usando KeyFactory
con RSA en un proyecto Java. El tamaño de la clave es 2048bit.
Aquí hay una cita del código que utilizo para invocar Firma y verificación.
public byte[] signData(byte[] data, PrivateKey privateKey) throws ... {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data);
return signature.sign();
}
public boolean verifyData(byte[] data, byte[] sigBytes, PublicKey publicKey) throws ... {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(data);
return signature.verify(sigBytes);
}
Si no me equivoco, la firma con SHA256 con RSA es determinista. Entonces, ¿cómo puedo explicar tal comportamiento? Otra pregunta interesante, ¿cómo podría hacer que funcione en dispositivos cruzados, es decir, las firmas serían las mismas, no importa qué dispositivo utilizo?
Gracias de antemano, Franck!
El código se ve bien, aunque pegar los controladores de error apenas era necesario. Asegúrese de que la clave y la información que se va a firmar sean las mismas. –
@SevaAlekseyev Sí, estoy seguro de que todas las entradas de mi sistema son las mismas. Los codifiqué como finales estáticos, en una clase, que contienen estas constantes. No vinculé los valores constantes por conveniencia. – franckysnow
Depurar paso a paso. Primero, calcule los hash SHA256 en todas esas plataformas y compárelos. –