成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊 Mbedtls 基礎(chǔ)及其應(yīng)用

安全 應(yīng)用安全
互聯(lián)網(wǎng)是開放環(huán)境,通信雙方都是未知身份,為通信雙方的有效信息不被第三方竊聽、篡改或者被冒充身份進(jìn)行通信,需要為信息加上保護(hù)措施。

 [[359159]]

1、引言

1.1 為什么要加密

互聯(lián)網(wǎng)是開放環(huán)境,通信雙方都是未知身份,為通信雙方的有效信息不被第三方竊聽、篡改或者被冒充身份進(jìn)行通信,需要為信息加上保護(hù)措施。也就是對(duì)所有信息都進(jìn)行加密,避免被第三方竊聽;采用校驗(yàn)機(jī)制,可以識(shí)別出信息是否被篡改,配備身份認(rèn)證防止被冒充身份。互聯(lián)網(wǎng)的通信安全,就是建立在SSL/TLS協(xié)議之上。

1.2 SSL/TLS協(xié)議的歷史

1996年,在前面的基礎(chǔ)上,SSL 3.0版問世并得到大規(guī)模應(yīng)用;

1999年,互聯(lián)網(wǎng)標(biāo)準(zhǔn)化組織ISOC接替NetScape公司,發(fā)布了SSL的升級(jí)版TLS 1.0版,也稱為SSL 3.1;SSL和TLS指的是同一套加密協(xié)議,只是不同時(shí)期的名字差異。

2006年和2008年,TLS進(jìn)行了兩次升級(jí),分別為TLS 1.1版和TLS 1.2版。

一般推薦使用TLS 1.2,主流的瀏覽器都支持。

2、SSL/TLS演化

熟悉一套技術(shù)的演進(jìn)步驟,比直接看最新版本,更容量理解。

2.1 明文時(shí)代

小帥向小美發(fā)送信息,直接以明文形式發(fā)送。

缺點(diǎn)顯而易見,第三方小黑很容易就竊取到信息,也可以進(jìn)行篡改后發(fā)給小美,而且小美收到后并不知情,以為是小帥發(fā)來的。

2.2 對(duì)稱加密時(shí)代

小帥和小美保存一份相同的秘鑰,小帥發(fā)出的信息先經(jīng)過加密,小美收到后使用同樣的密碼進(jìn)行解密。這種加密和解密使用同一個(gè)密鑰的算法稱為對(duì)稱加密算法。

短期內(nèi)小黑對(duì)加密數(shù)據(jù)無能為力,但是每次變更秘鑰需要事先協(xié)商,如果協(xié)商出問題,小帥告知小美新秘鑰時(shí),秘鑰被小黑截取,那后續(xù)的密文對(duì)小黑來說,他也可以解密成明文。也可以篡改明文信息后,再使用同樣的秘鑰加密后發(fā)給小美。

2.3 非對(duì)稱加密時(shí)代

既然進(jìn)行秘鑰交換存在風(fēng)險(xiǎn),小帥和小美采用非對(duì)稱加密算法。雙方各自保存私鑰、公鑰,兩者配對(duì),私鑰自己保存,公鑰由私鑰運(yùn)算生成發(fā)給對(duì)方,不能由公鑰反推算出私鑰;但是使用公鑰加密的密文,卻可以使用私鑰解密;使用私鑰簽名,使用公鑰驗(yàn)證;這種加密和解密使用不同的密鑰的算法成為非對(duì)稱加密算法。

通信前,雙發(fā)先將自己的公鑰發(fā)給對(duì)方,私鑰保密;小帥先使用小美提供的公鑰加密數(shù)據(jù),同時(shí)也使用自己的私鑰進(jìn)行簽名標(biāo)記,一起打包后發(fā)給小美,小美使用自己的私鑰進(jìn)行解密,再使用小帥的公鑰進(jìn)行驗(yàn)證,確認(rèn)收到的信息是否來自小帥。

這種形式的加密通信,協(xié)商傳輸?shù)氖枪€,即使被小黑截取,他也不能解密后續(xù)的信息,因?yàn)榻饷艿檬褂盟借€。

但是百密一疏,如果小黑子在最初交互公鑰時(shí),截取公鑰,把小帥發(fā)給小美的公鑰截取,把自己的假公鑰發(fā)給小美;截取小美發(fā)出的數(shù)據(jù),小黑用自己的私鑰解密,然后再使用自己的私鑰加密后發(fā)給小帥。

整了這么復(fù)雜的一套加密協(xié)議,結(jié)果還是存在隱患。

2.4 公證時(shí)代

問題就出在公鑰交換,小美收到一份公鑰,如何證明這公鑰確實(shí)是小帥發(fā)出的?譬如買房,只有房管局確認(rèn)蓋章導(dǎo)入系統(tǒng)的房產(chǎn)證,才是真的房產(chǎn)證,才能放心進(jìn)行交易。通過CA(Certificate Authority)證書頒發(fā)機(jī)構(gòu)來保證公鑰的真實(shí)性,為公鑰的真實(shí)性進(jìn)行擔(dān)保公證。

CA也是基于非對(duì)稱加密算法,小帥先先把自己的公鑰交給CA,CA用自己的私鑰加密這些數(shù)據(jù),加密完的數(shù)據(jù)稱為小帥的數(shù)字證書,先前小帥發(fā)給小美的公鑰,改為發(fā)送CA加密之后的數(shù)字證書。小美收到以后,通過CA發(fā)布的CA證書(包含了CA的公鑰),來解密小帥的數(shù)字證書,從而獲得小帥的公鑰。

問題是小美怎么確保CA證書不是小黑偽造的?CA證書是提前預(yù)置在瀏覽器或操作系統(tǒng),或者嵌入式設(shè)備內(nèi),不需要聯(lián)網(wǎng)獲取,自然也不存在劫持篡改的問題。

雖然小黑還是可以攔截帶公鑰的數(shù)字簽名證書,可以用CA公鑰解密看到內(nèi)容;但是他沒CA的秘鑰,無法偽造出正確的數(shù)字簽名證書,也就是小帥的真實(shí)公鑰小黑可見不可改,改了小美會(huì)發(fā)現(xiàn)異常,但只有公鑰并沒什么價(jià)值。

2.5 TLS協(xié)議時(shí)代

公證時(shí)代的解決方案就是SSL/TLS協(xié)議加密通信基礎(chǔ)。因?yàn)槭褂梅菍?duì)稱加密算法比對(duì)稱加密算法要復(fù)雜,消耗運(yùn)算資源,為考慮效率,非對(duì)稱加密只會(huì)用來傳遞一條信息,即對(duì)稱加密的密鑰。對(duì)稱加密的密鑰確定,后續(xù)有效信息使用對(duì)稱加密算法進(jìn)行網(wǎng)絡(luò)傳輸。既保證了網(wǎng)絡(luò)通信的安全性,又不影響效率。

SSL/TLS協(xié)議的基本過程:

1、通過CA體系交換公鑰

2、使用非對(duì)稱加密算法,交換用于對(duì)稱加密的密鑰

3、有效數(shù)據(jù)使用對(duì)稱加密算法,進(jìn)行密文傳輸

前兩步又稱為"握手階段"(handshake),是SSL/TLS加密通信的基礎(chǔ)。

2.6 TLS的應(yīng)用

在SSL/TLS出現(xiàn)之前,很多應(yīng)用層協(xié)議(http、ftp、smtp等)都存在著網(wǎng)絡(luò)安全問題。最常見的http協(xié)議,在傳輸過程中使用的是明文信息,傳輸報(bào)文一旦被截獲便會(huì)泄露傳輸內(nèi)容;傳輸過程中報(bào)文如果被篡改,對(duì)方無法輕易發(fā)現(xiàn);無法保證消息交換的對(duì)端身份的可靠性。為了解決此類安全問題,在應(yīng)用層和傳輸層之間加入了SSL/TLS協(xié)議,升級(jí)為https。SSL/TLS目前已經(jīng)廣泛用于數(shù)據(jù)安全協(xié)議。關(guān)于SSL/TLS有很多開源軟件包,如openSSL,mbedtls等。openSSL功能更強(qiáng)大,mbedtls小巧更適合嵌入式設(shè)備。

3、mbedtls

隨著物聯(lián)網(wǎng)的發(fā)展,設(shè)備節(jié)點(diǎn)的安全問題也越來越重要,相比互聯(lián)網(wǎng)的openSSL,物聯(lián)網(wǎng)的嵌入式設(shè)備適合小巧靈活的MbedTLS,曾用名PolarSSL,可以根據(jù)需求進(jìn)行配置,降低對(duì)硬件資源的消耗。mbedtls內(nèi)置了非常多的加密解密,散列算法源碼,即使不使用tls加密,也從里面挖掘各種算法,諸如AES/RSA/MD5等。但是openSSL功能更強(qiáng)大,

mbedtls是一款采用Apache 2.0許可證協(xié)議開源軟件加密庫,使用標(biāo)準(zhǔn)C語言編寫;獨(dú)立的模塊設(shè)計(jì),降低模塊之間的耦合度。從功能上看,主要包括加密庫、X509證書、SSL/TLS協(xié)議三部分。

3.1 軟件包

進(jìn)入https://tls.mbed.org/[1],點(diǎn)擊download,在https://github.com/ARMmbed/mbedtls[2]下載源碼。

Git下載界面有說明編譯方式

  • Compiling
  • There are currently three active build systems used within Mbed TLS releases:
  • GNU Make
  • CMake
  • Microsoft Visual Studio (Microsoft Visual Studio 2013 or later)

目前個(gè)人接觸的芯片SDK內(nèi)置mbedtls有v2.4.0,v2.4.2和v2.14.1三種,將git版本切到v2.14.1,最后提交是2018年。前期先在電腦模擬測(cè)試,選擇Visual Studio 2013。

3.2 軟件結(jié)構(gòu)

mbedtls源碼結(jié)構(gòu)如下圖

mbedtls\include\mbedtls下面,可以version.h查看版本信息,重點(diǎn)是config.h配置,mbedtls是一套加密集合,實(shí)際項(xiàng)目使用中僅需選擇少部分即可,配置功能宏裁剪代碼,簡(jiǎn)化運(yùn)算,畢竟mbedtls跑一遍,一般的arm單片機(jī)不一定扛得住。

programs\ssl下是參考范例,TLS的客戶端和服務(wù)端范例,以及UDP版本的DTLS。嵌入式設(shè)備以客戶端應(yīng)用居多,主要參考ssl_client2.c里面很多配置參數(shù)可選,也可以針對(duì)應(yīng)用替換ssl_client1.c。

測(cè)試TLS客戶端首先要準(zhǔn)備3個(gè)文件,CA證書,客戶端公鑰數(shù)字證書以及私鑰。一般情況下命名后綴如下:

.crt CA證書 .pem 公鑰,經(jīng)CA加密后的公鑰,也稱為數(shù)字證書 .key 私鑰 有時(shí)crt和pem混用,其本質(zhì)都是CA公鑰加密后的文件

如果沒有服務(wù)器聯(lián)調(diào),也可以使用自身的ssl_server2.c做服務(wù)器。

3.3 demo流程分析

ssl_client2.c范例都在main函數(shù),其大體流程如下:

  • 1、先加載各種證書、秘鑰,配置opt結(jié)構(gòu)體成員初始化,如TLS版本,加密套件類型等
  • 2、然后開始連接服務(wù)器 mbedtls_net_connect
  • 3、初始化tls參數(shù) mbedtls_ssl_config_defaults,設(shè)置網(wǎng)絡(luò)收發(fā)回調(diào)函數(shù)等
  • 4、SSL/TLS握手流程,過程比較復(fù)雜,簡(jiǎn)化就是通信雙方校驗(yàn)對(duì)方身份,獲取對(duì)方的公鑰,確認(rèn)加密方式,后續(xù)數(shù)據(jù)進(jìn)行加密或解密做準(zhǔn)備 mbedtls_ssl_handshake
  • 5、校驗(yàn)服務(wù)端返回的證書 mbedtls_ssl_get_verify_result
  • 6、如果前面流程順暢,就可以使用mbedtls_ssl_write,mbedtls_ssl_read收發(fā)數(shù)據(jù)了
  • 7、測(cè)試結(jié)束后的清理工作
  • 8、與標(biāo)準(zhǔn)socket編程對(duì)比,接口存在一定的對(duì)應(yīng)關(guān)系:

4、mbedtls移植

先在電腦端模擬測(cè)試,確定參數(shù),簡(jiǎn)化范例里的賦值,因?yàn)閷?shí)際項(xiàng)目參數(shù)不會(huì)經(jīng)常變更,優(yōu)化代碼,尤其是秘鑰加載,嵌入式都是以數(shù)組保存文件內(nèi)容,而不會(huì)使用文件形式加載。另外結(jié)合加密等級(jí),確定加密套件類型。

模擬測(cè)試正常后,再移植到ARM平臺(tái),主要改動(dòng)涉及網(wǎng)絡(luò)連接、內(nèi)存管理和定時(shí)器三個(gè)方面。

4.1 網(wǎng)絡(luò)接口

mbedtls默認(rèn)的網(wǎng)絡(luò)接口mbedtls/library/net_socket.c,可以在windows下運(yùn)行,特別注意,默認(rèn)的socket操作都是阻塞模式;一般不適合ARM平臺(tái),關(guān)閉MBEDTLS_NET_C,結(jié)合硬件平臺(tái)重新實(shí)現(xiàn)網(wǎng)絡(luò)接口。主要包括以下函數(shù):

  1. void mbedtls_net_init( mbedtls_net_context *ctx ); 
  2. int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto ); 
  3. int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len ); 
  4. int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len, uint32_t timeout ); 
  5. int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len ); 
  6. void mbedtls_net_free( mbedtls_net_context *ctx ); 

若需要DUP版本的DTLS,還需要實(shí)現(xiàn)該文件下另外幾個(gè)接口,具體流程參考dtls_client.c。

自定義實(shí)現(xiàn)的網(wǎng)絡(luò)收發(fā)接口,需要注冊(cè)mbedtls_ssl_set_bio告知底層。

  1. mbedtls_ssl_set_bio(&ssl, &server_fd, 
  2.         mbedtls_custom_send,//改寫后的mbedtls_net_send,為底層提供發(fā)送接口 
  3.         mbedtls_custom_recv,//為底層提供接收接口 
  4.         mbedtls_custom_recv_timeout) 

4.2 內(nèi)存管理

自定義實(shí)現(xiàn)類型如下內(nèi)存的申請(qǐng)和釋放接口:

  1. void* calloc(unsigned int num,unsigned int size) 
  2. void free(void * ptr) 

實(shí)現(xiàn)后將函數(shù)注冊(cè)給底層

  1. mbedtls_platform_set_calloc_free(custom_calloc, custom_free) 

4.3 定時(shí)器

對(duì)DTLS定時(shí)器接口,并注冊(cè)到底層。

  1. #if defined (__MBEDTLS_DTLS__) 
  2.     
  3.    //Set delays to watch 
  4.    void platform_timing_set_delay(void *data, uint32_t int_ms, uint32_t fin_ms) 
  5.    { 
  6.     platform_timing_delay_context *ctx = (platform_timing_delay_context *) data; 
  7.      
  8.     ctx->int_ms = int_ms; 
  9.     ctx->fin_ms = fin_ms; 
  10.      
  11.     if(fin_ms != 0) 
  12.     { 
  13.      ctx->snapshot = custom_get_systicks(); 
  14.     }     
  15.    }     
  16.  
  17.    //Get number of delays expired 
  18.    int platform_timing_get_delay(void *data) 
  19.    { 
  20.     platform_timing_delay_context *ctx = (platform_timing_delay_context *) data; 
  21.     unsigned long elapsed_ms; 
  22.      
  23.     if(ctx->fin_ms == 0) 
  24.  { 
  25.   return(-1); 
  26.  } 
  27.      
  28.     elapsed_ms = custom_ticks_to_milli_secs(custom_get_systicks() - ctx->snapshot); //轉(zhuǎn)換成毫秒 
  29.      
  30.     if(elapsed_ms >= ctx->fin_ms) 
  31.     { 
  32.      return(2); 
  33.     } 
  34.      
  35.     if(elapsed_ms >= ctx->int_ms) 
  36.     { 
  37.      return(1); 
  38.     } 
  39.      
  40.     return 0; 
  41.    } 
  42.  
  43.    #endif /* __MBEDTLS_DTLS__ */ 
  44.     
  45.    //注冊(cè)到底層 
  46.    mbedtls_ssl_set_timer_cb( &ssl, &platform_timer, platform_timing_set_delay, platform_timing_get_delay ); 
  47.     

4.4 網(wǎng)絡(luò)阻塞與非阻塞機(jī)制

mbedtls在電腦模擬測(cè)試時(shí)其網(wǎng)絡(luò)連接非常順暢,而且測(cè)試只是跑這一項(xiàng)功能,即使采用阻塞模式也不會(huì)有其它問題。實(shí)際嵌入式設(shè)備在聯(lián)網(wǎng)時(shí),肯定還有其他任務(wù)需要執(zhí)行。

如果設(shè)備支持操作系統(tǒng),可以為mbedtls單獨(dú)分配一個(gè)線程或者任務(wù),推薦使用阻塞機(jī)制實(shí)現(xiàn)接口,而且容易調(diào)試,尤其是https下載這種場(chǎng)景。但是特殊情況下不支持阻塞的,在改寫網(wǎng)絡(luò)接口時(shí),需要特殊處理。

例如范例mbedtls_net_connect進(jìn)行域名解析、連接服務(wù)器,嵌入式設(shè)備的無線網(wǎng)絡(luò)在這個(gè)步驟,基本會(huì)返回異常表示阻塞等待中,要解決這個(gè)問題,需要將后續(xù)的握手流程拆分執(zhí)行。原本聯(lián)網(wǎng)后執(zhí)行mbedtls_ssl_handshake,在while里面等待握手流程MBEDTLS_SSL_HANDSHAKE_OVER結(jié)束或者錯(cuò)誤,改為每次收到讀消息的事件,執(zhí)行一次或多次mbedtls_ssl_handshake_step。(這個(gè)并沒親自驗(yàn)證)

mbedtls_ssl_set_bio注冊(cè)的讀寫接口支持設(shè)為非阻塞,mbedtls_ssl_write和mbedtls_ssl_read對(duì)應(yīng)用層接口,在底層socket上報(bào)read_ready之后,判斷當(dāng)前握手已經(jīng)完成,再執(zhí)行mbedtls_ssl_read。

4.5 證書與密鑰

測(cè)試可以使用mbedtls范例自帶的證書和公鑰、私鑰,但實(shí)際項(xiàng)目需要自己根據(jù)服務(wù)器域名生成ca證書,以及雙方的公鑰、私鑰。在源碼programs\pkey下有秘鑰生成的代碼,作為客戶端,需要驗(yàn)證服務(wù)器提供的公鑰證書,因此本地還要CA證書,類似首次登錄12306提示要下載的證書,再加上客戶端自身的公鑰和私鑰,一共3個(gè)文件。gen_key.c生成keyfile.key私鑰,默認(rèn)秘鑰長(zhǎng)度是4096,雖然1024理論上有風(fēng)險(xiǎn),但是運(yùn)算更快;后面再使用openSSL 命令行生成公鑰。

  1. OpenSSL> rsa -in private.key -pubout -out public.key 

openSSL下載地址 https://www.openssl.org/,安裝后提示使用收費(fèi),實(shí)際使用未見異常。秘鑰也可使用openSSL生成

  1. OpenSSL>genrsa -out private.key 2048 

如果使用未知,使用help查看說明。至于CA證書,需要平臺(tái)側(cè)生成再提供給設(shè)備端。

4.6 加密套件與配置裁剪

確定合適的加密套件,未使用的算法就可以屏蔽;在電腦運(yùn)行瞬間完成,在實(shí)際arm硬件可能需要較長(zhǎng)時(shí)間,比如使用RSA在握手階段可能需要較長(zhǎng)時(shí)間,可以選擇ECDSA或者減小秘鑰長(zhǎng)度。

5、小節(jié)

目前的物聯(lián)網(wǎng)對(duì)數(shù)據(jù)安全不是很關(guān)注,使用自定義協(xié)議近似明文的方式交互,或者使用單一加密方式,未來智能家居、涉及財(cái)物計(jì)費(fèi)的、特殊行業(yè)的設(shè)備節(jié)點(diǎn),可能會(huì)逐漸使用加密通信,而mbedtls則是較好的選擇之一。即使不使用TLS,也可以選擇簡(jiǎn)單的對(duì)稱加密,mbedtls也是一個(gè)加密算法庫,可根據(jù)需求提取合適的源碼集成。

本文轉(zhuǎn)載自微信公眾號(hào)「 嵌入式系統(tǒng)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系 嵌入式系統(tǒng)公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 嵌入式系統(tǒng)
相關(guān)推薦

2023-06-05 12:59:03

2020-11-16 10:47:14

FreeRTOS應(yīng)用嵌入式

2019-01-09 13:20:28

GPU虛擬化應(yīng)用

2022-02-07 21:49:19

串行通信UART

2022-07-26 07:14:52

Docker宿主命令

2021-08-12 18:49:41

DataStreamAPI注冊(cè)

2018-05-18 08:20:32

數(shù)據(jù)治理應(yīng)用

2021-04-22 05:40:45

iOS應(yīng)用瘦身

2022-02-08 23:59:12

USB接口串行

2020-10-21 12:45:12

Redis數(shù)據(jù)結(jié)構(gòu)

2023-10-16 10:25:34

數(shù)據(jù)科學(xué)大數(shù)據(jù)

2024-05-13 08:04:26

Vue.jsWeb應(yīng)用程序

2023-06-30 08:18:51

敏捷開發(fā)模式

2013-06-28 17:47:59

移動(dòng)應(yīng)用

2022-11-02 09:39:51

數(shù)據(jù)恢復(fù)Kubernetes

2022-11-26 08:16:26

2022-01-26 08:47:17

部署應(yīng)用分布式

2020-06-10 08:55:36

Docker容器工具

2022-07-14 16:27:11

邊緣計(jì)算智慧城市應(yīng)用

2020-05-06 22:07:53

UbuntuLinux操作系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美激情一区 | 国产精品久久久久免费 | 久久久久久久久久久久91 | 成人国产一区二区三区精品麻豆 | 久久里面有精品 | 国产日韩欧美综合 | 欧美精品在线播放 | 久久综合久久久 | 久久com | 国产精品不卡 | 成人在线播放网站 | 日韩精品四区 | 亚洲一区欧美 | 亚洲人成一区二区三区性色 | 免费观看毛片 | 免费一级黄色录像 | 国产精品久久久久久一区二区三区 | 日韩中文一区 | 亚洲久久在线 | 国产在线不卡 | 中文字幕免费 | 一区二区三区国产精品 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 欧美乱大交xxxxx另类电影 | 麻豆成人在线视频 | 日韩午夜场| 色吊丝2| 一二区成人影院电影网 | 亚洲成人精品一区 | 精区3d动漫一品二品精区 | 亚洲视频在线观看 | 在线欧美一区 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美久久一级特黄毛片 | 一级黄a | 欧美性生活一区二区三区 | 一级毛片免费视频观看 | 亚洲一二三区av | 国内自拍偷拍一区 | 特一级黄色毛片 | 日韩免费网 |