谷歌最近又发布了一个新的开源工具集 Tink。Tink 是一个多语言,跨平台的库,提供安全,易于正确使用和难以滥用的加密 API。我预测它可能会火起来,所以就先简单介绍一下它的用法。
Tink 遵循 Apache 的 2.0 开源协议。Tink 并不是官方支持的 Google 产品。而是由 Google 的一群密码学家和安全工程师编写的加密库。
Tink 结合了 Google 产品团队的丰富经验,修复了现实开发、部署、测试中的一些弱点,并提供了可以安全使用而无需加密背景的简单 API。
Tink 提供的安全 API 易于正确使用且难以滥用。它通过以用户为中心的设计,仔细的实施和代码审查以及广泛的测试来减少常见的加密陷阱。在谷歌,Tink 已被用于保护许多产品的数据,如 AdMob,Google Pay,Google Assistant,Firebase,Android Search App 等。
快速开始
在使用 Tink 之前推荐大家先安装 Bazel。然后执行下面的 Bazel 命令即可看到构建后的运行效果:
git clone https://github.com/google/tink cd tink bazel build ... echo foo > foo.txt ./bazel-bin/examples/helloworld/java/helloworld encrypt --keyset test.cfg --in foo.txt --out bar.encrypted ./bazel-bin/examples/helloworld/java/helloworld decrypt --keyset test.cfg --in bar.encrypted --out foo2.txt cat foo2.txt
Tink通过所谓的基元执行加密任务,每个基元通过指定基元功能的相应接口来定义。例如,对称密钥加密是通过AEAD原语(带有关联数据的Authenticated Encryption)提供的,它支持两种操作:
- encrypt(plaintext, associated_data),加密给定的plaintext (使用associated_data另外的AEAD输入)并返回生成的密文
- decrypt(ciphertext, associated_data),解密给定的 ciphertext(使用associated_data另外的AEAD输入)并返回结果明文
在可使用基元的实现之前,必须在运行时使用 Tink 注册它们,以便 Tink “知道”所需的实现。以下是如何在Tink中注册所有基元的所有实现:
import com.google.crypto.tink.config.TinkConfig; TinkConfig.register();
在注册了基元的实现之后,Tink的基本用法分三步进行:
- 加载或生成加密密钥材料(Keyset以Tink术语表示)。
- 使用密钥材料获取所选基元的实例。
- 使用该原语来完成加密任务。
以下是在 Java 中使用 Tink 加密或解密时的步骤:
import com.google.crypto.tink.Aead; import com.google.crypto.tink.KeysetHandle; import com.google.crypto.tink.aead.AeadFactory; import com.google.crypto.tink.aead.AeadKeyTemplates; // 1.生成密钥材料。 KeysetHandle keysetHandle = KeysetHandle.generateNew( AeadKeyTemplates.AES128_GCM); // 2.获取 Aead 原语 Aead aead = AeadFactory.getPrimitive(keysetHandle); // 3.使用原语。 byte[] ciphertext = aead.encrypt(plaintext, aad);
Tink 目前除了支持 java 外,还支持 Android、C++、Obj-C。目前最新版本是 2018-08-09 发布的 1.2.0。
参考资料
- https://github.com/google/tink
: » 谷歌 Tink(加密API) 教程
原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/251846.html