تینک چیست؟

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

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

چرا باید از Tink استفاده کنم؟

مهمترین دلایل استفاده از Tink عبارتند از:

  • استفاده از آن ساده است

    درست کردن رمزنگاری دشوار است. با Tink، می‌توانید داده‌ها را با ضمانت‌های امنیتی داخلی تنها با استفاده از چند خط کد رمزگذاری یا امضا کنید. Tink همچنین می‌تواند به شما در چرخاندن کلیدها یا کلیدهای ایمن با استفاده از سیستم‌های مدیریت کلید خارجی (KMS) کمک کند.

  • امن است

    Tink حفاظت های امنیتی را در بالای کتابخانه های معروف مانند BoringSSL و Java Cryptography Architecture اضافه می کند و آنها را مستقیماً در رابط ها نشان می دهد، بنابراین حسابرسان و ابزارها می توانند به سرعت شکاف ها را پیدا کنند. Tink همچنین API هایی را که به طور بالقوه خطرناک هستند جدا می کند، بنابراین می توانید آنها را نظارت کنید.

  • سازگار است

    متن‌های رمزی Tink با کتابخانه‌های رمزنگاری موجود سازگار هستند. Tink همچنین از رمزگذاری یا ذخیره کلیدها در Amazon KMS، Google Cloud KMS، Android Keystore و Keychain iOS پشتیبانی می‌کند.

چه کسی از Tink استفاده می کند؟

Tink به طور گسترده توسط بسیاری از شرکت ها از جمله Google، Square و Citadel و همچنین صدها مشتری Google Cloud و شرکای Google Pay استفاده می شود. Tink همچنین به کتابخانه Jetpack Security قدرت می‌دهد که بسیاری از برنامه‌های محبوب اندروید مانند Slack، Adidas، AirBnb و Nextdoor را ایمن می‌کند.

اهداف تینک

اهداف اصلی تینک در مقایسه با سایر کتابخانه های رمزنگاری چیست و مکانیسم های اصلی تینک برای رسیدن به این اهداف چیست؟

به طور خلاصه، تینک دو هدف دارد:

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

مکانیسم های اصلی که تینک برای دستیابی به این اهداف استفاده می کند به شرح زیر است:

  1. Tink ابتدا و رابط ها را به عنوان انتزاعات مهم ارائه می دهد. این انتزاعات به کاربران اجازه می‌دهد کدی بنویسند که الگوریتم دقیق مورد استفاده را مشخص نمی‌کند، اما در عوض مفهوم امنیتی مورد انتظار را مشخص می‌کند.
  2. تینک از مفهوم "کلید مجموعه" استفاده می کند، که مجموعه ای از کلیدها است که با یک ابتدایی خاص مرتبط هستند. این باعث می شود کاربران کدی بنویسند که با چندین کلید کار می کند.
  3. در Tink، کلیدها نه تنها توسط مواد کلید زیرین مشخص می شوند، بلکه الگوریتم رمزنگاری و همچنین تمام پارامترها نیز مشخص می شوند. این بدان معنی است که یک کلید Tink همیشه یک تابع رمزنگاری منحصر به فرد را از بین تمام توابع ممکن که می تواند وجود داشته باشد انتخاب می کند و جایی برای تفسیر باقی نمی گذارد.

بخش های بعدی این مفاهیم را با جزئیات بیشتری توضیح می دهند.

چابکی رمزنگاری

کتاب مهندسی نرم افزار در گوگل را در نظر بگیرید، کتابی درباره درس های آموخته شده در زمینه مهندسی نرم افزار، با عنوان فرعی «درس های آموخته شده از برنامه نویسی در طول زمان». در آن، نویسندگان تمام تلاش خود را می کنند تا پیامدهای این واقعیت را که همه چیز تغییر می کند، التماس کنند. این واقعیت همچنین بر طراحی Tink تأثیر گذاشت. در رمزنگاری، مهم است که فرد برای تغییر آماده شود. کلیدها نشت می کنند و الگوریتم ها خراب می شوند. قادر به تغییر کلیدها و الگوریتم ها برای بسیاری از کاربران بسیار مهم است و آماده بودن عاقلانه است.

بررسی های امنیتی و ویژگی های محلی

Tink استفاده از واسط‌ها را ترویج می‌کند، مانند رابط AEAD ما، که به کاربران اجازه می‌دهد داده‌ها را رمزگذاری کنند. در میان سایر ضمانت‌های امنیتی ، AEAD تضمین می‌کند که رمزگذاری‌های متعدد از یک رشته منجر به متن‌های رمزی متفاوتی می‌شود.

برای اینکه ببینید چگونه می‌توان از آن استفاده کرد، فرض کنید یک مهندس می‌خواهد یک شناسه حساس را در یک کوکی کاربر ذخیره کند. آنها ممکن است کلاسی مانند این را ارائه دهند:

class IdEncrypter {
  public static IdEncrypter createFromAead(Aead aead);

  public String encrypt(long id) throws GeneralSecurityException;
  public long decrypt(String encrypted) throws GeneralSecurityException;
};

با ارسال یک Aead ویژگی های زیر بدست می آید:

  1. این کد نشان می دهد که برای اینکه IdEncrypter کار خود را انجام دهد، به یک طرح رمزگذاری با ویژگی های امنیتی که Aead ارائه می دهد نیاز دارد. روش دیگر، یک DeterministicAead کافی نیست - IdEncrypter نیاز دارد که دو رمزگذاری از یک شناسه متفاوت باشند. از سوی دیگر، در نظر گرفتن یک نمونه از رمزگذار AES GCM (یک نمونه خاص از Aead ) به عنوان پارامتر بسیار سخت‌گیرانه است: هر Aead برای IdEncrypter کافی است تا کار خود را انجام دهد، و نیازی به یک الگوریتم خاص نیست.
  2. یک بررسی امنیتی می تواند این نکته را در نظر بگیرد. یک بازبین امنیتی نیازی به بررسی تمام مخزن کد ندارد تا بررسی کند که آیا در جایی، فردی زیر کلاس Aead ساخته است که برای استفاده با IdEncrypter امن نیست. در عوض، Tink ویژگی‌های امنیتی را فراهم می‌کند که همه اشیاء Aead دارند، و بازبین می‌تواند کافی بودن این موارد را بررسی کند.

به ویژه نکته دوم نیاز به دقت زیادی دارد. کاربران اغلب درخواست می‌کنند الگوریتم‌هایی را اضافه کنند که «کاملاً» Aead نیستند. نکته قبلی نشان می‌دهد که چرا این خطرناک است: اگر اجرای Aead در دسترس باشد که تضمین‌های امنیتی مورد نیاز را ارائه نمی‌کند، IdEncrypter می‌تواند ناامن شود و مهندس که بازبینی امنیتی را انجام می‌دهد باید کد اضافی را بررسی کند تا بررسی کند که آیا شیء نمونه‌سازی شده است یا خیر. به درستی