مجموعه کلیدها

Tink از Keysets برای فعال کردن چرخش کلید استفاده می کند. به طور رسمی، مجموعه کلید یک لیست غیرخالی 1 از کلیدها است که در آن یک کلید اصلی تعیین می شود (کلیدی که به عنوان مثال برای امضا و رمزگذاری متن های ساده جدید استفاده می شود). علاوه بر این، کلیدهای یک مجموعه کلید دارای شناسه منحصربه‌فرد 2 و وضعیت کلید هستند که به شما امکان می‌دهد کلیدها را بدون حذف آنها از مجموعه کلید غیرفعال کنید.

مجموعه کلیدها راه اصلی دسترسی کاربران به کلیدها هستند (از طریق کلاس KeysetHandle ). این تضمین می کند که هر کاربر کدی برای مدیریت چندین کلید در یک زمان دارد. برای اکثر کاربران رمزنگاری، استفاده از کلیدهای متعدد یک ضرورت است: باید امکان تغییر کلیدها وجود داشته باشد (برای مثال، کلیدهای قدیمی ممکن است درز کنند)، و تقریباً هرگز یک "تغییر به کلید بعدی" اتمی وجود ندارد که بتوان آن را اعمال کرد. برای ماشین‌ها، کد اجرا می‌شود و همه متن‌های رمزی، در سطح جهانی و در یک لحظه. از این رو، کاربر باید کدی بنویسد که وقتی یکی از یک کلید به کلید دیگر تغییر می کند، کار می کند.

مثال: AEAD

یک مجموعه کلید AEAD را در نظر بگیرید که حاوی چندین کلید برای AEAD اولیه است. همانطور که قبلا توضیح داده شد، هر کلید به طور منحصر به فرد دو تابع را مشخص می کند: \(\mathrm{Enc}\) و \(\mathrm{Dec}\). اکنون مجموعه کلید دو عملکرد جدید را نیز مشخص می کند: \(\mathrm{Enc}\) و \(\mathrm{Dec}\) - \(\mathrm{Enc}\) به سادگی با تابع \(\mathrm{Enc}\) کلید اصلی مجموعه کلید برابر است، در حالی که تابع \(\mathrm{Dec}\) سعی می کند با همه کلیدها رمزگشایی کند. آنها را به ترتیبی ( در زیر ببینید که چگونه Tink عملکرد این را بهبود می بخشد).

جالب است بدانید که Keyset ها کلیدهای کامل هستند: آنها توضیح کاملی از توابع \(\mathrm{Enc}\) و\(\mathrm{Dec}\) مورد استفاده هستند. این بدان معناست که کاربران می‌توانند کلاسی بنویسند که یک KeysetHandle به‌عنوان ورودی می‌گیرد، و این ایده را بیان می‌کند که کلاس برای عملکرد صحیح به توصیف کاملی از اشیاء \(\mathrm{Enc}\) و \(\mathrm{Dec}\) نیاز دارد. این به کاربر امکان می‌دهد APIهایی بنویسد که این را به شما منتقل می‌کند: برای استفاده از این کلاس، باید شرح یک رمزنگاری اولیه را به من ارائه دهید.

چرخش کلید

یک کاربر Tink را در نظر بگیرید که برنامه ای می نویسد که ابتدا یک مجموعه کلید را از یک KMS دریافت می کند، سپس یک شی AEAD از این مجموعه کلید ایجاد می کند و در نهایت از این شی برای رمزگذاری و رمزگشایی متون رمز استفاده می کند.

چنین کاربری به طور خودکار برای چرخش کلید آماده می شود. و تغییر الگوریتم ها در صورتی که انتخاب فعلی آنها دیگر با استاندارد مطابقت نداشته باشد.

هر چند هنگام اجرای چنین چرخشی کلید باید تا حدودی مراقب بود: اول، KMS باید یک کلید جدید به مجموعه کلید اضافه کند (اما هنوز آن را به عنوان اصلی تنظیم نکرده است). سپس، مجموعه کلید جدید باید در همه باینری ها پخش شود، به طوری که هر باینری که از این مجموعه کلید استفاده می کند، جدیدترین کلید را در مجموعه کلید داشته باشد. تنها در این صورت باید کلید جدید اصلی شود و مجموعه کلیدهای حاصل دوباره با استفاده از مجموعه کلید در بین همه باینری ها توزیع می شود.

شناسه های کلیدی در متون رمزی

دوباره مثالی از مجموعه کلید AEAD را در نظر بگیرید. اگر ساده لوحانه انجام شود، رمزگشایی یک متن رمزی مستلزم آن است که Tink سعی کند با تمام کلیدهای Keyset رمزگشایی کند، زیرا هیچ راهی برای دانستن اینکه کدام کلید برای رمزگذاری مجموعه کلید استفاده شده است وجود ندارد. این می تواند باعث سربار عملکرد بزرگ شود.

به همین دلیل، Tink اجازه می دهد تا متن های رمزی را با یک رشته 5 بایتی مشتق شده از ID پیشوند قرار دهید. با پیروی از فلسفه "کلیدهای کامل" در بالا، این پیشوند بخشی از کلید است و تمام متن‌های رمزی که تاکنون با این کلید مشتق شده‌اند باید این پیشوند را داشته باشند. هنگامی که کاربران کلیدها را ایجاد می کنند، می توانند انتخاب کنند که آیا کلید باید از چنین پیشوندی استفاده کند یا از قالب متن رمزی بدون آن استفاده شود.

هنگامی که یک کلید در یک مجموعه کلید قرار دارد، Tink این تگ را از روی شناسه ای که کلید در مجموعه کلید دارد محاسبه می کند. این واقعیت که شناسه ها در یک مجموعه کلید منحصر به فرد هستند نشان می دهد که برچسب ها منحصر به فرد هستند. از این رو، اگر فقط از کلیدهای برچسب‌گذاری شده استفاده شود، در مقایسه با رمزگشایی با یک کلید، کاهش عملکردی وجود ندارد: تینک فقط باید یکی از کلیدها را هنگام رمزگشایی امتحان کند.

با این حال، از آنجایی که تگ بخشی از کلید است، این نیز نشان می‌دهد که کلید تنها در صورتی می‌تواند در یک مجموعه کلید باشد که یک شناسه خاص داشته باشد. این در هنگام توصیف اجرای اشیاء کلیدی در زبان‌های مختلف، پیامدهایی دارد.


  1. برخی از بخش‌های تینک هنوز Keysets را به عنوان یک مجموعه در نظر می‌گیرند. با این حال، این باید تغییر کند. دلیل آن این است که ترتیب به طور کلی مهم است: برای مثال، چرخه عمر معمول چرخش کلید با Aead را در نظر بگیرید. ابتدا یک کلید جدید به یک مجموعه کلید اضافه می شود. این کلید هنوز اولیه نیست، اما فعال است. این مجموعه کلید جدید برای همه باینری ها عرضه می شود. هنگامی که همه باینری ها کلید جدید را می دانند، کلید اصلی می شود (فقط در این مرحله استفاده از این کلید امن است). در این مرحله دوم، چرخش کلید باید آخرین کلید اضافه شده را بداند.

  2. برای سازگاری با کتابخانه داخلی Google، Tink اجازه می دهد تا مجموعه کلیدهایی داشته باشید که شناسه ها در آنها تکرار می شوند. این پشتیبانی در آینده حذف خواهد شد.