我正在開發一個需要對html文檔進行數字簽名的Android應用程序。 該文檔駐留在數據庫中,採用JSON格式。 我在本地簽署的文件使用bash腳本我一些其他太問題發現:在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中創建的簽名以及某些HTMLDoc.html中的數據,返回e應用程序。
我發送HTML和簽名JSON對象例如:
{ "data" : "<html><body></body></html>", "signature":"6598 13a9 b12b 21a9 ..... " }
Android的應用程序保存在公鑰共享首選項如下:
-----BEGIN PUBLIC KEY----- MIIBIDANBgkqhkiG9w0AAAEFAAOCAQ0AvniCAKCAQEAvni/NSEX3Rhx91HkJl85 \nx1noyYET ......
通知的「\ n」(換行符)(在從publicKey.pem複製字符串到Android Gradle配置時自動添加)
好吧,畢竟準備,現在的問題。 我想驗證沒有成功的關鍵。
我使用下面的代碼:
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;
}
}
誰能幫助?我究竟做錯了什麼 ?
我錯過了一些字節轉換?也許JSON對象影響簽名?
簽名是否應包含原始文件包含的\ n(換行符),還是應在JSON文件中沒有?
在此先感謝所有幫助,其高度讚賞。
我一直嘗試不同的方法沒有成功,試圖從JSON對象中刪除換行符,嘗試過getBytes(「ASCII」)和getBytes(「UTF-8」)。 – Noxymon
你有沒有得到任何異常?哪一個? – Henry
我沒有收到任何異常,它只是返回False'signCheck.verify()' – Noxymon