मैं एक एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं जिसके लिए डिजिटली हस्ताक्षर एचटीएमएल दस्तावेज़ की आवश्यकता है। दस्तावेज़ जेएसओएन फॉर्म में डीबी में रहता है। मैं दस्तावेज पर हस्ताक्षर करने कर रहा हूँ स्थानीय स्तर पर एक bash स्क्रिप्ट मैं कुछ अन्य तो सवाल पर पाया का उपयोग कर:एंड्रॉइड पर डिजिटल हस्ताक्षर सत्यापित करें
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
मैं कुछ HTMLDoc.html में डेटा के साथ Signature.bin में बनाए गए हस्ताक्षर को सत्यापित करना चाहता हूं, वें ई आवेदन इस प्रकार
{ "data" : "<html><body></body></html>", "signature":"6598 13a9 b12b 21a9 ..... " }
एंड्रॉयड आवेदन साझा वरीयता में PublicKey रखती है::
मैं दोनों एचटीएमएल और के रूप में JSON वस्तु पूर्व हस्ताक्षर भेज रहा हूँ
-----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 फ़ाइल के बिना होना चाहिए या होना चाहिए?
सभी मदद के लिए अग्रिम धन्यवाद, इसकी अत्यधिक सराहना की गई।
S = E(H(C))
हस्ताक्षर सत्यापन लेता है:
मैं बिना किसी सफलता के विभिन्न तरीकों का प्रयास करता रहता हूं, JSON ऑब्जेक्ट से लाइन ब्रेक को हटाने का प्रयास किया है, GetBytes ("ASCII") को प्राप्त करने का प्रयास किया है और बाइट्स ("यूटीएफ -8") प्राप्त करें। – Noxymon
क्या आपको कोई अपवाद मिला? कौनसा? – Henry
मुझे कोई अपवाद नहीं मिला, यह सिर्फ 'signCheck.verify() ' – Noxymon