Apa itu Tink?

Tink adalah perpustakaan kriptografi {i>open source<i} yang ditulis oleh kriptografer dan insinyur keamanan di Google. API Tink yang aman dan sederhana mengurangi melalui desain yang berpusat pada pengguna, implementasi yang cermat dan peninjauan kode, dan pengujian yang ekstensif. Lihat bagian Sasaran di halaman ini untuk wawasan tentang tujuan mana yang dirancang untuk dipenuhi oleh Tink.

Tink membantu pengguna tanpa latar belakang kriptografi dengan aman mengimplementasikan tugas kriptografi. Di Google, Tink telah di-deploy di ratusan produk dan sistem operasi.

Mengapa saya harus menggunakan Tink?

Alasan paling penting untuk menggunakan Tink adalah:

  • Mudah digunakan

    Kriptografi sulit untuk benar. Dengan Tink, Anda dapat enkripsi atau menandatangani data dengan jaminan keamanan bawaan dengan hanya menggunakan beberapa baris kode. Tink juga dapat membantu Anda merotasi kunci atau mengamankan kunci menggunakan Sistem Pengelolaan Kunci eksternal (KMS).

  • Aman

    Tink menambahkan perlindungan keamanan pada library terkenal seperti BoringSSL dan Java Cryptography Architecture dan menunjukkannya langsung dalam antarmuka, sehingga auditor dan {i>tool<i} dapat menemukan celah dengan cepat. Tink juga memisahkan API yang berpotensi berbahaya, jadi Anda dapat memantaunya.

  • Kompatibel

    Teks tersandi Tink kompatibel dengan library kriptografi yang ada. Tink juga mendukung enkripsi atau penyimpanan kunci di Amazon KMS, Google Cloud KMS, Android Keystore, dan Keychain iOS.

Siapa yang menggunakan Tink?

Tink banyak digunakan oleh banyak perusahaan, termasuk Google, Square, dan Citadel, serta ratusan pelanggan Google Cloud dan partner Google Pay. Coba juga mendukung library Jetpack Security, yang mengamankan banyak aplikasi Android populer seperti Slack, Adidas, AirBnb, dan Nextdoor.

Sasaran Tink

Apa tujuan utama Tink dibandingkan dengan library kriptografi lainnya, dan mekanisme utama apa yang digunakan Tink untuk mencapai tujuan tersebut?

Singkatnya, Tink memiliki dua tujuan:

  1. Meningkatkan ketangkasan kriptografi: Pengguna harus dapat mengubah kunci dan algoritma dengan cara yang sederhana.
  2. Aktifkan peninjauan keamanan: Tink bertujuan mengizinkan pengguna menulis kode yang keamanan dapat ditinjau secara lokal, dengan menyediakan antarmuka yang memberikan jaminan keamanan.

Mekanisme utama yang digunakan Tink untuk mencapai tujuan ini adalah sebagai berikut:

  1. Tink menyediakan primitif dan antarmuka sebagai abstraksi penting. Ini abstraksi memungkinkan pengguna menulis kode yang tidak menentukan algoritma yang akan digunakan, tetapi justru menetapkan konsep keamanan yang diharapkan.
  2. Tink menggunakan gagasan “{i>keyset<i}”, yang merupakan seperangkat kunci yang yang terkait dengan primitif tertentu. Hal ini menyebabkan pengguna menulis kode yang bekerja dengan beberapa kunci.
  3. Di Tink, kunci tidak hanya ditentukan oleh materi kunci yang mendasarinya, tetapi juga algoritma kriptografi, serta semua parameternya. Hal ini berarti bahwa kunci Tink selalu memilih fungsi kriptografis yang unik dari semua fungsi yang ada, dan tidak memberikan ruang untuk penafsiran.

Bagian berikut menjelaskan konsep ini secara lebih mendetail.

Ketangkasan kriptografi

Pertimbangkan Software Engineering di Google, sebuah buku tentang pelajaran yang didapat di bidang rekayasa perangkat lunak, dengan sub judul "pelajaran yang dipelajari dari pemrograman dari waktu ke waktu". Di dalamnya, penulis masuk ke untuk menyiratkan implikasi dari fakta bahwa segala sesuatunya berubah. Ini juga memengaruhi sebagian besar desain Tink. Dalam kriptografi, penting untuk yang mempersiapkan diri untuk perubahan. Kunci akan bocor, dan algoritma akan rusak. Kemampuan untuk mengganti kunci dan algoritma sangat penting bagi banyak pengguna, dan bahwa mempersiapkannya adalah hal yang bijaksana.

Ulasan keamanan dan properti lokal

Tink mempromosikan penggunaan antarmuka, seperti antarmuka AEAD kami, yang memungkinkan pengguna untuk mengenkripsi data. Di antara jaminan keamanan lainnya, AEAD menjamin bahwa beberapa enkripsi dari {i>string<i} yang sama menghasilkan perbedaan teks tersandi.

Untuk melihat bagaimana layanan ini dapat digunakan, misalkan seorang insinyur ingin menyimpan beberapa di cookie pengguna. Modul tersebut mungkin menyediakan class seperti ini:

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

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

Meneruskan Aead akan mendapatkan properti berikut:

  1. Kode ini menyampaikan bahwa agar IdEncrypter dapat melakukan tugasnya, diperlukan skema enkripsi dengan properti keamanan yang disediakan Aead. Atau, DeterministicAead tidak akan cukup -- IdEncrypter mengharuskan dua enkripsi id yang sama berbeda. Di sisi lain, mengambil instance dari pengenkripsi AES GCM (satu instance tertentu dari Aead) akan ketat: cukup Aead apa pun bagi IdEncrypter untuk melakukan tugasnya, dan tidak harus dalam satu algoritma tertentu.
  2. Peninjauan keamanan dapat mempertimbangkan hal ini. Peninjau keamanan melakukan tidak perlu memeriksa semua seluruh repositori kode untuk di suatu tempat, seseorang membuat subclass Aead yang tidak aman untuk digunakan dengan IdEncrypter. Sebagai gantinya, Tink menyediakan properti keamanan yang Aead memiliki, dan peninjau dapat memeriksa apakah ini sudah cukup.

Khususnya, poin kedua memerlukan kehati-hatian. Pengguna sering kali meminta untuk menambahkan yang 'tidak cukup' Aead. Poin sebelumnya menggambarkan mengapa ini berbahaya: jika ada implementasi Aead yang tersedia, tidak memberikan jaminan keamanan yang diperlukan, IdEncrypter dapat menjadi tidak aman, dan insinyur yang melakukan tinjauan keamanan perlu memeriksa kode tambahan untuk memeriksa apakah objek telah dibuat instance-nya dengan benar.