C# - XML aláírás transzformációkkal

forráskód letöltése
A .NET Framework System.Security.Cryptography.Xml névterében találjuk azokat az osztályokat, melyek segítségével elkészíthetjük az XML állományaink digitális aláírását, és le is ellenőrizhetjük azt. A digitálisan aláírt XML állományok még biztonságosabbá tehetik az alkalmazások közötti XML-alapú kommunikációt. Cikkünkben a XmlDsigC14NTransform osztály lehetőségeivel ismerkedhetünk meg részleteiben.
A mellékelt példában digitálisan aláírjuk, egy tanúsítvánnyal hitelesítjük a PersonalInfo.xml állományt. Az alkalmazás felületén két műveletet tudunk elvégezni. Az „XML aláírása” feliratú nyomógomb segítségével aláírhatjuk az állományt, míg az „Ellenőrzés” feliratú megnyomásával leellenőrizhetjük annak helyességét.
Állomány aláírása
Miután a programunk elindult, a PersonalInfo.xml állomány betöltődik a böngészőkontrolba, amely a Form-on található.
Első lépésben létrehozunk egy RSACryptoServiceProvider objektumot a titkosítási algoritmushoz.
RSACryptoServiceProvider key = new RSACryptoServiceProvider();
Betöltjük a PersonalInfo.xml állományt egy XmlDocument objektumba.
XmlDocument xmldoc = new XmlDocument();
xmldoc.PreserveWhitespace = false;
xmldoc.Load(new XmlTextReader("PersonalInfo.xml"));
Létrehozunk egy SignedXml objektumot az aláírás tárolására, és a generált kulcsot megadjuk a SigningKey property-ben.
SignedXml signedXml = new SignedXml(xmldoc);
signedXml.SigningKey = key;
Szükségünk van egy referenciaosztályra is az aláíráshoz.
Reference reference = new Reference();
reference.Uri = "";
Ezután hozzuk létre az XmlDsigC14NTransform objektumot, majd a Reference objektum AddTransform metódusával adjuk át az aláíró algoritmusnak.
Transform trans = new XmlDsigC14NTransform();
reference.AddTransform(trans);
Szükségünk van egy XmlDsigEnvelopedSignatureTransform objektumra is, mely egy borítékot reprezentál az aláírás számára. Ezt is a referenciák listájához adjuk. Ennek elhagyása azt eredményezi, hogy az aláírás nem lesz megfelelő.
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
Az aláírt XML-t reprezentáló objektum megfelelő metódusával pedig a Reference objektumot adjuk meg az objektumnak.
signedXml.AddReference(reference);
Most már csak annyit kell tennünk, hogy az aláírási algoritmus kulcsát átadjuk a SignedXml objektumnak. A kulcsot a fent példányosított osztály biztosítja.
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new RSAKeyValue((RSA)key));
signedXml.KeyInfo = keyInfo;
A ComputeSignature metódussal generáljuk az aláírást.
signedXml.ComputeSignature();
Utolsó lépésként az eredeti XML-hez fűzzük az aláírást és generálunk egy új állományt.
A Verification metódus segítségével ellenőrizhetjük az aláírás helyességét. Itt beolvassuk az aláírt XML-t egy SignedXml objektumba, megkeressük a Signature tagot az XML-ben, majd ellenőrizzük a CheckSignarture metódussal.
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load("SignedPersonalInfo.xml");
SignedXml signedXml = new SignedXml(xmldoc);
XmlNodeList nodeList = xmldoc.GetElementsByTagName("Signature");
...
return signedXml.CheckSignature();
Az állományokat a böngészőkontrol Navigate metódusával töltjük be. A megjelenítésnek köszönhetően rögtön látható a fájlok közötti eltérés. A ComboBox-ban elegendő kiválasztani a megfelelőt.
axWebBrowser1.Navigate(Application.StartupPath + "\\" + comboBox1.Text,ref m,ref m,ref m,ref m);