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