概要
Mbed TLS是一個開源、可移植、易于使用、代碼可讀性高的SSL庫。可實現常用的加密/解密算法,X.509證書操作以及TLS/DTLS 協議。它的各個功能模塊相對獨立、耦合低,可以通過配置宏定義裁剪,非常適合用于嵌入式系統。它提供了具有直觀的API和可讀源代碼的SSL 庫。該庫即開即用,可以在大部分系統上直接構建它,也可以手動選擇和配置各項功能。
MbedTLS庫提供了一組可單獨使用和編譯的加密組件,還可以使用單個配置頭文件加入或排除這些組件。從功能角度來看,該MbedTLS分為三個主要部分:
SSL/TLS 協議實施。
一個加密庫。
一個 X.509 證書處理庫。
MbedTLS遵循Apache 2.0開源許可協議,目前由TrustedFirmware維護(Linaro主持的一個治理開放社區項目),在Github上已收獲 3k star,目前Github上發布的最新版本為2.26.0版本,開源倉庫地址為:https://github.com/ARMmbed/mbedtls
MbedTLS庫提供了TLS/DTLS協議的實現,有了MbedTLS庫之后意味著:
TCP + TLS = TCP(S)
MQTT + TLS = MQTT(S)
HTTP + TLS = HTTP(S)
COAP + DTLS = COAP(S)
目前進入萬物互聯的時代,網絡通信(TCP/UDP)是必不可少的,同時各大廠商推出了各種通信模組,可以實現基于TCP/UDP通信的上層協議:HTTP、MQTT、COAP等等。這些應用層協議最大的特點是“明文傳輸”,一旦有中間人想要截獲篡改數據,非常容易。
在我的網絡協議棧解析的文章中,所有的實例都是以明文的形式進行試驗。然后有網友問我,怎么保證數據安全呢?為了方便學習使用Mbed TLS庫,我直接在ubuntu(18.04)上進行實操。
ubuntu安裝MbedTLS庫
下載源碼直接從github下載最新的MbedTLS源代碼:https://github.com/ARMmbed/mbedtls
git clone https://github.com/ARMmbed/mbedtls.git
構建及安裝MbedTLS庫MbedTLS庫提供了兩種構建方式:make和cmake。并且可以在目標主機安裝MbedTLS動態鏈接庫和頭文件。而本文采用cmake進行構建:
注:如果你的ubuntu沒有安裝cmake需要安裝cmake構建工具,安裝命令如下:
# 更新軟件源
sudo apt-get update
# 安裝cmake
sudo apt-get install cmake
編譯安裝MbedTLS,其中:
-DUSE_SHARED_MBEDTLS_LIBRARY=On 生成動態鏈接庫
cmake時,不要忘記之后cmake指令之后的“。”,該點表示當前目錄
rice@rice:~/mbedtls_study/mbedtls$ cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On 。
rice@rice:~/mbedtls_study/mbedtls$ make
rice@rice:~/mbedtls_study/mbedtls$ sudo make install
在概述中,我們提到MbedTLS是可以裁剪的(注:在這個實驗中,我是按照默認配置);MbedTLS可以通過修改配置文件的方式進行裁剪,MbedTLS提供了幾個參考模板,具體的config.h文件可在mbedtls/configs目錄,參考文件config-ccm-psk-tls1_2.h和config-mini-tls1_1.h等文件。這里以CMake為例:
# 刪除之前cmake相關中間文件,但是不包括CMakeLists.txt文件
find 。 -iname ‘*cmake*’ -not -name CMakeLists.txt -exec rm -rf {} +
# 指定配置文件為 config-ccm-psk-tls1_2.h,重新編譯
CFLAGS=“-I$PWD/configs -DMBEDTLS_CONFIG_FILE=‘《config-ccm-psk-tls1_2.h》’” cmake 。
安裝之后查看是否安裝成功:
默認情況下 動態鏈接庫安裝至 /usr/local/lib 包括libmbedtls.so libmbedcrypto.so libmbedx509.so
默認情況下 頭文件安裝至 /usr/local/include/mbedtls
默認情況下 mbedtls的相關工具將安裝在 /usr/local/bin目錄下,例如gen_key等
SHA-1實驗
SHA-1是一種數據加密算法,該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),并把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。
單向散列函數的安全性在于其產生散列值的操作過程具有較強的單向性。如果在輸入序列中嵌入密碼,那么任何人在不知道密碼的情況下都不能產生正確的散列值,從而保證了其安全性。SHA將輸入流按照每塊512位(64個字節)進行分塊,并產生20個字節的被稱為信息認證代碼或信息摘要的輸出。
該算法輸入報文的長度不限,產生的輸出是一個160位的報文摘要。輸入是按512位的分組進行處理的。SHA-1是不可逆的、防沖突,并具有良好的雪崩效應。
通過散列算法可實現數字簽名實現,數字簽名的原理是將要傳送的明文通過一種函數運算(Hash)轉換成報文摘要(不同的明文對應不同的報文摘要),報文摘要加密后與明文一起傳送給接受方,接受方將接受的明文產生新的報文摘要與發送方的發來報文摘要解密比較,比較結果一致表示明文未被改動,如果不一致表示明文已被篡改。
MAC(信息認證代碼)就是一個散列結果,其中部分輸入信息是密碼,只有知道這個密碼的參與者才能再次計算和驗證MAC碼的合法性。
SHA-1加密的實驗:SHA-1加密測試代碼(測試內容:RiceChen的SHA-1值):
#include 《string.h》#include 《stdio.h》#include “mbedtls/sha1.h”#define mbedtls_printf printfint main(void)
{
int ret;
unsigned char buffer[] = “RiceChen”;
unsigned char digest[32] = {0};
mbedtls_sha1_context sha1_ctx;
memset(digest, 0x00, sizeof(digest));
mbedtls_sha1_init(&sha1_ctx);
mbedtls_sha1_starts(&sha1_ctx);
mbedtls_sha1_update(&sha1_ctx, buffer, sizeof(buffer) - 1);
mbedtls_sha1_finish(&sha1_ctx, digest);
int i = 0;
mbedtls_printf(“SHA1: [”);
while(digest[i])
{
mbedtls_printf(“%02X”, digest[i]);
i++;
}
mbedtls_printf(“]
”);
exit:
mbedtls_sha1_free(&sha1_ctx);
return ret;
}
構建測試代碼的CMakeLists.txt文件內容:
cmake_minimum_required(VERSION 2.6)
project(“mbedtls-test”)
set(libs
mbedtls
mbedcrypto
mbedx509
)
set(targets
mbedtls-test
)
add_executable(mbedtls-test mbedtls-test.c)
target_link_libraries(mbedtls-test ${libs})
編譯測試代碼:
rice@rice:~/mbedtls_study/demo$ mkdir build
rice@rice:~/mbedtls_study/demo$ cd build
rice@rice:~/mbedtls_study/demo/build$ cmake 。./
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/rice/mbedtls_study/demo/build
rice@rice:~/mbedtls_study/demo/build$ make
Scanning dependencies of target mbedtls-test
[ 50%] Building C object CMakeFiles/mbedtls-test.dir/mbedtls-test.c.o
[100%] Linking C executable mbedtls-test
[100%] Built target mbedtls-test
rice@rice:~/mbedtls_study/demo/build$ 。/mbedtls-test
SHA1: [CBD12068E2F91DF5DB148742DF108131AF76287E]
可以看到通過MbedTLS對“RiceChen”進行加密的SHA-1值:[CBD12068E2F91DF5DB148742DF108131AF76287E]
測試SHA1是否正確,可以通過https://1024tools.com/hash在線工具進行測試,可以看到是一致的結果。
注意:如果運行可執行文件出現如下問題:
問題:
rice@rice:~/mbedtls_study/demo/build$ 。/mbedtls-test
。/mbedtls-test: error while loading shared libraries: libmbedcrypto.so.0: cannot open shared object file: No such file or directory
解決方法:
rice@rice:~/mbedtls_study/demo/build$ sudo vim /etc/ld.so.conf //在新的一行中加入庫文件所在目錄
/usr/local/lib
rice@rice:~/mbedtls_study/demo/build$ sudo ldconfig //更新/etc/ld.so.cache文件
總結:
MbedTLS是一個非常強大的開源庫,而且功能上可以靈活的裁剪,對于嵌入式設備來說非常的友好。
后續將玩轉一下這個庫其他加解密算法。可以持續關注。
編輯:jq
-
開源
+關注
關注
3文章
3381瀏覽量
42604 -
SSL
+關注
關注
0文章
126瀏覽量
25756 -
萬物互聯
+關注
關注
1文章
224瀏覽量
14142
原文標題:MbedTLS學習--SHA-1
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論