/* RSS feed ----------------------------------------------- */

الأربعاء، آذار ٠٢، ٢٠٠٥

Programming : Sign XML documents using .NET - Part 1



مؤخرا احتجت في أحد البرامج التي أقوم بكتابتها الي تبادل XML Documents بين الClient والServer.
أحد المتطلبات كانت حماية الDocuments من العبث أو التغيير والتأكد من أنها صادرة من الServer. كان الحل الأسهل هو استخدام Digital Signatures من أجل حماية الDocuments ,فيما يلي سوف أستعرض كيف يمكن عمل ذلك باستخدام لغة C Sharp.

يجب الملاحظة أننا لانقوم هنا بمحاولة اخفاء المحتويات الDocument بل القصد هوه حماية هذه المحتويات من العبث. لذلك في هذا المثال لا نقوم بعملية تشفير لكامل محتويات الDocument ولكننا في نفس الوقت نريد أن نحمي الDigital Signature وهو في العادة يكون مرفق في نهاية الDocument وهو الجزء الوحيد الذي يتم تشفيره.
يحتوي الDigital Signature على مايسمى بHash وهوه عبارة عن رقم يتكون من عدد كبير من الBits ويتم حساب هذا الرقم بمعادلة والمدخلات لهذه المعادلة هي الDocument التي نريد حمايتها. ان أي تغيير طفيف على أي حرف من الDocument ينتج عنه تغيير كبير في الHash المرفق في الDigital Signature.
ان استخدام الDigital Signature مبني على أساس وجود نوعين من الkeys أحدهما يدعى بالPublic Key والآخر بالPrivate Key للقيام بعملية التشفير, حيث يقوم أحد الطرفين باستخدام الPrivate Key الخاص به لعمل التشفير ولا يستطيع أحد القيام بفك التشفير الا باستخدام الPublic Key الذي يتم توفيره للطرف الأخر.يمكن توزيع الPublic Key بحرية على الانترنت حيث أن فك تشفير الDigital Signature لا يشكل أي خطر من تسرب المعلومات لأن الDocument في الأصل ليست مشفرة.
أحد الفوائد الأخرى من تشفير الDigital Signature باستخدام الPrivate Key هوه أننا بذلك نضمن أن الDocument صادرة من الServer الخاص بنا وليس من Server أخر. لأنه يستحيل فك التشفير الا باستخدام الPublic Key ولهذا يمكن التأكد بأن الSignature صادر من الServer الخاص بنا.
حسنا ندخل الآن في البرنامج بعد هذه العجالة المختصرة جدا لعمل الDigital Signatures. نريد أولا أن نحصل على زوج من الPublic والPrivate Keys. سوف أستخدم هنا الRSA Provider المتوفر من أجل الحصول على ذلك.

using System.Security.Cryptography;
namespace TestSignatrue
{
public class TestSignatureClass
{
private RSACryptoServiceProvider
RSAKey = new RSACryptoServiceProvider();

private string privateKeyStr;
private string publicKeyStr;

public TestSignatureClass()
{
privateKeyStr = RSAKey.ToXmlString(true);
publicKeyStr = RSAKey.ToXmlString(false);
}
public string GetSignedDocument()
{
.
.
}
}
}

فيما يلي شرح البرنامج :

using System.Security.Cryptography;

تحتاج أولا الى اضافة الnamespace التالي System.Security.Cryptography وسوف تحتاج الى اضافة الReference اليه باستخدام الAdd refernce dialog.

private RSACryptoServiceProvider RSAKey = new RSACryptoServiceProvider();

توفر الDot Net Framework مجموعة من الClasses التي تقدم خدمات التشفير, يطلق على هذه المجموعة اسم Crypto Service Providers. كل من هذه الClasses يمثل Algorthim تساعد في الحصول على الKeys المستخدمة في التشفير وأيضا في عملية التشفير. في هذا المثال استخدمنا الRSACryptoSerivceProvider وهو يمثل الRSA Algorthim التي تسمح بالحصول على Private و Public Keys.


string privateKeyStr = RSAKey.ToXmlString(true);

string publicKeyStr = RSAKey.ToXmlString(false);

من أجل الحصول على الKeys يجب أن نقوم باستدعاء ال RSACryptoServiceProvider.ToXmlString واذا قمت بتمرير true للparameter الأول فسوف تحصل على الPrivate key في الxml string الذي تحصل عليه واذا مررت false فسوف تحصل على Public key فقط.

في مثالنا هذا نقوم بتخزين الPrivate key في المتغير privateKeyStr وسوف نستخدمه للحصول على الDigital signature ومن ثم نمرر الPublic key (والذي تم تخزينه في المتغيرpublicKeyStr) بكل حرية لكل من يريد أن يتأكد بأن الDigital signature المرفق هو صحيح ولم يتم العبث بمحتويات الDocument.

في المقال التالي سوف أشرح كيف يمكن استخدام المتغيرات هذه للحصول على Digital signature من أي document.