التشفير من جانب العميل للكائنات الثنائية كبيرة الحجم
تدعم مكتبة عميل Azure Blob Storage لـ .NET تشفير البيانات داخل تطبيقات العميل قبل تحميلها إلى تخزين Azure، وفك تشفير البيانات أثناء تنزيلها إلى العميل. تدعم المكتبة أيضًا التكامل مع Azure Key Vault لإدارة مفاتيح حساب التخزين.
هام
يدعم Blob Storage كلا من التشفير من جانب الخدمة والعميل. بالنسبة لمعظم السيناريوهات، توصي Microsoft باستخدام ميزات التشفير من جانب الخدمة لسهولة الاستخدام في حماية بياناتك. لمعرفة المزيد حول التشفير من جانب الخدمة، راجع تشفير تخزين Azure للبيانات الثابتة.
للحصول على برنامج تعليمي خطوة بخطوة يقودك خلال عملية تشفير الكائنات الثنائية كبيرة الحجم باستخدام التشفير من جانب العميل وAzure Key Vault، راجع تشفير الكائنات الثنائية كبيرة الحجم وفك تشفيرها في تخزين Microsoft Azure باستخدام Azure Key Vault.
التشفير من جانب العميل
تستخدم مكتبة عميل Blob Storage AES لتشفير بيانات المستخدم. هناك إصداران من التشفير من جانب العميل متوفران في مكتبة العميل:
- يستخدم الإصدار 2 وضع Galois/Counter Mode (GCM) مع AES.
- يستخدم الإصدار 1 وضع تسلسل كتلة التشفير (CBC) مع AES.
تحذير
لم يعد استخدام الإصدار 1 من التشفير من جانب العميل مستحسنًا بسبب ثغرة أمنية في تنفيذ مكتبة العميل لوضع CBC. لمزيد من المعلومات حول هذه الثغرة الأمنية، راجع Azure Storage تحديث التشفير من جانب العميل في SDK لمعالجة الثغرة الأمنية. إذا كنت تستخدم حاليا الإصدار 1، نوصي بتحديث التطبيق الخاص بك لاستخدام الإصدار 2 وترحيل بياناتك. راجع القسم التالي، التخفيف من الثغرة الأمنية في تطبيقاتك، لمزيد من الإرشادات.
التخفيف من الثغرة الأمنية في تطبيقاتك
نظرا لثغرة أمنية تم اكتشافها في تنفيذ مكتبة عميل Blob Storage لوضع CBC، توصي Microsoft باتخاذ إجراء واحد أو أكثر من الإجراءات التالية على الفور:
ضع في اعتبارك استخدام ميزات التشفير من جانب الخدمة بدلاً من التشفير من جانب العميل. لمزيد من المعلومات حول ميزات التشفير من جانب الخدمة، راجع تشفير Azure Storage للبيانات غير النشطة.
إذا كنت بحاجة إلى استخدام التشفير من جانب العميل، فرحل تطبيقاتك من التشفير من جانب العميل للإصدار 1 إلى التشفير من جانب العميل للإصدار 2.
يلخص الجدول التالي الخطوات التي ستحتاج إلى اتخاذها إذا اخترت ترحيل تطبيقاتك إلى التشفير من جانب العميل الإصدار 2:
حالة التشفير من جانب العميل | الإجراءات المستحسنة |
---|---|
يستخدم التطبيق تشفيرًا من جانب العميل إصدارًا من مكتبة العميل يدعم فقط التشفير من جانب العميل للإصدار 1. | تحديث التطبيق الخاص بك لاستخدام إصدار من مكتبة العميل التي تدعم التشفير من جانب العميل للإصدار 2. راجع مصفوفة دعم SDK للتشفير من جانب العميل للحصول على قائمة بالإصدارات المدعومة. تعرَّف على المزيد.... تحديث التعليمات البرمجية لاستخدام التشفير من جانب العميل للإصدار 2. تعرَّف على المزيد.... قم بتنزيل أي بيانات مشفرة لفك تشفيرها، ثم أعد تشفيرها باستخدام التشفير من جانب العميل للإصدار 2. تعرَّف على المزيد.... |
يستخدم التطبيق تشفيرًا من جانب العميل إصدارًا من مكتبة العميل يدعم التشفير من جانب العميل للإصدار 2. | تحديث التعليمات البرمجية لاستخدام التشفير من جانب العميل للإصدار 2. تعرَّف على المزيد.... قم بتنزيل أي بيانات مشفرة لفك تشفيرها، ثم أعد تشفيرها باستخدام التشفير من جانب العميل للإصدار 2. تعرَّف على المزيد.... |
بالإضافة إلى ذلك، توصي Microsoft باتخاذ الخطوات التالية للمساعدة في تأمين بياناتك:
- تكوين حسابات التخزين الخاصة بك لاستخدام نقاط النهاية الخاصة لتأمين جميع نسبة استخدام الشبكة بين الشبكة الظاهرية (VNet) وحساب التخزين الخاص بك عبر ارتباط خاص. لمزيد من المعلومات، راجع استخدام نقاط النهاية الخاصة ل Azure Storage.
- التقييد المتعلق بالوصول إلى شبكة الاتصال بشبكات محددة فقط.
مصفوفة دعم SDK للتشفير من جانب العميل
يوضح الجدول التالي إصدارات مكتبات العميل ل .NET وJava وPython التي تدعم إصدارات التشفير من جانب العميل:
.NET | Java | Python | |
---|---|---|---|
التشفير من جانب العميل v2 وv1 | الإصدارات 12.13.0 والإصدارات الأحدث | الإصدارات 12.18.0 والإصدارات الأحدث | الإصدارات 12.13.0 والإصدارات الأحدث |
تشفير من جانب العميل الإصدار 1 فقط | الإصدارات 12.12.0 والإصدارات السابقة | الإصدارات 12.17.0 والإصدارات السابقة | الإصدارات 12.12.0 والإصدارات السابقة |
إذا كان تطبيقك يستخدم تشفيرًا من جانب العميل مع إصدار سابق من مكتبة عميل .NET أو Java أو Python، فيجب عليك أولاً ترقية التعليمات البرمجية إلى إصدار يدعم التشفير من جانب العميل v2. بعد ذلك، يجب فك تشفير بياناتك وإعادة تشفيرها باستخدام التشفير من جانب العميل v2. إذا لزم الأمر، يمكنك استخدام إصدار من مكتبة العميل يدعم التشفير من جانب العميل v2 بالإضافة إلى إصدار سابق من مكتبة العميل أثناء ترحيل التعليمات البرمجية الخاصة بك. للحصول على أمثلة التعليمات البرمجية، راجع مثال: تشفير وفك تشفير كائن ثنائي كبير الحجم باستخدام التشفير من جانب العميل v2.
كيف يعمل التشفير من جانب العميل
تستخدم مكتبات عملاء Azure Blob Storage تشفير المغلفات لتشفير بياناتك وفك تشفيرها من جانب العميل. يقوم تشفير المغلفات بتشفير مفتاح بمفتاح إضافي واحد أو أكثر.
تعتمد مكتبات عميل Blob Storage على Azure Key Vault لحماية المفاتيح المستخدمة للتشفير من جانب العميل. لمزيدٍ من المعلومات حول Azure Key Vault، راجع ما هو Azure Key Vault؟
التشفير وفك التشفير عبر تقنية المغلف
يعمل التشفير عبر تقنية المغلف على النحو التالي:
تُنشئ مكتبة عميل تخزين Azure مفتاح تشفير محتوى (CEK)، وهو مفتاح متماثل يُستخدم مرة واحدة.
تُشفر بيانات المستخدم باستخدام CEK.
ثم يتم التفاف CEK (مشفرة) باستخدام مفتاح تشفير المفتاح (KEK). يُحدد معرّف مفتاح KEK، ويمكن أن يكون زوج مفاتيح غير متماثل أو مفتاحًا متماثلًا. يمكنك إدارة KEK محليًا أو تخزينه في Key Vault Azure.
مكتبة عميل Azure Storage نفسها ليس لديها حق الوصول إلى KEK. تستدعي المكتبة خوارزمية تضمين المفاتيح التي يوفرها Key Vault. يمكن للمستخدمين اختيار استخدام موفرين مخصصين لتضمين/إلغاء تضمين المفتاح إذا رغبوا في ذلك.
ثم يتم تحميل البيانات المشفرة إلى Azure Blob Storage. يتم تخزين المفتاح المغلف مع بعض بيانات تعريف التشفير الإضافية كبيانات تعريف على كائن ثنائي كبير الحجم.
يعمل فك التشفير عبر تقنية المغلف على النحو التالي:
- تفترض مكتبة عميل Azure Storage أن المستخدم يدير KEK إما محليًا أو في Azure Key Vault. لا يحتاج المستخدم إلى معرفة المفتاح المحدد الذي تم استخدامه للتشفير. بدلاً من ذلك، يمكن إعداد محلل المفاتيح، الذي يحل معرفات المفاتيح المختلفة للمفاتيح، واستخدامه.
- تُنزل مكتبة العميل البيانات المشفرة إلى جانب أي مواد تشفير مُخزنة على Azure Storage.
- ثم يتم فك تشفير CEK الملتفة (فك تشفيرها) باستخدام KEK. لا تتمتع مكتبة العميل بإمكانية الوصول إلى KEK أثناء هذه العملية، ولكنها تستدعي فقط خوارزمية إلغاء التحويل البرمجي ل Azure Key Vault أو مخزن المفاتيح الآخر.
- تستخدم مكتبة العميل CEK لفك تشفير بيانات المستخدم المشفرة.
التشفير/فك التشفير عند تحميل/تنزيل كائن ثنائي كبير الحجم
تدعم مكتبة عميل Blob Storage تشفير الكائنات الثنائية كبيرة الحجم بأكملها فقط عند التحميل. بالنسبة للتنزيلات، يتم دعم كل من التنزيلات الكاملة وتنزيلات النطاق.
أثناء التشفير، تقوم مكتبة العميل بإنشاء متجه تهيئة عشوائي (IV) من 16 بايت وCEK عشوائي من 32 بايت، وتقوم بتشفير مغلف لبيانات كائن ثنائي كبير الحجم باستخدام هذه المعلومات. ثم يُخزن CEK المُضمن وبعض بيانات التعريف الإضافية للتشفير كبيانات تعريف لكائن ثنائي كبير الحجم بجانب كائن ثنائي كبير الحجم مُشفر.
عندما يقوم العميل بتنزيل كائن ثنائي كبير الحجم بالكامل، يتم فك تغليف CEK واستخدامه مع IV لإعادة البيانات التي تم فك تشفيرها إلى العميل.
يتضمن تنزيل نطاق عشوائي في كائن ثنائي كبير الحجم مُشفر ضبط النطاق الذي يوفره المستخدمون من أجل الحصول على كمية صغيرة من البيانات الإضافية التي يمكن استخدامها لفك تشفير النطاق المطلوب بنجاح.
يمكن تشفير / فك تشفير جميع أنواع الكائنات الثنائية كبيرة الحجم (الكائنات الثنائية كبيرة الحجم للكتلة والكائنات الثنائية كبيرة الحجم للإلحاق) باستخدام هذا المخطط.
تحذير
إذا كنت تقوم بتحرير أو تحميل البيانات الوصفية الخاصة بك لكائن ثنائي كبير الحجم، فيجب عليك التأكد من الاحتفاظ ببيانات تعريف التشفير. إذا قمت بتحميل بيانات تعريف جديدة بدون الاحتفاظ أيضًا ببيانات تعريف التشفير، فسيتم فقد CEK وIV وبيانات التعريف الأخرى المغلفة ولن تتمكن من استرداد محتويات كائن ثنائي كبير الحجم. استدعاء عملية Set Blob Metadata يحل دائمًا محل جميع بيانات تعريف كائن ثنائي كبير الحجم.
عند القراءة من أو الكتابة إلى كائن ثنائي كبير الحجم مشفر، استخدم أوامر تحميل كائن ثنائي كبير الحجم مشفر كامل، مثل Put Blob، وأوامر النطاق أو كاملة لتنزيل كائن ثنائي كبير الحجم مشفر، مثل Get Blob. تجنب الكتابة إلى كائن ثنائي كبير الحجم مشفر باستخدام عمليات البروتوكول مثل Put Block أو Put Block List أو Put Page أو Append Block. يمكن أن يؤدي استدعاء هذه العمليات على كائن ثنائي كبير الحجم مشفر إلى إتلافه وجعله غير قابل للقراءة.
مثال: تشفير وفك تشفير كائن ثنائي كبير الحجم باستخدام التشفير من جانب العميل v2
يوضح مثال التعليمات البرمجية في هذا القسم كيفية استخدام التشفير من جانب العميل v2 لتشفير وفك تشفير كائن ثنائي كبير الحجم.
هام
إذا كانت لديك بيانات تم تشفيرها مسبقا باستخدام التشفير من جانب العميل v1، فستحتاج إلى فك تشفير تلك البيانات وإعادة تشفيرها باستخدام التشفير من جانب العميل v2. راجع الإرشادات والعينة لمكتبة العميل أدناه.
لاستخدام التشفير من جانب العميل من التعليمات البرمجية .NET، راجع مكتبة عميل Blob Storage. تأكد من أنك تستخدم الإصدار 12.13.0 أو الإصدار الأحدث. إذا كنت بحاجة إلى الترحيل من الإصدار 11.x إلى الإصدار 12.13.0، فشاهد دليل الترحيل.
مطلوب حزمتان إضافيتان لتكامل Key Vault Azure للتشفير من جانب العميل:
حزمة Azure.Core توفر واجهات
IKeyEncryptionKey
وIKeyEncryptionKeyResolver
. تعرّف مكتبة العميل Blob Storage لـ .NET بالفعل هذا التجميع على أنه تبعية.توفر حزمة Azure.Security.KeyVault.Keys (الإصدار 4.x والإصدارات الأحدث) عميل REST Key Vault وعملاء التشفير المستخدمة مع التشفير من جانب العميل. ستحتاج إلى التأكد من الإشارة إلى هذه الحزمة في مشروعك إذا كنت تستخدم Azure Key Vault كمخزن مفاتيح.
تم تصميم Azure Key Vault للمفاتيح الرئيسية عالية القيمة، وتعكس حدود التقييد لكل خزنة مفاتيح هذا التصميم. اعتبارا من الإصدار 4.1.0 من Azure.Security.KeyVault.Keys، لا تدعم الواجهة
IKeyEncryptionKeyResolver
التخزين المؤقت للمفتاح. إذا كان التخزين المؤقت ضروريًا بسبب التقييد، فيمكنك استخدام الطريقة الموضحة في هذه العينة لحقن طبقة التخزين المؤقت في مثيلAzure.Security.KeyVault.Keys.Cryptography.KeyResolver
.
يمكن للمطورين توفير مفتاح أو محلل مفاتيح أو مفتاح ومحلل مفاتيح على حد سواء. يتم تعريف المفاتيح باستخدام كود تعريف المفتاح الذي يوفر منطق التفاف وفك تغليف CEK. يتم استخدام محلل المفاتيح لحل مفتاح أثناء عملية فك التشفير. يعرّف محلل المفاتيح طريقة حل تُرجع مفتاحًا معرّفًا للمفتاح. توفر وحدة الحل للمستخدمين القدرة على الاختيار بين مفاتيح متعددة تتم إدارتها في مواقع متعددة.
بالنسبة للتشفير، يُستخدم المفتاح دائمًا، وسيؤدي عدم وجود مفتاح إلى حدوث خطأ.
بالنسبة لفك التشفير، إذا تم تحديد المفتاح وتطابق معرّفه مع معرّف المفتاح المطلوب، فاستخدم هذا المفتاح لفك التشفير. وإلا، تحاول مكتبة العميل الاتصال بالمحلل. إذا لم يتم تحديد محلل، فإن مكتبة العميل تطرح خطأ. إذا تم تحديد محلل، فسيتم استدعاء المحلل الرئيسي للحصول على المفتاح. إذا تم تحديد المحلل، ولكن ليس لديه تعيين لمعرف المفتاح، فإن مكتبة العميل تطرح خطأ.
لاستخدام التشفير من جانب العميل، قم بإنشاء كائن ClientSideEncryptionOptions وقم بتعيينه عند إنشاء العميل باستخدام SpecializedBlobClientOptions. لا يمكنك تعيين خيارات التشفير على أساس كل واجهة برمجة تطبيقات. ستتعامل مكتبة العميل مع كل شيء آخر داخليًا.
// Your key and key resolver instances, either through Azure Key Vault 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.V2_0)
{
KeyEncryptionKey = key,
KeyResolver = keyResolver,
// String value that the client library will use when calling IKeyEncryptionKey.WrapKey()
KeyWrapAlgorithm = "some algorithm name"
};
// Set the encryption options on the client options.
BlobClientOptions options = new SpecializedBlobClientOptions() { ClientSideEncryption = encryptionOptions };
// Create blob client with client-side encryption enabled.
// Client-side encryption options are passed from service clients to container clients,
// and from container clients 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
(new Uri($"https://{accountName}.blob.core.windows.net"), new DefaultAzureCredential(), 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 أو BlobContainerClient أو BlobClient التي تقبل كائنات BlobClientOptions.
إذا كان كائن BlobClient موجودًا بالفعل في التعليمات البرمجية الخاصة بك ولكنه يفتقر إلى خيارات التشفير من جانب العميل، فإنه يمكنك استخدام طريقة ملحق لإنشاء نسخة من هذا الكائن باستخدام ClientSideEncryptionOptions المحدد. يتجنب أسلوب التوسيع هذا النفقات العامة لإنشاء كائن BlobClient جديد من الصفر.
using Azure.Storage.Blobs.Specialized;
// An existing BlobClient instance and encryption options.
BlobClient plaintextBlob;
ClientSideEncryptionOptions encryptionOptions;
// Get a copy of the blob that uses client-side encryption.
BlobClient clientSideEncryptionBlob = plaintextBlob.WithClientSideEncryptionOptions(encryptionOptions);
بعد تحديث التعليمات البرمجية لاستخدام التشفير من جانب العميل v2، تأكد من فك تشفير أي بيانات مشفرة موجودة وإعادة تشفيرها، كما هو موضح في إعادة تشفير البيانات المشفرة مسبقا باستخدام التشفير من جانب العميل v2.
إعادة تشفير البيانات المشفرة مسبقًا باستخدام التشفير من جانب العميل v2
يجب فك تشفير أي بيانات تم تشفيرها مسبقا باستخدام التشفير من جانب العميل v1 ثم إعادة تشفيرها باستخدام التشفير من جانب العميل v2 للتخفيف من الثغرة الأمنية. يتطلب فك التشفير تنزيل البيانات وإعادة التشفير يتطلب إعادة تحميلها إلى Blob Storage.
للحصول على نموذج مشروع يوضح كيفية ترحيل البيانات من التشفير من جانب العميل v1 إلى v2 وكيفية تشفير البيانات باستخدام التشفير من جانب العميل v2 في .NET، راجع مشروع نموذج ترحيل التشفير.
التشفير والأداء من جانب العميل
لاحظ أن تشفير بيانات التخزين ينتج عنه زيادة النفقات العامة للأداء. عند استخدام التشفير من جانب العميل في التطبيق الخاص بك، يجب على مكتبة العميل إنشاء CEK والرابع بشكل آمن، وتشفير المحتوى نفسه، والتواصل مع مخزن المفاتيح الذي اخترته لتغليف المفتاح، وتنسيق بيانات التعريف الإضافية وتحميلها. ستختلف هذه النفقات العامة اعتمادًا على كمية البيانات التي يتم تشفيرها. نوصي العملاء دائمًا باختبار تطبيقاتهم للتأكد من أدائها أثناء التطوير.
الخطوات التالية
الملاحظات
https://aka.ms/ContentUserFeedback.
قريبًا: خلال عام 2024، سنتخلص تدريجيًا من GitHub Issues بوصفها آلية إرسال ملاحظات للمحتوى ونستبدلها بنظام ملاحظات جديد. لمزيد من المعلومات، راجعإرسال الملاحظات وعرضها المتعلقة بـ