Ich entwickle eine Android-Anwendung, die ein HTML-Dokument digital signieren muss. Das Dokument befindet sich in der Datenbank in einem JSON-Formular. Ich bin die Unterzeichnung das Dokuments lokal einen Bash-Skript verwende ich auf einer anderen SO Frage gefunden:Digitale Signatur unter Android
openssl dgst -sha1 someHTMLDoc.html > hash openssl rsautl -sign -inkey privateKey.pem -keyform PEM -in hash > signature.bin
private Schlüssel verwendet hat generiert:
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:3 -out privateKey.pem
Public-Key wurde mit erstellt:
openssl pkey -in privateKey.pem -out publicKey.pem -pubout
Ich möchte die Signatur überprüfen, die in Signature.bin zusammen mit den Daten in someHTMLDoc.html erstellt wurde, zurück in th die Anwendung.
Ich sende sowohl die HTML-und Signatur als JSON-Objekt ab:
{ "data" : "<html><body></body></html>", "signature":"6598 13a9 b12b 21a9 ..... " }
Die Android-Anwendung die PublicKey in gemeinsamen Prefs hält wie folgt:
-----BEGIN PUBLIC KEY----- MIIBIDANBgkqhkiG9w0AAAEFAAOCAQ0AvniCAKCAQEAvni/NSEX3Rhx91HkJl85 \nx1noyYET ......
Beachten Sie die "\ n" (Newline) darin (wurde automatisch hinzugefügt, wenn die Zeichenfolge von publicKey.pem in Android Gradle Config kopiert wurde.
Ok, nach allen Vorbereitungen, jetzt die Frage. Ich versuche, den Schlüssel ohne Erfolg zu validieren.
ich den folgenden Code verwenden:
private boolean verifySignature(String data, String signature) {
InputStream is = null;
try {
is = new ByteArrayInputStream(Config.getDogbarPublic().getBytes("UTF-8")); //Read DogBar Public key
BufferedReader br = new BufferedReader(new InputStreamReader(is));
List<String> lines = new ArrayList<String>();
String line;
while ((line = br.readLine()) != null)
lines.add(line);
// removes the first and last lines of the file (comments)
if (lines.size() > 1 && lines.get(0).startsWith("-----") && lines.get(lines.size() - 1).startsWith("-----")) {
lines.remove(0);
lines.remove(lines.size() - 1);
}
// concats the remaining lines to a single String
StringBuilder sb = new StringBuilder();
for (String aLine : lines)
sb.append(aLine);
String key = sb.toString();
byte[] keyBytes = Base64.decode(key.getBytes("utf-8"), Base64.DEFAULT);
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(spec);
Signature signCheck = Signature.getInstance("SHA1withRSA"); //Instantiate signature checker object.
signCheck.initVerify(publicKey);
signCheck.update(data.getBytes());
return signCheck.verify(signature.getBytes()); //verify signature with public key
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
Kann jemand helfen? Was mache ich falsch ?
Fehle ich einige Byte-Konvertierung? Vielleicht beeinflusst das JSON-Objekt die Signatur?
Sollte eine Signatur die \ n (Zeilenumbrüche) enthalten, die die Originaldatei enthält oder in der JSON-Datei enthalten sollte?
Vielen Dank im Voraus für alle Hilfe, es ist sehr geschätzt.
Ich versuche verschiedene Methoden ohne Erfolg, habe versucht, die Zeilenumbrüche aus dem JSON-Objekt zu entfernen, habe getBytes ("ASCII") und getBytes ("UTF-8") versucht. – Noxymon
Haben Sie eine Ausnahme erhalten? Welcher? – Henry
Ich habe keine Ausnahme erhalten, es gibt nur False für 'signCheck.verify()' – Noxymon