要說一個軟件對IT和互聯(lián)網(wǎng)業(yè)界影響力,恐怕OpenSS要算上一個摔吏。一個甚至主要版本還不到V1.2的軟件鸽嫂,占據(jù)了整改互聯(lián)網(wǎng)底層安全核心。SSH征讲、HTTPS,還有其他很多的基礎(chǔ)加密庫都是離不開OpenSSL的据某。
但是這么一個非常重要的基礎(chǔ)軟件,缺在管理上和經(jīng)費上屢屢爆出問題诗箍,以至于當(dāng)2014年爆發(fā)心臟出血時候癣籽,整個業(yè)界,甚至整個互聯(lián)網(wǎng)滤祖,技術(shù)圈內(nèi)的筷狼,非技術(shù)圈內(nèi)的也都震動了。
為了克服OpenSSL帶來的問題匠童,OpenBSD Fork了一個新的軟件LibreSSL埂材,以確保SSL的庫不會再出問題,基于OpenBSD的幾十年積累下來的安全口碑汤求,蟲蟲認(rèn)為這是一個非常好的替代俏险。同時各大公司也推出自己的SSL安全庫,比如亞馬遜就推出了s2n扬绪。
本文介紹的則是竖独,繼繼谷歌自己的BoringSSL和OpenBSD的LibreSSL之后,谷歌新發(fā)布的軟件Tink挤牛。他是一個多語言莹痢,跨平臺的安全加密庫。使用OpenSSL,系統(tǒng)有著復(fù)雜的綁定竞膳,并且通常專注于特定的系統(tǒng)航瞭,例如Windows中的DLL。 而Tink是開源的顶猜,專注于創(chuàng)建簡單的API沧奴,確保基礎(chǔ)架構(gòu)更具可移植性长窄。
AWS s2n
s2n(signal to noise),是對TLS/SSL協(xié)議的C99(c語言標(biāo)準(zhǔn))實現(xiàn),基于開發(fā)一個簡單纲菌,小巧挠日,快速伐割,并且優(yōu)先考慮安全性的理念來設(shè)計两蟀。s2n使用Apache License 2.0發(fā)布和許可。重點用于改進(jìn)TLS(傳輸層安全性)和使用更輕量級的方法世囊。s2n僅使用了6,000行代碼椅贱,定義了更專注懂算,更精簡的庫。當(dāng)然可能會隨著新版本的迭代而代碼增加庇麦,因為目前還只是一個基本的實現(xiàn)计技。
s2n是完全開源的,托管在GitHub中(github:awslabs/s2n )山橄,允許任何人review和fork代碼垮媒,你可以fork然后添加核心版本不支持的新功能。
亞馬遜對安全問題都很認(rèn)真航棱,能及時反應(yīng)社區(qū)發(fā)現(xiàn)的漏洞睡雇。還開展了與研究人員和學(xué)者合作的機制來解決新的問題。
認(rèn)識Tink
Tink是谷歌基于BoringSSL發(fā)布的SSL安全庫軟件饮醇,當(dāng)前版本版本為1.2.0(已經(jīng)超過了OpenSSL積累了幾十年的版本)它抱。Tink已經(jīng)在谷歌自己的應(yīng)用中得到了大量應(yīng)用。比如已經(jīng)集成到AdMob朴艰,Google Pay观蓄,Google智能助理和Firebase中了。
Tink集成了AEAD方法(經(jīng)過身份驗證的加密AE和經(jīng)過身份驗證的加密以及相關(guān)數(shù)據(jù))呵晚。集成了加密密鑰蜘腌,散列函數(shù)和消息驗證代碼(MAC)。
Tink中AEAD的最低標(biāo)準(zhǔn)包括[RFC5116]:
明文和相關(guān)數(shù)據(jù)可以具有任何長度(從0到232字節(jié))饵隙。
支持80位身份驗證撮珠。
CCA2安全性(自適應(yīng)選擇密文攻擊)。
谷歌分析了許多加密技術(shù)的弱點,在Tink中對他們做了專門修復(fù)芯急。
實例起步
基本的加密操作是使用對稱密鑰加密勺届,我們還是舉個傳統(tǒng)的例子Bob和Alice通訊:Bob和Alice使用相同的密鑰加密并解密。 Bob創(chuàng)建密鑰娶耍,然后將其安全地傳遞給Alice免姿,使用密鑰交換方法生成共享密鑰:
Tink就是用于簡化加密處理并盡可能使用安全、最佳加密方法榕酒。在下面我們使用"qwerty123"鍵加密一個字符串("napier")胚膊,注意示例代碼用了java,官方目前支持C++想鹰,OC和JAVA原生庫紊婉,相關(guān)可以查看官方倉庫,里面有詳細(xì)的文檔和范例辑舷。
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(伽羅瓦/計數(shù)器模式)。我們的AEAD對象創(chuàng)建語句為:
KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM);
然后使用encrypt()和decrypt()方法創(chuàng)建加密流何缓,并其進(jìn)行解密肢础。
好今天文章就介紹到這里,在撰寫本文的時候碌廓,我們得知golang和.net版本的Tink也已經(jīng)起步(github:elucidsoftllc/tink.net)传轰。如果有機會,我們會對其做更多的探索氓皱,并且第一時間給大家呈上結(jié)論路召。