تشفير Client-Side و Azure Key Vault ل Microsoft Azure Storage

نظرة عامة

تدعم مكتبة عميل تخزين Azure ل .NET تشفير البيانات داخل تطبيقات العميل قبل تحميلها إلى Azure Storage، وفك تشفير البيانات أثناء تنزيلها إلى العميل. تدعم المكتبة أيضا التكامل مع Azure Key Vault لإدارة مفاتيح حساب التخزين.

للحصول على برنامج تعليمي خطوة بخطوة يقودك خلال عملية تشفير النقط باستخدام التشفير من جانب العميل Key Vault Azure، راجع تشفير النقط وفك تشفيرها في Microsoft Azure Storage باستخدام Azure Key Vault.

للتشفير من جانب العميل باستخدام Java، راجع التشفير من جانب العميل باستخدام Java لتخزين Microsoft Azure.

التشفير وفك التشفير عبر تقنية المغلف

تتبع عمليات التشفير وفك التشفير تقنية المغلف.

التشفير عبر تقنية المغلف

يعمل التشفير عبر تقنية المغلف بالطريقة التالية:

  1. تقوم مكتبة عميل تخزين Azure بإنشاء مفتاح تشفير محتوى (CEK)، وهو مفتاح متماثل يستخدم لمرة واحدة.

  2. يتم تشفير بيانات المستخدم باستخدام CEK هذا.

  3. ثم يتم التفاف CEK (مشفرة) باستخدام مفتاح تشفير المفتاح (KEK). يتم تعريف KEK بواسطة معرف مفتاح ويمكن أن يكون زوج مفاتيح غير متماثل أو مفتاحا متماثلا ويمكن إدارته محليا أو تخزينه في Azure Key Vaults.

    مكتبة عميل التخزين نفسها لا يمكنها أبدا الوصول إلى KEK. تستدعي المكتبة خوارزمية التفاف المفاتيح التي يتم توفيرها بواسطة Key Vault. يمكن للمستخدمين اختيار استخدام موفري خدمات مخصصين لتغليف / إلغاء تغليف المفاتيح إذا رغبت في ذلك.

  4. ثم يتم تحميل البيانات المشفرة إلى خدمة Azure Storage. يتم تخزين المفتاح المغلف مع بعض البيانات الوصفية الإضافية للتشفير إما كبيانات تعريف (على نقطة) أو محرف بالبيانات المشفرة (رسائل قائمة الانتظار وكيانات الجدول).

فك التشفير عبر تقنية المغلف

يعمل فك التشفير عبر تقنية المغلف بالطريقة التالية:

  1. تفترض مكتبة العميل أن المستخدم يقوم بإدارة مفتاح تشفير المفتاح (KEK) إما محليا أو في Azure Key Vaults. لا يحتاج المستخدم إلى معرفة المفتاح المحدد الذي تم استخدامه للتشفير. بدلا من ذلك ، يمكن إعداد محلل المفاتيح الذي يحل معرفات المفاتيح المختلفة للمفاتيح واستخدامها.
  2. تقوم مكتبة العميل بتنزيل البيانات المشفرة إلى جانب أي مواد تشفير مخزنة على الخدمة.
  3. ثم يتم فك تغليف مفتاح تشفير المحتوى المغلف (CEK) (فك تشفيره) باستخدام مفتاح تشفير المفتاح (KEK). هنا مرة أخرى ، لا تملك مكتبة العميل حق الوصول إلى KEK. إنه ببساطة يستدعي خوارزمية إلغاء التغليف المخصصة أو Key Vault الموفر.
  4. ثم يتم استخدام مفتاح تشفير المحتوى (CEK) لفك تشفير بيانات المستخدم المشفرة.

آلية التشفير

تستخدم مكتبة عميل التخزين AES لتشفير بيانات المستخدم. على وجه التحديد ، وضع تسلسل كتلة التشفير (CBC) مع AES. تعمل كل خدمة بشكل مختلف إلى حد ما ، لذلك سنناقش كل منها هنا.

الكائنات الثنائية كبيرة الحجم

تدعم مكتبة العميل حاليا تشفير النقط الكاملة فقط. بالنسبة للتنزيلات، يتم دعم كل من التنزيلات الكاملة وتنزيلات النطاق.

أثناء التشفير، ستقوم مكتبة العميل بإنشاء متجه تهيئة عشوائي (IV) من 16 بايت، جنبا إلى جنب مع مفتاح تشفير محتوى عشوائي (CEK) من 32 بايت، وتنفيذ تشفير المغلف لبيانات blob باستخدام هذه المعلومات. ثم يتم تخزين CEK الملفوفة وبعض البيانات الوصفية الإضافية للتشفير كبيانات وصفية blob جنبا إلى جنب مع blob المشفرة على الخدمة.

تحذير

إذا كنت تقوم بتحرير أو تحميل البيانات الوصفية الخاصة بك للنقطة ، فأنت بحاجة إلى التأكد من الحفاظ على هذه البيانات الوصفية. إذا قمت بتحميل بيانات وصفية جديدة بدون هذه البيانات الوصفية ، فقد CEK و IV والبيانات الوصفية الأخرى ولن يكون محتوى blob قابلا للاسترداد مرة أخرى.

عند تنزيل نقطة كاملة ، يتم فك تغليف CEK الملفوف واستخدامه مع IV (المخزن كبيانات وصفية للنقطة في هذه الحالة) لإعادة البيانات التي تم فك تشفيرها إلى المستخدمين.

يتضمن تنزيل نطاق تعسفي في النقطة المشفرة ضبط النطاق الذي يوفره المستخدمون من أجل الحصول على كمية صغيرة من البيانات الإضافية التي يمكن استخدامها لفك تشفير النطاق المطلوب بنجاح.

يمكن تشفير/فك تشفير جميع أنواع الفقاعات (نقاط الكتل ونقاط الصفحات والنقط الملحقة) باستخدام هذا المخطط.

قوائم الانتظار

نظرا لأن رسائل قائمة الانتظار يمكن أن تكون من أي تنسيق، تحدد مكتبة العميل تنسيقا مخصصا يتضمن متجه التهيئة (IV) ومفتاح تشفير المحتوى المشفر (CEK) في نص الرسالة.

أثناء التشفير ، تقوم مكتبة العميل بإنشاء IV عشوائي من 16 بايت إلى جانب CEK عشوائي من 32 بايت وتقوم بتشفير المغلف لنص رسالة قائمة الانتظار باستخدام هذه المعلومات. ثم تتم إضافة CEK الملفوفة وبعض بيانات تعريف التشفير الإضافية إلى رسالة قائمة الانتظار المشفرة. يتم تخزين هذه الرسالة المعدلة (الموضحة أدناه) على الخدمة.

<MessageText>{"EncryptedMessageContents":"6kOu8Rq1C3+M1QO4alKLmWthWXSmHV3mEfxBAgP9QGTU++MKn2uPq3t2UjF1DO6w","EncryptionData":{…}}</MessageText>

أثناء فك التشفير، يتم استخراج المفتاح الملفوف من رسالة قائمة الانتظار وإلغاء تغليفه. يتم أيضا استخراج IV من رسالة قائمة الانتظار واستخدامه مع المفتاح غير المغلف لفك تشفير بيانات رسالة قائمة الانتظار. لاحظ أن بيانات تعريف التشفير صغيرة (أقل من 500 بايت)، لذلك في حين أنها تحتسب ضمن حد 64 كيلوبايت لرسالة قائمة انتظار، يجب أن يكون التأثير قابلا للإدارة. لاحظ أن الرسالة المشفرة ستكون مشفرة base64 ، كما هو موضح في المقتطف أعلاه ، مما سيؤدي أيضا إلى زيادة حجم الرسالة التي يتم إرسالها.

الجداول

ملاحظة

يتم دعم خدمة الجدول في مكتبة عميل تخزين Azure من خلال الإصدار 9.x فقط.

تدعم مكتبة العميل تشفير خصائص الكيان لعمليات الإدراج والاستبدال.

ملاحظة

الدمج غير مدعوم حاليا. نظرا لأن مجموعة فرعية من الخصائص قد تكون مشفرة مسبقا باستخدام مفتاح مختلف ، فإن دمج الخصائص الجديدة وتحديث البيانات الوصفية سيؤدي ببساطة إلى فقدان البيانات. يتطلب الدمج إما إجراء مكالمات خدمة إضافية لقراءة الكيان الموجود مسبقا من الخدمة ، أو استخدام مفتاح جديد لكل موقع ، وكلاهما غير مناسب لأسباب تتعلق بالأداء.

يعمل تشفير بيانات الجدول كما يلي:

  1. يحدد المستخدمون الخصائص المراد تشفيرها.
  2. تقوم مكتبة العميل بإنشاء متجه تهيئة عشوائي (IV) من 16 بايت جنبا إلى جنب مع مفتاح تشفير محتوى عشوائي (CEK) من 32 بايت لكل كيان ، ويقوم بإجراء تشفير المغلف على الخصائص الفردية المراد تشفيرها عن طريق اشتقاق IV جديد لكل خاصية. يتم تخزين الخاصية المشفرة كبيانات ثنائية.
  3. ثم يتم تخزين CEK الملفوفة وبعض البيانات الوصفية الإضافية للتشفير كخاصيتين إضافيتين محجوزتين. الخاصية الأولى المحجوزة (_ClientEncryptionMetadata1) هي خاصية سلسلة تحتوي على معلومات حول IV والإصدار والمفتاح الملفوف. الخاصية الثانية المحجوزة (_ClientEncryptionMetadata2) هي خاصية ثنائية تحتوي على معلومات حول الخصائص المشفرة. المعلومات الموجودة في هذه الخاصية الثانية (_ClientEncryptionMetadata2) مشفرة في حد ذاتها.
  4. نظرا لهذه الخصائص الإضافية المحجوزة المطلوبة للتشفير ، قد يكون لدى المستخدمين الآن 250 خاصية مخصصة فقط بدلا من 252. يجب أن يكون الحجم الإجمالي للكيان أقل من 1 ميغابايت.

لاحظ أنه يمكن تشفير خصائص السلسلة فقط. إذا كان سيتم تشفير أنواع أخرى من الخصائص، فيجب تحويلها إلى سلاسل. يتم تخزين السلاسل المشفرة على الخدمة كخصائص ثنائية، ويتم تحويلها مرة أخرى إلى سلاسل بعد فك التشفير.

بالنسبة للجداول، بالإضافة إلى سياسة التشفير، يجب على المستخدمين تحديد الخصائص المراد تشفيرها. يمكن القيام بذلك إما عن طريق تحديد سمة [EncryptProperty] (لكيانات POCO المشتقة من TableEntity) أو محلل تشفير في خيارات الطلب. محلل التشفير هو مفوض يأخذ مفتاح قسم ومفتاح صف واسم خاصية ويقوم بإرجاع منطقي يشير إلى ما إذا كان يجب تشفير هذه الخاصية أم لا. أثناء التشفير، ستستخدم مكتبة العميل هذه المعلومات لتحديد ما إذا كان يجب تشفير الخاصية أثناء الكتابة إلى السلك. يوفر المفوض أيضا إمكانية المنطق حول كيفية تشفير الخصائص. (على سبيل المثال، إذا كان X، فقم بتشفير الخاصية A؛ وإلا قم بتشفير الخاصيتين A وB.) لاحظ أنه ليس من الضروري تقديم هذه المعلومات أثناء قراءة الكيانات أو الاستعلام عنها.

عمليات الدفعات

في العمليات الدفعية، سيتم استخدام KEK نفسه عبر جميع الصفوف في عملية الدفعات هذه لأن مكتبة العميل تسمح فقط بكائن خيار واحد (وبالتالي نهج واحد/KEK) لكل عملية دفعية. ومع ذلك، ستقوم مكتبة العميل داخليا بإنشاء IV عشوائي جديد وCEK عشوائي لكل صف في الدفعة. يمكن للمستخدمين أيضا اختيار تشفير خصائص مختلفة لكل عملية في الدفعة عن طريق تعريف هذا السلوك في محلل التشفير.

استعلامات

ملاحظة

نظرا لأن الكيانات مشفرة، لا يمكنك تشغيل الاستعلامات التي تتم تصفيتها على خاصية مشفرة. إذا حاولت ، فستكون النتائج غير صحيحة ، لأن الخدمة ستحاول مقارنة البيانات المشفرة بالبيانات غير المشفرة.

لتنفيذ عمليات الاستعلام، يجب تحديد محلل مفاتيح قادر على حل كافة المفاتيح في مجموعة النتائج. إذا تعذر حل كيان موجود في نتيجة الاستعلام إلى موفر، فستلقي مكتبة العميل خطأ. بالنسبة لأي استعلام يقوم بتنفيذ إسقاطات من جانب الخادم، ستضيف مكتبة العميل خصائص بيانات تعريف التشفير الخاصة (_ClientEncryptionMetadata1 و _ClientEncryptionMetadata2) بشكل افتراضي إلى الأعمدة المحددة.

Azure Key Vault

يساعد Azure Key Vault على حماية مفاتيح التشفير والأسرار التي تستخدمها التطبيقات والخدمات السحابية. باستخدام Azure Key Vault، يمكن للمستخدمين تشفير المفاتيح والأسرار (مثل مفاتيح المصادقة ومفاتيح حساب التخزين ومفاتيح تشفير البيانات و. ملفات PFX وكلمات المرور) باستخدام المفاتيح المحمية بواسطة وحدات أمان الأجهزة (HSMs). لمزيد من المعلومات، راجع ما هو Azure Key Vault؟.

تستخدم مكتبة عميل التخزين واجهات Key Vault في المكتبة الأساسية لتوفير إطار عمل مشترك عبر Azure لإدارة المفاتيح. يمكن للمستخدمين الاستفادة من مكتبات Key Vault لجميع المزايا الإضافية التي يقدمونها، مثل الوظائف المفيدة حول موفري المفاتيح المحلية والسحابية المتماثلة / RSA البسيطة والسلسة، بالإضافة إلى المساعدة في التجميع والتخزين المؤقت.

الواجهة والتبعيات

هناك حزمتان ضروريتان للتكامل Key Vault:

  • يحتوي Azure.Core على الواجهات IKeyEncryptionKey والواجهات IKeyEncryptionKeyResolver . مكتبة عميل التخزين ل .NET تعريفها بالفعل على أنها تبعية.
  • يحتوي Azure.Security.KeyVault.Keys (v4.x) على عميل REST Key Vault، بالإضافة إلى عملاء التشفير المستخدمين مع التشفير من جانب العميل.

تم تصميم Key Vault للمفاتيح الرئيسية عالية القيمة ، وتم تصميم حدود الاختناق لكل Key Vault مع وضع ذلك في الاعتبار. اعتبارا من Azure.Security.KeyVault.Keys 4.1.0، لا IKeyEncryptionKeyResolver يوجد تطبيق يدعم التخزين المؤقت للمفاتيح. إذا كان التخزين المؤقت ضروريا بسبب الاختناق ، فيمكن اتباع هذه العينة لحقن طبقة تخزين مؤقت في مثيل Azure.Security.KeyVault.Keys.Cryptography.KeyResolver .

أفضل الممارسات

يتوفر دعم التشفير فقط في مكتبة عميل التخزين ل .NET. لا تدعم Windows Phone وقت تشغيل Windows حاليا التشفير.

هام

كن على دراية بهذه النقاط المهمة عند استخدام التشفير من جانب العميل:

  • عند القراءة من أو الكتابة إلى نقطة مشفرة، استخدم أوامر تحميل blob بأكملها وأوامر تنزيل النطاق / blob بالكامل. تجنب الكتابة إلى نقطة مشفرة باستخدام عمليات البروتوكول مثل وضع كتلة أو وضع قائمة حظر أو كتابة صفحات أو مسح صفحات أو إلحاق كتلة ؛ وإلا فقد تفسد النقطة المشفرة وتجعلها غير قابلة للقراءة.
  • بالنسبة للجداول ، يوجد قيد مماثل. احرص على عدم تحديث الخصائص المشفرة دون تحديث بيانات تعريف التشفير.
  • إذا قمت بتعيين بيانات التعريف على النقطة المشفرة، فيمكنك الكتابة فوق البيانات الوصفية المتعلقة بالتشفير المطلوبة لفك التشفير، نظرا لأن إعداد البيانات الوصفية ليس مضافا. وينطبق هذا أيضا على اللقطات. تجنب تحديد البيانات الوصفية أثناء إنشاء لقطة لنقطة مشفرة. إذا كان يجب تعيين بيانات التعريف، فتأكد من استدعاء طريقة FetchAttributes أولا للحصول على بيانات تعريف التشفير الحالية، وتجنب عمليات الكتابة المتزامنة أثناء تعيين بيانات التعريف.
  • قم بتمكين الخاصية RequireEncryption في خيارات الطلب الافتراضية للمستخدمين التي يجب أن تعمل فقط مع البيانات المشفرة. انظر أدناه لمزيد من المعلومات.

واجهة برمجة تطبيقات العميل / الواجهة

يمكن للمستخدمين توفير مفتاح فقط أو محلل فقط أو كليهما. يتم تحديد المفاتيح باستخدام معرف مفتاح ويوفر المنطق للالتفاف / إلغاء التغليف. تستخدم أجهزة الحل لحل مفتاح أثناء عملية فك التشفير. يحدد طريقة حل تقوم بإرجاع مفتاح معين لمعرف مفتاح. يوفر هذا للمستخدمين القدرة على الاختيار بين مفاتيح متعددة تتم إدارتها في مواقع متعددة.

  • بالنسبة للتشفير ، يتم استخدام المفتاح دائما وسيؤدي عدم وجود مفتاح إلى حدوث خطأ.
  • لفك التشفير:
    • إذا تم تحديد المفتاح وتطابق معرفه مع معرف المفتاح المطلوب، استخدام هذا المفتاح لفك التشفير. خلاف ذلك ، تتم محاولة الحلل. إذا لم يكن هناك محلل لهذه المحاولة، يتم طرح خطأ.
    • يتم استدعاء محلل المفاتيح إذا تم تحديده للحصول على المفتاح. إذا تم تحديد المحلل ولكن ليس لديه تعيين لمعرف المفتاح، يتم طرح خطأ.

يتطلب وضع التشفير (الإصدار 11 فقط)

يمكن للمستخدمين اختياريا تمكين وضع التشغيل حيث يجب تشفير جميع التحميلات والتنزيلات. في هذا الوضع، ستفشل محاولات تحميل البيانات بدون سياسة تشفير أو تنزيل بيانات غير مشفرة على الخدمة على العميل. تتحكم الخاصية RequireEncryption لكائن خيارات الطلب في هذا السلوك. إذا كان تطبيقك سيقوم بتشفير كافة الكائنات المخزنة في Azure Storage، فيمكنك تعيين الخاصية RequireEncryption على خيارات الطلب الافتراضية لكائن عميل الخدمة. على سبيل المثال، قم بتعيين CloudBlobClient.DefaultRequestOptions.RequireEncryption إلى true لطلب التشفير لكافة عمليات blob التي يتم تنفيذها من خلال كائن العميل هذا.

تشفير خدمة Blob

إنشاء كائن ClientSideEncryptionOptions وتعيينه على إنشاء العميل مع SpecializedBlobClientOptions. لا يمكنك تعيين خيارات التشفير على أساس كل واجهة برمجة تطبيقات. سيتم التعامل مع كل شيء آخر من قبل مكتبة العميل داخليا.

// Your key and key resolver instances, either through KeyVault SDK or an external implementation
IKeyEncryptionKey key;
IKeyEncryptionKeyResolver keyResolver;

// Create the encryption options to be used for upload and download.
ClientSideEncryptionOptions encryptionOptions = new ClientSideEncryptionOptions(ClientSideEncryptionVersion.V1_0)
{
   KeyEncryptionKey = key,
   KeyResolver = keyResolver,
   // string the storage client will use when calling IKeyEncryptionKey.WrapKey()
   KeyWrapAlgorithm = "some algorithm name"
};

// Set the encryption options on the client options
BlobClientOptions options = new SpecializedBlobClientOptions() { ClientSideEncryption = encryptionOptions };

// Get your blob client with client-side encryption enabled.
// Client-side encryption options are passed from service to container clients, and container to blob clients.
// Attempting to construct a BlockBlobClient, PageBlobClient, or AppendBlobClient from a BlobContainerClient
// with client-side encryption options present will throw, as this functionality is only supported with BlobClient.
BlobClient blob = new BlobServiceClient(connectionString, options).GetBlobContainerClient("my-container").GetBlobClient("myBlob");

// Upload the encrypted contents to the blob.
blob.Upload(stream);

// Download and decrypt the encrypted contents from the blob.
MemoryStream outputStream = new MemoryStream();
blob.DownloadTo(outputStream);

لا يلزم استخدام BlobServiceClient لتطبيق خيارات التشفير. ويمكن أيضا أن يتم تمريرها إلى منشئات BlobContainerClientBlobClient/ التي تقبل كائنات BlobClientOptions.

إذا كان كائن BlobClient المطلوب موجودا بالفعل ولكن بدون خيارات تشفير من جانب العميل، توجد طريقة امتداد لإنشاء نسخة من هذا الكائن باستخدام خيارات ClientSideEncryptionOptions المحددة. طريقة التمديد هذه تتجنب النفقات العامة لإنشاء كائن BlobClient جديد من الصفر.

using Azure.Storage.Blobs.Specialized;

// Your existing BlobClient instance and encryption options
BlobClient plaintextBlob;
ClientSideEncryptionOptions encryptionOptions;

// Get a copy of plaintextBlob that uses client-side encryption
BlobClient clientSideEncryptionBlob = plaintextBlob.WithClientSideEncryptionOptions(encryptionOptions);

تشفير خدمة قائمة الانتظار

إنشاء كائن ClientSideEncryptionOptions وتعيينه على إنشاء العميل مع SpecializedQueueClientOptions. لا يمكنك تعيين خيارات التشفير على أساس كل واجهة برمجة تطبيقات. سيتم التعامل مع كل شيء آخر من قبل مكتبة العميل داخليا.

// Your key and key resolver instances, either through KeyVault SDK or an external implementation
IKeyEncryptionKey key;
IKeyEncryptionKeyResolver keyResolver;

// Create the encryption options to be used for upload and download.
ClientSideEncryptionOptions encryptionOptions = new ClientSideEncryptionOptions(ClientSideEncryptionVersion.V1_0)
{
   KeyEncryptionKey = key,
   KeyResolver = keyResolver,
   // string the storage client will use when calling IKeyEncryptionKey.WrapKey()
   KeyWrapAlgorithm = "some algorithm name"
};

// Set the encryption options on the client options
QueueClientOptions options = new SpecializedQueueClientOptions() { ClientSideEncryption = encryptionOptions };

// Get your queue client with client-side encryption enabled.
// Client-side encryption options are passed from service to queue clients.
QueueClient queue = new QueueServiceClient(connectionString, options).GetQueueClient("myQueue");

// Send an encrypted queue message.
queue.SendMessage("Hello, World!");

// Download queue messages, decrypting ones that are detected to be encrypted
QueueMessage[] queue.ReceiveMessages(); 

QueueServiceClient ليس ضروريا لتطبيق خيارات التشفير. ويمكن أيضا أن يتم تمريرها إلى منشئات QueueClient التي تقبل كائنات QueueClientOptions.

إذا كان كائن QueueClient المطلوب موجودا بالفعل ولكن بدون خيارات تشفير من جانب العميل، توجد طريقة امتداد لإنشاء نسخة من هذا الكائن باستخدام خيارات ClientSideEncryptionOptions المحددة. طريقة التمديد هذه تتجنب النفقات العامة لإنشاء كائن QueueClient جديد من الصفر.

using Azure.Storage.Queues.Specialized;

// Your existing QueueClient instance and encryption options
QueueClient plaintextQueue;
ClientSideEncryptionOptions encryptionOptions;

// Get a copy of plaintextQueue that uses client-side encryption
QueueClient clientSideEncryptionQueue = plaintextQueue.WithClientSideEncryptionOptions(encryptionOptions);

قد يكون لدى بعض المستخدمين قوائم انتظار حيث لا يمكن فك تشفير جميع الرسائل المستلمة بنجاح ويجب إلقاء المفتاح أو المحلل. سيتم طرح السطر الأخير من المثال أعلاه في هذه الحالة ، ولن يمكن الوصول إلى أي من الرسائل المستلمة. في هذه السيناريوهات، يمكن استخدام الفئة الفرعية QueueClientSideEncryptionOptions لتوفير خيارات التشفير للعملاء. يعرض حدثا DecryptionFailed الذي سيتم تشغيله كلما فشلت رسالة قائمة انتظار في فك تشفيرها ، طالما تمت إضافة استدعاء واحد على الأقل إلى الحدث. يمكن التعامل مع الرسائل الفاشلة بشكل فردي بهذه الطريقة، وسيتم تصفيتها من QueueMessage النهائي [] الذي يتم إرجاعه بواسطة ReceiveMessages.

// Create your encryption options using the sub-class.
QueueClientSideEncryptionOptions encryptionOptions = new QueueClientSideEncryptionOptions(ClientSideEncryptionVersion.V1_0)
{
   KeyEncryptionKey = key,
   KeyResolver = keyResolver,
   // string the storage client will use when calling IKeyEncryptionKey.WrapKey()
   KeyWrapAlgorithm = "some algorithm name"
};

// Add a handler to the DecryptionFailed event.
encryptionOptions.DecryptionFailed += (source, args) => {
   QueueMessage failedMessage = (QueueMessage)source;
   Exception exceptionThrown = args.Exception;
   // do something
};

// Use these options with your client objects.
QueueClient queue = new QueueClient(connectionString, queueName, new SpecializedQueueClientOptions()
{
   ClientSideEncryption = encryptionOptions
});

// Retrieve 5 messages from the queue.
// Assume 5 messages come back and one throws during decryption.
QueueMessage[] messages = queue.ReceiveMessages(maxMessages: 5).Value;
Debug.Assert(messages.Length == 4)

تشفير خدمة الجدول (الإصدار 11 فقط)

بالإضافة إلى إنشاء نهج تشفير وتعيينه على خيارات الطلب، يجب عليك إما تحديد محلل تشفير في TableRequestOptions، أو تعيين السمة [EncryptProperty] على الكيان.

استخدام المحلل

// Create the IKey used for encryption.
 RsaKey key = new RsaKey("private:key1" /* key identifier */);

 // Create the encryption policy to be used for upload and download.
 TableEncryptionPolicy policy = new TableEncryptionPolicy(key, null);

 TableRequestOptions options = new TableRequestOptions()
 {
    EncryptionResolver = (pk, rk, propName) =>
     {
        if (propName == "foo")
         {
            return true;
         }
         return false;
     },
     EncryptionPolicy = policy
 };

 // Insert Entity
 currentTable.Execute(TableOperation.Insert(ent), options, null);

 // Retrieve Entity
 // No need to specify an encryption resolver for retrieve
 TableRequestOptions retrieveOptions = new TableRequestOptions()
 {
    EncryptionPolicy = policy
 };

 TableOperation operation = TableOperation.Retrieve(ent.PartitionKey, ent.RowKey);
 TableResult result = currentTable.Execute(operation, retrieveOptions, null);

استخدام السمات

كما ذكر أعلاه ، إذا قام الكيان بتنفيذ TableEntity ، فيمكن تزيين الخصائص بالسمة [EncryptProperty] بدلا من تحديد EncryptionResolver.

[EncryptProperty]
 public string EncryptedProperty1 { get; set; }

التشفير والأداء

لاحظ أن تشفير بيانات التخزين يؤدي إلى زيادة النفقات العامة للأداء. يجب إنشاء مفتاح المحتوى و IV ، ويجب تشفير المحتوى نفسه ، ويجب تنسيق البيانات الوصفية الإضافية وتحميلها. ستختلف هذه النفقات العامة اعتمادا على كمية البيانات التي يتم تشفيرها. نوصي العملاء دائما باختبار تطبيقاتهم للتأكد من أدائها أثناء التطوير.

الخطوات التالية