Bu yazımda size daha önceki Elektronik/Sayısal İmzaların Özellikleri ve Güvenilirlikleri yazımda söylediğim dijital imza demosunu yapacağım. Bir sonraki imza yazımda harici bir sertifika kullanarak 3 farklı imzalama stilinden bahsedeceğim. Ancak bu yazımda hızlıca XML imzalama işlemine aşina olunması için basit bir demo yapacağım. Fazla uzatmadan koda(C#) geçelim 🙂
Adım 1: demo.xml dosyasının oluşturulması
1 2 3 4 5 6 7 8 9 10 11 | <?xml version="1.0"?> <test> <Kisi> <Adi>Süleyman Uğur</Adi> <Soyadi>Özışık</Soyadi> </Kisi> <Kisi> <Adi>Fatih</Adi> <Soyadi>Erez</Soyadi> </Kisi> <test> |
Adım 2: RSA Anahtar oluşturma
RSA ile anahtar üreteceğimiz adım burası. RSA yöntemi daha önceki yazımda da bahsettiğim gibi açık anahtar algoritmaları uygulamalarında kullanılmaktadır.
Burada System.Security.Cryptography referansından CspParameters sınıfını kullanacağız. Bu sınıf sayesinde anahtar oluşturabileceğiz.
1 2 3 | CspParameters csp= new CspParameters(); cspParams.KeyContainerName = "DemoCSP"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp); |
Oluşan anahtarımızın çıktısına bakabiliriz. Ya da anahtarı bir yere kaydedebilirsiniz.
1 | Console.WriteLine("Oluşturulan Anahtar: \n" + rsa.ToXmlString(true)); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?xml version="1.0"?> -<RSAKeyValue> <Modulus>y+rXthoCklhh5fz+k0PZ02pe7JtYfraMgHNiyO517h8bDaKcMySyJ661EBTjGOORHBCYZlT8nYHrvV7k7ePvbVOIfiO4iNa/QuWQSJHq43gOhv4nGqWydZa+MNi9q7CcySW3HRIwXVV+PHIeXfRQ/zSOiEyiQdxosKFa+BVecEk=</Modulus> <Exponent>AQAB</Exponent> <P>0xqtshqRn/GkR/2BVvtX0uvZq3u4W6uE/vYNNGDjjCmITAiY6qX0yDDkKik3xOzo58zrFb5NOXxpkdoPj3o7Tw==</P> <Q>90jiTqXpIODNpHUNXAczqwjCxLLgcSMlIYzZ4j+6JU/DIJ9d17qyqeMi5H6eudpovK2vmZ14WhtQFJYROFNU5w==</Q> <DP>mBR3H4DOeihNzmMNg4ksmtG4DTbi+H9XH4pItvw50Wa2PvhOmXSXJIU8SjdJav+1RhC1JwPihFBhiWZLoXRQNw==</DP> <DQ>Q1BjymT/gSOw1wPGDzcmqXhJDKJk1mdqxCdDaINQeLettkOrl/4KhJR/+xM8wfriZ/ofwwFKsbydn/z50wtcIQ==</DQ> <InverseQ>UKh8w2Wlev+BMlytUnJzGVvTUu4O/7oucbqTFNqYhVHHUDCrPm01CG1S8lplHqf52duUgivbWzTENpkZcLKnzg==</InverseQ> <D>BP2mceqJDZPkMYDTqj8K4cXEtP3IWLGXFr28OTa85CsWumq0b/wB8D6yZ8ZbGIzZTFqLoFWMKT64ylW8PKZLgdJFeR6Z+55FwYeXVqlB/oU8hSUcY/EvAhfOs6twkpsf/z+8Qy/I4abDPrNEf2Q9DmZsVnB2/Su7EZBqlwJq/VE=</D> </RSAKeyValue> |
Adım 3: demo.xml dosyamızı okuyalım
demo.xml dosyamızı içeri alalım. Uzantıyı kendi bilgisayarınıza göre ayarlamanız gerekmektedir.
1 2 3 | XmlDocument xmlDoc = new XmlDocument(); xmlDoc.PreserveWhitespace = true; xmlDoc.Load("C:\\Users\\uguro\\OneDrive\\Masaüstü\\demo.xml"); |
Adım 4: İmzanın basılacağı XML dökümanını oluşturalım.
SignedXml classından bir nesne olusturuyoruz. Bu class System.Security.Cryptography.Xml referansıyla birlikte kullanılabilir. Anahtara ise daha önce oluşturduğumuz rsa key’ini atıyoruz.
1 2 | SignedXml imzalıXml = new SignedXml(xmlDoc); imzalıXml.SigningKey = rsa; |
Adım 5: Referans Oluşturma
İmzalanacak XML dökümanının hangi bölümünün imzalanacağını burada belirtiyoruz uri=”” ise tüm xml imzalanacak demektir. Ayrıca referans ile imzanın hangi stilde olduğuna(3 çeşit : Enveloped, Enveloping, Detached) karar veririz. Bu bölümü bir sonraki yazımda daha net anlatacağım.
1 2 3 | Reference referans= new Reference(); //Tüm döküman imzası referans.Uri = ""; |
Adım 6: İmza stilimizi setleme
Bu yazıda enveloped(zarflanmış) türünde imzalama kullanacağız. Yani xml dökümanında bizim imzalanmamış xml bloklarının dışında yeni bir xml atacağız. Append direk altına olacak gibi düşünebilirsiniz. Bu yöntemi burada setliyoruz. XmlDsigEnvelopedSignatureTransform classı enveloped türünde imzalama işlemi yapacaktır. Enveloped türü seçildikten sonra referans nesnemize bunu transform ediyoruz. Not: Daha sonra imzalanmıs xml çıktısında transform alanını buradan alacaktır.
1 2 | XmlDsigEnvelopedSignatureTransform enveloped = new XmlDsigEnvelopedSignatureTransform(); referans.AddTransform(enveloped ); |
Adım 7: Oluşturduğumuz referansı imzalı olacak XML’imize atama
5 ve 6. adımlarda yaptığımız işlemleri imzalı olacak “imzalıXml” nesnesine atarız. Artık imza xml dosyası oluşturulacak duruma geldi.
1 | imzaliXml.AddReference(referans); |
Adım 8 : İmza Oluşturma
Yukarıda yaptığımız adımlardan sonra imzamızı oluşturabiliriz.
1 | imzaliXml.ComputeSignature(); |
Adım 9: Oluşturduğumuz imza XML’ini demo.xml dosyasına append etme
XMLElement class’ı kullanarak 3. adımda içeri aldığımız demo.xml dökümanına child olarak ekleyerek kaydederiz.
1 2 3 | XmlElement xmlDigitalSignature = imzaliXml.GetXml(); xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true)); xmlDoc.Save("C:\\Users\\uguro\\OneDrive\\Masaüstü\\demo.xml"); |
Adım 10: İmzalanmış XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <?xml version="1.0"?> -<test> -<Kisi> <Adi>Süleyman Uğur</Adi> <Soyadi>Özışık</Soyadi> </Kisi> -<Kisi> <Adi>Fatih</Adi> <Soyadi>Erez</Soyadi> </Kisi> -<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> -<SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> -<Reference URI=""> -<Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> <DigestValue>2lX+UztHLuwG/fDcPVqyGiGd51Gmdb/UZzKqBXrQjnY=</DigestValue> </Reference> </SignedInfo> <SignatureValue>fqxx3jRxAHEKg4xgS7TQ3Fc4McvS2TYku8wvklsUhLZo7PLTZwclQUxYTUr73ogUbyyLm90ZimRMzDL4n5Wepqs+yqZ/OPqR2/qUM1fxyf1UqQS4stOBsd6wDJYl+O811Tn8oEuH2zW7XVbNn3XjTWfF4D71c7IX8oJxUFosGvw=</SignatureValue> </Signature> </test> |