Poprzedni post poruszał tematykę związaną z podpisywaniem dokumentów. Wpis ten jednak nie zamykał tematu, ponieważ nie pokazywał jak można zweryfikować podpisany dokument. Temat ten postaram się poruszyć w tym wpisie.
Weryfikacja podpisanego dokumentu wydaje mi się o wiele prostsza niż jego podpisywanie. W celu weryfikacji dokumentu należy tylko odnaleźć element Signature i sprawdzić, czy podpis w nim zawarty odpowiada podpisywanemu dokumentowi. Od razu dodam założenie, że dokument, w którym znajduje się inna ilość elementów Signature niż jeden, uważam za niepoprawny. Dodatkowo w przypadku, gdy dokument XML nie zawiera w sobie informacji pozwalającej na weryfikację podpisu należy ją uzupełnić.
Funkcja weryfikująca autentyczność dokumentu poprzez weryfikację podpisu wyglądać może w następujący sposób:
/// <summary> /// Checks if document has valid XML signature /// </summary> /// <param name="xmlDocument">Document to check</param> /// <param name="key">Key which XML signature should be checked</param> /// <returns>Valid of signature</returns> public static bool CheckXmlSignature(XmlDocument xmlDocument, AsymmetricAlgorithm key) { if (xmlDocument == null) { throw new ArgumentNullException("xmlDocument"); } if (key == null) { throw new ArgumentNullException("key"); } // Create a new SignedXml object and pass it // the XML document class. SignedXml signedXml = new SignedXml(xmlDocument); // Find the "Signature" node and create a new // XmlNodeList object. XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature"); if (nodeList.Count == 1) { // Load the signature node. signedXml.LoadXml((XmlElement)nodeList[0]); // Check the signature and return the result. return signedXml.CheckSignature(key); } else { return false; } }
W powyższej metodzie, sprawdzany jest podpisany dokument, w którym brakuje informacji pozwalającej zweryfikować poprawność podpisu. Dlatego też uzupełniamy tę informację poprzez parametr key. W przypadku, gdy dokument XML zawiera w sobie informację pozwalającą na weryfikację podpisu w powyższej metodzie należy zmienić tylko jedną linijkę:
Z:
return signedXml.CheckSignature(key);
Na:
return signedXml.CheckSignature();
W tym wypadku należy również usunąć bezużyteczny parametr z metody – AsymmetricAlgorithm key.
Zostaw komentarz