Что такое Тинк?

Tink — это криптографическая библиотека с открытым исходным кодом, написанная криптографами и инженерами по безопасности Google. Безопасные и простые API-интерфейсы Tink позволяют избежать распространенных ошибок благодаря ориентированному на пользователя проектированию, тщательной реализации и проверке кода, а также тщательному тестированию. См. раздел «Цели» на этой странице, чтобы получить более подробную информацию о том, для достижения каких целей был создан Tink.

Tink помогает пользователям, не имеющим опыта работы в области криптографии, безопасно реализовывать распространенные криптографические задачи. В Google Tink используется в сотнях продуктов и систем.

Почему мне следует использовать Тинк?

Наиболее важные причины использовать Tink:

  • Это просто использовать

    Криптографию трудно понять правильно. С помощью Tink вы можете зашифровать или подписать данные со встроенными гарантиями безопасности, используя всего несколько строк кода. Tink также может помочь вам сменить ключи или защитить ключи с помощью внешних систем управления ключами (KMS).

  • Это безопасно

    Tink добавляет средства защиты поверх известных библиотек, таких как BoringSSL и Java Cryptography Architecture, и показывает их прямо в интерфейсах, чтобы аудиторы и инструменты могли быстро найти пробелы. Tink также отделяет потенциально опасные API, чтобы вы могли отслеживать их.

  • Это совместимо

    Зашифрованные тексты Tink совместимы с существующими криптографическими библиотеками. Tink также поддерживает шифрование или хранение ключей в Amazon KMS, Google Cloud KMS, Android Keystore и iOS Keychain.

Кто использует Тинк?

Tink широко используется многими компаниями, включая Google, Square и Citadel, а также сотнями клиентов Google Cloud и партнерами Google Pay. Tink также поддерживает библиотеку Jetpack Security, которая защищает многие популярные приложения для Android, такие как Slack, Adidas, AirBnb и Nextdoor.

Тинк Голы

Каковы основные цели Tink по сравнению с другими криптографическими библиотеками и каковы основные механизмы, которые Tink использует для достижения этих целей?

Короче говоря, у Тинка две цели:

  1. Повышайте криптографическую гибкость : пользователи должны иметь возможность легко менять ключи и алгоритмы.
  2. Включение проверок безопасности : Tink стремится позволить пользователям писать код, безопасность которого можно проверять локально, предоставляя интерфейсы, которые дают четкие гарантии безопасности.

Основные механизмы, которые Тинк использует для достижения этих целей, следующие:

  1. Tink предоставляет примитивы и интерфейсы как важные абстракции. Эти абстракции позволяют пользователям писать код, который не определяет точный используемый алгоритм, а вместо этого определяет ожидаемое понятие безопасности.
  2. Tink использует понятие «набора ключей», который представляет собой набор ключей, связанных с определенным примитивом. Это приводит к тому, что пользователи пишут код, который работает с несколькими ключами.
  3. В Tink ключи определяются не только базовым материалом ключа, но и криптографическим алгоритмом, а также всеми параметрами. Это означает, что ключ Tink всегда выбирает уникальную криптографическую функцию из всех возможных функций, которые могут существовать, и не оставляет места для интерпретации.

В следующих разделах эти концепции объясняются более подробно.

Криптографическая гибкость

Возьмем, к примеру, книгу «Разработка программного обеспечения в Google» , посвященную урокам, полученным в области разработки программного обеспечения, с подзаголовком «Уроки, извлеченные из программирования с течением времени». В нем авторы прикладывают все усилия, чтобы понять последствия того факта, что все меняется. Этот факт также повлиял на большую часть дизайна Tink. В криптографии важно быть готовым к изменениям. Ключи утекут, а алгоритмы сломаются. Возможность переключать ключи и алгоритмы имеет решающее значение для многих пользователей, и к этому следует быть готовым.

Проверки безопасности и местные свойства

Tink продвигает использование интерфейсов, таких как наш интерфейс AEAD, который позволяет пользователям шифровать данные. Помимо других гарантий безопасности , AEAD гарантирует, что многократное шифрование одной и той же строки приводит к получению разных зашифрованных текстов.

Чтобы увидеть, как это можно использовать, предположим, что инженер хочет сохранить некий конфиденциальный идентификатор в файле cookie пользователя. Они могут предоставить такой класс:

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 может стать небезопасным, и инженеру, выполняющему проверку безопасности, необходимо изучить дополнительный код, чтобы убедиться, что объект создан. правильно.