Я разрабатываю приложение для Android, которое требует цифровой подписи документа html. Документ находится в БД в форме JSON. Я подписывая документ локально с помощью Баш скрипт я нашел на каком-то другом С.О. вопрос:Проверка цифровой подписи на Android
openssl dgst -sha1 someHTMLDoc.html > hash openssl rsautl -sign -inkey privateKey.pem -keyform PEM -in hash > signature.bin
Закрытый ключ был сгенерирован с помощью:
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:3 -out privateKey.pem
Открытый ключ был создан с помощью:
openssl pkey -in privateKey.pem -out publicKey.pem -pubout
Я хочу проверить подпись, созданную в Signature.bin, вместе с данными в someHTMLDoc.html, назад e приложение.
Я посылаю как HTML и подпись как JSON экс объекта:
{ "data" : "<html><body></body></html>", "signature":"6598 13a9 b12b 21a9 ..... " }
андроид приложение держит ОткрытыйКлюч в общих префов следующим образом:
-----BEGIN PUBLIC KEY----- MIIBIDANBgkqhkiG9w0AAAEFAAOCAQ0AvniCAKCAQEAvni/NSEX3Rhx91HkJl85 \nx1noyYET ......
Обратите внимание на «\ n» (новая строка) там (была автоматически добавлена при копировании строки из publicKey.pem в Android Gradle Config.
Хорошо, все приготовления, сейчас вопрос. Я пытаюсь проверить ключ без успеха.
Я использую следующий код:
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;
}
}
Может кто-нибудь помочь? Что я делаю не так ?
Am i отсутствует какой-нибудь байт изменение? возможно, объект JSON влияет на подпись?
Должна ли подпись содержать \ n (linebreak), чтобы исходный файл содержал или должен быть без него в файле JSON?
Заранее благодарим за помощь, ее высоко оценили.
Я продолжаю пробовать разные методы без успеха, попытался удалить разрывы строк из объекта JSON, попробовал getBytes («ASCII») и getBytes («UTF-8»). – Noxymon
Вы получили какое-то исключение? Который из? – Henry
Я не получал никакого исключения, он просто возвращает False для 'signCheck.verify()' – Noxymon