私は、HTML文書に電子署名する必要があるAndroidアプリケーションを開発しています。 ドキュメントは、JSON形式のDBに存在します。 私はいくつかの他のSOの質問で発見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で作成された署名をsomeHTMLDoc.htmlのデータとともに検証したい場合は、アプリケーション。
私はJSONオブジェクトの元としてhtmlと署名の両方を送信しています:
{ "data" : "<html><body></body></html>", "signature":"6598 13a9 b12b 21a9 ..... " }
次のようにアンドロイドのアプリケーションが共有環境設定でのPublicKeyを保持している:
-----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;
}
}
は誰でも助けることができます:
私は、次のコードを使用していますか?私は間違って何をしていますか?
いくつかのバイト変換がありませんか?多分JSONオブジェクトが署名に影響を与えているのでしょうか?
オリジナルファイルに含まれる\ n(改行)の署名が含まれている必要がありますか、それともJSONファイルに含まれていないはずですか?
ご協力いただきありがとうございます。非常に高く評価されています。
私は成功のないさまざまな方法を試し続け、JSONオブジェクトから改行を取り除いてみました。getBytes( "ASCII")とgetBytes( "UTF-8")を試しました。 – Noxymon
例外はありますか?どれ? – Henry
私は例外を受けなかっただけで、 'signCheck.verify()'に対してFalseを返します。 – Noxymon