告別OpenSSL,谷歌推出其取代軟體Tink

告別OpenSSL,谷歌推出其取代軟件Tink

要說一個軟件對IT和互聯網業界影響力,恐怕OpenSS要算上一個。一個甚至主要版本還不到V1.2的軟件,佔據了整改互聯網底層安全核心。SSH、HTTPS,還有其他很多的基礎加密庫都是離不開OpenSSL的。

但是這麼一個非常重要的基礎軟件,缺在管理上和經費上屢屢爆出問題,以至於當2014年爆發心臟出血時候,整個業界,甚至整個互聯網,技術圈內的,非技術圈內的也都震動了。

告別OpenSSL,谷歌推出其取代軟件Tink

為了克服OpenSSL帶來的問題,OpenBSD Fork了一個新的軟件LibreSSL,以確保SSL的庫不會再出問題,基於OpenBSD的幾十年積累下來的安全口碑,蟲蟲認為這是一個非常好的替代。同時各大公司也推出自己的SSL安全庫,比如亞馬遜就推出了s2n。

本文介紹的則是,繼繼谷歌自己的BoringSSL和OpenBSD的LibreSSL之後,谷歌新發布的軟件Tink。他是一個多語言,跨平臺的安全加密庫。使用OpenSSL,系統有著複雜的綁定,並且通常專注於特定的系統,例如Windows中的DLL。 而Tink是開源的,專注於創建簡單的API,確保基礎架構更具可移植性。

AWS s2n

s2n(signal to noise),是對TLS/SSL協議的C99(c語言標準)實現,基於開發一個簡單,小巧,快速,並且優先考慮安全性的理念來設計。s2n使用Apache License 2.0發佈和許可。重點用於改進TLS(傳輸層安全性)和使用更輕量級的方法。s2n僅使用了6,000行代碼,定義了更專注,更精簡的庫。當然可能會隨著新版本的迭代而代碼增加,因為目前還只是一個基本的實現。

告別OpenSSL,谷歌推出其取代軟件Tink

s2n是完全開源的,託管在GitHub中(github:awslabs/s2n ),允許任何人review和fork代碼,你可以fork然後添加核心版本不支持的新功能。

亞馬遜對安全問題都很認真,能及時反應社區發現的漏洞。還開展了與研究人員和學者合作的機制來解決新的問題。

告別OpenSSL,谷歌推出其取代軟件Tink

認識Tink

Tink是谷歌基於BoringSSL發佈的SSL安全庫軟件,當前版本版本為1.2.0(已經超過了OpenSSL積累了幾十年的版本)。Tink已經在谷歌自己的應用中得到了大量應用。比如已經集成到AdMob,Google Pay,Google智能助理和Firebase中了。

Tink集成了AEAD方法(經過身份驗證的加密AE和經過身份驗證的加密以及相關數據)。集成了加密密鑰,散列函數和消息驗證代碼(MAC)。

Tink中AEAD的最低標準包括[RFC5116]:

明文和相關數據可以具有任何長度(從0到2³²字節)。

支持80位身份驗證。

CCA2安全性(自適應選擇密文攻擊)。

谷歌分析了許多加密技術的弱點,在Tink中對他們做了專門修復。

告別OpenSSL,谷歌推出其取代軟件Tink

實例起步

基本的加密操作是使用對稱密鑰加密,我們還是舉個傳統的例子Bob和Alice通訊:Bob和Alice使用相同的密鑰加密並解密。 Bob創建密鑰,然後將其安全地傳遞給Alice,使用密鑰交換方法生成共享密鑰:

告別OpenSSL,谷歌推出其取代軟件Tink

Tink就是用於簡化加密處理並儘可能使用安全、最佳加密方法。在下面我們使用"qwerty123"鍵加密一個字符串("napier"),注意示例代碼用了java,官方目前支持C++,OC和JAVA原生庫,相關可以查看官方倉庫,裡面有詳細的文檔和範例。

package com.helloworld;

import com.google.crypto.tink.aead.AeadConfig;

import java.security.GeneralSecurityException;

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;

public final class HelloWorld {

public static void main(String[] args) throws Exception {

AeadConfig.register();

try {

KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM);

Aead aead = AeadFactory.getPrimitive(keysetHandle);

String plaintext="napier";

String aad="qwerty123";

System.out.println("Text:"+plaintext);

byte[] ciphertext = aead.encrypt(plaintext.getBytes(), aad.getBytes());

System.out.println("Cipher:"+ciphertext.toString());

byte[] decrypted = aead.decrypt(ciphertext, aad.getBytes());

String s = new String(decrypted);

System.out.println("Text:"+s);

} catch (GeneralSecurityException e) {

System.out.println(e);

System.exit(1);

}

}

}

範例運行過程如下:

Text: hello123

Password: qwerty

Type: 1

Enc type: 128-bit AES GCM

Cipher: AQbLoE0ino8ofgrvuSSLOKTaYjdPc/ovwWznuMeYfjP+TO1fc6cn7DE=

Cipher: 4151624C6F4530696E6F386F666772767553534C4F4B5461596A6450632F6F7677577A6E754D6559666A502B544F31666336636E3744453D

Decrypted: hello123

在本里中下,我們使用了帶GCM的128位AES(伽羅瓦/計數器模式)。我們的AEAD對象創建語句為:

KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM);

然後使用encrypt()和decrypt()方法創建加密流,並其進行解密。

好今天文章就介紹到這裡,在撰寫本文的時候,我們得知golang和.net版本的Tink也已經起步(github:elucidsoftllc/tink.net)。如果有機會,我們會對其做更多的探索,並且第一時間給大家呈上結論。歡迎關注蟲蟲,獲得最新的技術和軟件信息。


分享到:


相關文章: