بث التشفير المصدق عليه مع البيانات المرتبطة (بث AEAD)
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
توفّر دالة AEAD الأساسية لبث الوسائط تشفيرًا مصادقًا لبث
البيانات. يكون مفيدًا عندما تكون البيانات المطلوب تشفيرها كبيرة جدًا ولا يمكن معالجتها في
خطوة واحدة. تشمل حالات الاستخدام الشائعة تشفير الملفات الكبيرة أو عمليات نقل بيانات
المباشرة.
يتم التشفير في أقسام مرتبطة بموقعها الجغرافي ضمن ملف التشفير ولا يمكن إزالتها أو إعادة ترتيبها. لا يمكن إدراج أجزاء من نص مشفَّر في نص مشفَّر آخر. لتعديل نص مشفَّر حالي،
يجب إعادة تشفير مصدر البيانات بالكامل.1
يكون فك التشفير سريعًا لأنّه يتم فك تشفير جزء من النص المشفَّر وتأكيد هويته في كل مرة. يمكن الحصول على نصوص عادية جزئية بدون معالجة
النص المشفَّر بالكامل.
Secrecy: لا يمكن معرفة أي معلومات عن النص العادي، باستثناء طوله.
Authenticity: من المستحيل تغيير النص العادي المشفَّر
الذي يشكّل النص المشفَّر بدون أن يتم رصد ذلك.
Symmetric: يتم تشفير النص العادي وفك تشفيره باستخدام المفتاح نفسه.
التوزيع العشوائي: يتم توزيع التشفير بشكل عشوائي. تؤدي رسالتان تتضمّنان
النص العادي نفسه إلى نصوص مشفّرة مختلفة. لا يمكن للمهاجمين معرفة ملف التشفير الذي يتوافق مع نص عادي معيّن.
البيانات المرتبطة
يمكن استخدام العنصر الأساسي لتشفير AEAD أثناء البث لربط النص المشفَّر ببيانات مرتبطة
معيّنة. لنفترض أنّ لديك قاعدة بيانات تحتوي على الحقلين user-id وencrypted-medical-history: في هذا السيناريو، يمكن استخدام user-id
كبيانات مرتبطة عند تشفير encrypted-medical-history. ويؤدي ذلك
إلى منع المهاجم من نقل السجلّ الطبي من مستخدم إلى آخر.
اختيار نوع المفتاح
ننصحك باستخدام AES128_GCM_HKDF_1MB لمعظم الاستخدامات. بشكل عام:
AES128_GCM_HKDF_1MB (أو AES256_GCM_HKDF_1MB) هو الخيار الأسرع. ويمكنه
تشفير ملفَين بحجم 264 بايت كحد أقصى لكل منهما. يتم استخدام 1 ميغابايت تقريبًا من
الذاكرة أثناء عملية التشفير وفك التشفير.
يستهلك AES128_GCM_HKDF_4KB ما يقرب من 4 كيلوبايت من الذاكرة، وهو خيار جيد إذا كان
نظامك لا يتضمّن الكثير من الذاكرة.
يُعدّ AES128_CTR_HMAC_SHA256_1MB (أو AES256_CTR_HMAC_SHA256_1MB) خيارًا
أكثر تحفظًا.
ضمانات الأمان
توفّر عمليات تنفيذ AEAD للبث ما يلي:
أمان CCA2
قوة مصادقة تبلغ 80 بت على الأقل
إمكانية تشفير 64 رسالة3 على الأقل بإجمالي
251 بايت2 لا يمكن لأي هجوم باستخدام ما يصل إلى 232
نصًا عاديًا أو نصًا مشفَّرًا تم اختيارهما أن يكون احتمال نجاحه أكبر
من
2-32.
ويعود سبب هذا التقييد إلى استخدام مُشفّر AES-GCM. إنّ تشفير جزء مختلف من النص العادي في الموضع نفسه يعادل إعادة استخدام مبدّل البدء، ما ينتهك ضمانات الأمان لـ AES-GCM. وهناك سبب آخر وهو أنّ ذلك يمنع هجمات "الرجوع إلى الإصدار السابق"، حيث قد يحاول المهاجم استعادة إصدار سابق من الملف بدون رصده. ↩
يمكن استخدام 32 مقطعًا، ويحتوي كل مقطع على segment_size - tag_size بايت من النص العادي. بالنسبة إلى الأجزاء التي تبلغ 1 ميغابايت، يبلغ إجمالي حجم النص العادي 232 * (220-16) ~= 251 بايت. ↩
يصبح بروتوكول AEAD للبث غير آمن عند تكرار تركيبة مفتاح مشتق (128 بت) وبادئة عدد عشوائي (قيمة عشوائية مستقلة تبلغ 7 بايت). لدينا مقاومة للتصادم بسعة 184 بت، ما يعادل تقريبًا رسالتَين64 إذا أردنا أن يكون احتمال النجاح أقل من 2-32. ↩
تاريخ التعديل الأخير: 2025-07-25 (حسب التوقيت العالمي المتفَّق عليه)
[null,null,["تاريخ التعديل الأخير: 2025-07-25 (حسب التوقيت العالمي المتفَّق عليه)"],[[["\u003cp\u003eStreaming AEAD encrypts large data streams or files securely in segments, ensuring authenticity and confidentiality.\u003c/p\u003e\n"],["\u003cp\u003eIt offers strong security guarantees, including CCA2 security, at least 80-bit authentication strength, and resistance to common attacks.\u003c/p\u003e\n"],["\u003cp\u003eAssociated data is authenticated but not encrypted, preventing unauthorized data manipulation but not revealing its content.\u003c/p\u003e\n"],["\u003cp\u003eTink recommends AES128_GCM_HKDF_1MB for most use cases due to its speed and large data capacity, with alternative options for memory-constrained environments.\u003c/p\u003e\n"],["\u003cp\u003eModifying existing ciphertext requires re-encryption of the entire stream, maintaining data integrity and preventing rollback attacks.\u003c/p\u003e\n"]]],["Streaming AEAD encrypts large data streams in segments, ensuring authenticity and secrecy, but only the plaintext is encrypted, associated data is not. Encryption segments are bound to their location and cannot be reordered or moved. Decryption allows partial ciphertext processing. The recommended key type is AES128_GCM_HKDF_1MB. Streaming AEAD offers CCA2 security, at least 80-bit authentication strength, and can encrypt at least 2^64 messages with a total of 2^51 bytes. Re-encrypting the whole stream is needed to modify the ciphertext.\n"],null,["# Streaming Authenticated Encryption with Associated Data (Streaming AEAD)\n\nThe Streaming AEAD primitive provides authenticated encryption for streaming\ndata. It is useful when the data to be encrypted is too large to be processed in\na single step. Typical use cases include encryption of large files or live data\nstreams.\n\nEncryption is done in segments, which are bound to their location within a\nciphertext and cannot be removed or reordered. Segments from one ciphertext\ncannot be inserted into another ciphertext. To modify an existing ciphertext,\nthe entire data stream must be re-encrypted.^[1](#fn1)^\n\nDecryption is fast because only a portion of the ciphertext is decrypted and\nauthenticated at a time. Partial plaintexts are obtainable without processing\nthe entire ciphertext.\n\nStreaming AEAD implementations fulfill the [AEAD\ndefinition](https://www.cs.ucdavis.edu/%7Erogaway/papers/ad.html) and are\n[nOAE-secure](https://eprint.iacr.org/2015/189.pdf). They have the following\nproperties:\n\n- **Secrecy**: Nothing about the plaintext is known, except its length.\n- **Authenticity**: It is impossible to change the encrypted plaintext underlying the ciphertext without being detected.\n- **Symmetric**: Encrypting the plaintext and decrypting the ciphertext is done with the same key.\n- **Randomization**: Encryption is randomized. Two messages with the same plaintext yield different ciphertexts. Attackers cannot know which ciphertext corresponds to a given plaintext.\n\n### Associated data\n\n| **Caution:** Associated data is authenticated but *NOT* encrypted.\n\nThe Streaming AEAD primitive can be used to [tie ciphertext to specific\nassociated data](/tink/bind-ciphertext). Suppose you have a database with the\nfields `user-id` and `encrypted-medical-history`: In this scenario, `user-id`\ncan be used as associated data when encrypting `encrypted-medical-history`. This\nprevents an attacker from moving medical history from one user to another.\n\n### Choose a key type\n\nWe recommend **AES128_GCM_HKDF_1MB** for most uses. Generally:\n\n- [AES-GCM-HKDF](/tink/streaming-aead/aes_gcm_hkdf_streaming)\n - AES128_GCM_HKDF_1MB (or AES256_GCM_HKDF_1MB) is the faster option. It can encrypt 2^64^ files with up to 2^64^ bytes each. \\~1 MB of memory is consumed during the encryption and decryption process.\n - AES128_GCM_HKDF_4KB consumes \\~4 KB of memory and is a good choice if your system doesn't have a lot of memory.\n- [AES-CTR HMAC](/tink/streaming-aead/aes_ctr_hmac_streaming)\n - AES128_CTR_HMAC_SHA256_1MB (or AES256_CTR_HMAC_SHA256_1MB) is a more conservative option.\n\n| **Note:** For 1 MB schemes, the plaintext may have any length within 0 to 2^51^ bytes.^[2](#fn2)^\n\n### Security guarantees\n\nStreaming AEAD implementations offer:\n\n- CCA2 security.\n- At least 80-bit authentication strength.\n- The ability to encrypt at least 2^64^ messages^[3](#fn3)^ with a total of 2^51^ bytes[^2^](#fn2) . No attack with up to 2^32^ chosen plaintexts or chosen ciphertexts has a probability of success larger than 2^-32^.\n\n| **Caution:** **Streaming AEAD offers no secrecy guarantees for associated data.**\n\n### Example use case\n\nSee [I want to encrypt large files or data\nstreams](/tink/encrypt-large-files-or-data-streams). \n\n*** ** * ** ***\n\n1. A reason for this restriction is the use of the AES-GCM cipher. Encrypting a different plaintext segment at the same location would be equivalent to reusing the IV, which violates the security guarantees of AES-GCM. Another reason is that this prevents roll-back attacks, where the attacker may try to restore a previous version of the file without detection. [↩](#fnref1)\n\n2. 2^32^ segments are supported, with each segment containing `segment_size - tag_size` bytes of plaintext. For 1 MB segments, the total plaintext size is 2^32^ \\* (2^20^-16) \\~= 2^51^ bytes. [↩](#fnref2)\n\n3. Streaming AEAD becomes insecure when a derived key (128-bit) and nonce prefix (independent random 7-byte value) combination is repeated. We have 184-bit collision resistance, which roughly translates to 2^64^ messages if we want success probability to be less than 2^-32^. [↩](#fnref3)"]]