سؤال

كنت أحاول التحقق من صحة توقيع XML.

التحقق حسب هذا الدورة التعليمية يعمل بشكل جيد.

لكنني حاولت أيضا نهجا ثانية. للتحقق من ذلك مع تحقق من الطريقة من فئة التوقيع التي استخرجت التوقيع والشهادة من ملف XML ، وفعلت ما يلي:

    public static boolean checkSignedFile(byte[] data, byte[] sigToVerify,
        byte[] cert, String algorithm) throws CertificateException,
        NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    Certificate c = (Certificate) cf
            .generateCertificate(new ByteArrayInputStream(cert));
    PublicKey pk = c.getPublicKey();
    Signature sig;
    boolean verifies = false;
    sig = Signature.getInstance(algorithm);
    sig.initVerify(pk);
    sig.update(data);
    verifies = sig.verify(sigToVerify);
    return verifies;
}

كانت النتيجة خاطئة. لم يتحقق التوقيع. ماذا يمكن أن يكون السبب وراء ذلك؟

هل كانت مفيدة؟

المحلول

لا يمكنك التحقق من XMLDSIG مثل هذا. لن ينجح. لا يتم حساب التوقيع على XML الخام. يجب أن تمر عبر الكنسي والهضم وما إلى ذلك.

ماذا تستخدم ل data[]؟ للحصول على ذلك بشكل صحيح ، عليك تقريبًا إعادة كتابة مكتبة XMLDSIG.

نصائح أخرى

إذا كانت البيانات [] هي محتوى ملف XML الموقّع ، فما هو sigtoverify؟

يقوم XMLSIG بإنشاء عنصر توقيع (SignsedInfo) يحتوي على هضم كل عنصر ليتم توقيعه والموضوع الوصفي مثل خوارزميات الكنسي/التحول المستخدمة. ثم يتم احتساب هضم هذا signedInfo-Elemnt وتوقيعه.

وبالتالي ، إذا كان sigtoVerify هو التوقيع الذي تم إنشاؤه بواسطة تطبيق XMLSignature ، فيجب ألا يكون مساويًا لتوقيع ملف XML الكامل.

هنا هو تفسير أكثر اكتمالا. وإذا كنت مهتمًا ، ألق نظرة على تخصيص.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top