近日, 谷歌在其安全博客中详细介绍了其开源的一款多语言, 跨平台加密开发库 Tink.
一直以来, 加密技术就是保护用户数据的有效手段, 但是加密技术涉及到了非常艰深的密码学知识, 开发者如果想要理解如何正确去实施密码学, 这个过程将会花费他们大量时间去研究目前积累了数十年的学术文献. 在当下高强度的开发工作下, 显而易见, 通常开发者都难有这样富足的时间. 这样就给产品的安全带来了致命威胁, 怎么办呢?
Google 为此开发了一款多语言, 跨平台的加密软件库, 用以帮助内部开发人员提供安全的加密代码. 谷歌介绍, 在内部, Tink 已经被用于保护许多产品的数据, 如 AdMob,Google Pay,Google Assistant,Firebase 与 Android Search App 等. Google 在两年前将 Tink 于 GitHub 上开源 https://github.com/google/tink , 此次借着其第一个支持云, Android 与 iOS 的 1.2.0 版本 https://github.com/google/tink/releases/tag/v1.2.0 发布, 谷歌为开发者介绍了它的特性, 意义与使用示例等内容.
谷歌描述, Tink 旨在提供安全, 易于正确使用且难以滥用的加密 API, 它建立在现有安全相关的库之上, 如 BoringSSL 和 Java Cryptography Architecture, 但谷歌专门的团队 Project Wycheproof 发现了这些库中的一些弱点, Tink 进行了跟进, 使之更加安全.
使用 Tink, 许多常见的加密操作, 如数据加密, 数字签名等只需几行代码就可以完成, 以下是使用 Java 中的 AEAD 接口加密和解密的 demo:
- 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. Generate the key material.
- KeysetHandle keysetHandle = KeysetHandle.generateNew(
- AeadKeyTemplates.AES256_EAX);
- // 2. Get the primitive.
- Aead aead = AeadFactory.getPrimitive(keysetHandle);
- // 3. Use the primitive.
- byte[] plaintext = ...;
- byte[] additionalData = ...;
- byte[] ciphertext = aead.encrypt(plaintext, additionalData);
Tink 希望消除尽可能多的潜在误用. 例如, 如果底层加密模式需要 nonce(密码学中只被使用一次的任意或非重复的随机数), 但重用 nonce 的话会产生安全问题, 那么这时 Tink 将不允许用户传递 nonce.
Tink 的功能很多, 大概有如下几个方面:
可以安全抵御选择密文攻击, 允许安全审计员和自动化工具快速发现那些与安全要求不匹配的代码.
隔离了用于潜在危险操作的 API, 例如从磁盘加载明文密钥.
为密钥管理提供支持, 包括密钥轮换和逐步淘汰已弃用的密码.
可以通过设计进行扩展: 可以轻松添加自定义加密方案或内部密钥管理系统, 以便与 Tink 的其它部分无缝协作. Tink 的任何部分都难以更换或移除, 所有组件都是可组合的, 并且可以以各种组合进行选择和组合. 例如, 如果只需要数字签名, 则可以排除对称密钥加密组件, 以最大限度地减少应用程序中的代码大小.
这个开发库为广大开发者带来了极大便利, 如果你还没体验过, 赶快去试试吧: https://github.com/google/tink
来源: http://news.51cto.com/art/201809/582740.htm