c語言tls服務器,c++ tls

本文目錄一覽:

SSL/TLS協議原理解讀

HTTPS是什麼相信大家都知道,如果你不知道。。。請關閉此文!!!

HTTP的數據是明文傳輸的,沒有安全性可言。HTTPS是秘文傳輸,那麼HTTPS是怎麼實現數據的安全(加密)傳輸的?那是因為HTTPS比HTTP多了個’S’。 即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

SSL/TLS協議是網絡安全通信的重要基石,本文將簡單介紹SSL/TLS協議,主要關注SSL/TLS協議的安全性,特別是SSL規範的正確實現。 本系列的文章大體分為幾個部分:

1、SSL/TLS簡介

2、SSL/TLS協議的基本流程

3、從SSL到TLS

4、SSL/TLS的流行實現庫

SSL全稱是Secure Sockets Layer,安全套接字層,它是由網景公司(Netscape)設計的主要用於Web的安全傳輸協議,目的是為網絡通信提供機密性、認證性及數據完整性保障。如今,SSL已經成為互聯網保密通信的工業標準。

SSL最初的幾個版本(SSL 1.0、SSL2.0、SSL 3.0)由網景公司設計和維護,從3.1版本開始,SSL協議由因特網工程任務小組(IETF)正式接管,並更名為TLS(Transport Layer Security),發展至今已有TLS 1.0、TLS1.1、TLS1.2這幾個版本。

如TLS名字所說,SSL/TLS協議僅保障傳輸層安全。同時,由於協議自身特性(數字證書機制),SSL/TLS不能被用於保護多跳(multi-hop)端到端通信,而只能保護點到點通信。

SSL/TLS協議能夠提供的安全目標主要包括如下幾個:

認證性——藉助數字證書認證服務器端和客戶端身份,防止身份偽造

機密性——藉助加密防止第三方竊聽

完整性——藉助消息認證碼(MAC)保障數據完整性,防止消息篡改

重放保護——通過使用隱式序列號防止重放攻擊

為了實現這些安全目標,SSL/TLS協議被設計為一個兩階段協議,分為握手階段和應用階段:

握手階段也稱協商階段,在這一階段,客戶端和服務器端會認證對方身份(依賴於PKI體系,利用數字證書進行身份認證),並協商通信中使用的安全參數、密碼套件以及MasterSecret。後續通信使用的所有密鑰都是通過MasterSecret生成。

在握手階段完成後,進入應用階段。在應用階段通信雙方使用握手階段協商好的密鑰進行安全通信。

Handshake協議:包括協商安全參數和密碼套件、服務器身份認證(客戶端身份認證可選)、密鑰交換;

ChangeCipherSpec 協議:一條消息表明握手協議已經完成;

Alert 協議:對握手協議中一些異常的錯誤提醒,分為fatal和warning兩個級別,fatal類型的錯誤會直接中斷SSL鏈接,而warning級別的錯誤SSL鏈接仍可繼續,只是會給出錯誤警告;

Record 協議:包括對消息的分段、壓縮、消息認證和完整性保護、加密等。

圖2、圖3都是表示的協議流程,大同小異。可以對比着看加深理解。

每一個SSL/TLS鏈接都是從握手開始的,握手過程包含一個消息序列,用以協商安全參數、密碼套件,進行身份認證以及密鑰交換。握手過程中的消息必須嚴格按照預先定義的順序發生,否則就會帶來潛在的安全威脅。今年頂級安全會議CCS 有文章提出了建立綜合狀態機來檢查SSL鏈接中消息序列……

2.1 握手過程中的消息序列

ClientHello:ClientHello通常是握手過程中的第一條消息,用於告知服務器客戶端所支持的密碼套件種類、最高SSL/TLS協議版本以及壓縮算法。

ClientHello中還包含一個隨機數,這個隨機數由4個字節的當前GMT UNIX時間以及28個隨機選擇的字節組成,共32字節。該隨機數會在密鑰生成過程中被使用。

另外,ClientHello中還可能包含客戶端支持的TLS擴展。(TLS擴展可以被用來豐富TLS協議的功能或者增強協議的安全性)

ServerHello:服務器接受到ClientHello後,會返回ServerHello。服務器從客戶端在ClientHello中提供的密碼套件、SSL/TLS版本、壓縮算法列表裡選擇它所支持的項,並把它的選擇包含在ServerHello中告知客戶端。接下來SSL協議的建立就基於服務器選擇的密碼套件類型、SSL/TLS協議版本以及壓縮算法。

ServerHello中同樣會包含一個隨機數,同樣4+28 字節類型,由服務器生成。

Certificate:客戶端和服務器都可以發送證書消息來證明自己的身份,但是通常客戶端證書不被使用。 服務器一般在ServerHello後會接一條Certificate消息,Certificate消息中會包含一條證書鏈,從服務器證書開始,到Certificate authority(CA)或者最新的自簽名證書結束。下圖形象地描述了證書鏈:

SSL中使用的證書通常是X.509類型證書,X.509證書的內容如下表所示:

在用的X.509證書包含Version 1和Version 3兩種版本,其中v1版本的證書存在安全隱患,同時不支持TLS擴展,被逐漸棄用。現在大多數在用的SSL證書都是V3版本。

同時證書會附帶與協商好的密鑰交換算法對應的密鑰。密鑰交換算法以及它們所要求的密鑰類型如下表所示。

ServerKeyExchange:該消息僅當以下密鑰交換算法被使用時由服務器發出:

RSA_EXPORT(僅當服務器的公鑰大於512bit時)、DHE_DSS、DHE_DSS_EXPORT、DHE_RSA、DHE_RSA_EXPORT、DH_anon 使用其它密鑰交換算法時,服務器不能發送此消息。

ServerkeyExchange消息會攜帶這些密鑰交換算法所需要的額外參數,以在後續步驟中協商PreMasterSecret。這些參數需要被簽過名。

CertificateRequest:這個消息通常在要求認證客戶端身份時才會有。消息中包含了證書類型以及可接受的CA列表。

ServerHelloDone:服務器發送這條消息表明服務器部分的密鑰交換信息已經發送完了,等待客戶端的消息以繼續接下來的步驟。這條消息只用作提醒,不包含數據域。

ClientKeyExchange:這條消息包含的數據與所選用的密鑰交換算法有關。

如果選擇的密鑰交換算法是RSA,那麼消息包含的參數為用服務器RSA公鑰(包含在之前證書中的或者是ServerKeyExchange中的)加密過的PreMasterSecret,它有48個字節,前2個字節表示客戶端支持的最高協議版本,後46個字節是隨機選擇的。

如果選擇的密鑰交換算法是DH或者DHE,則可能有兩種情況:

隱式DH公開值:包含在Certificate消息里;

顯示DH公開值:公開值是本消息的一部分。

CertificateVerify:這條消息用來證明客戶端擁有之前提交的客戶端證書的私鑰。

Finished:表明握手階段結束。這是第一條用協商的算法和密鑰保護的消息。

因為是用協商好的密鑰加密的消息,它可以用來確認已經協商好的密鑰。

同時Finished消息包含一個verify_data域,可以用來校驗之前發送和接收的信息。

Verify_data域是一個PRF函數的輸出(pseudo-random function)。這個偽隨機函數的輸入為:(1)兩個hash值:一個SHA-1,一個MD5,對之前握手過程中交換的所有消息做哈希;(2)the MasterSecret,由預備主密鑰生成;(3)finished_label,如果客戶端發送的則是”client finished”,服務器發送的則是”server finished”。關於這個PRF的細節在3.3節中會具體描述。 此外,Finished 消息不能夠在ChangeCipherSpec前發送。

2.2 不同密鑰交換算法對應的握手過程

不同的密鑰交換算法對應的握手過程中的消息序列是不同的,相應的實現方式也不同,本節介紹幾個常見密鑰交換算法對應的握手過程。

TLS-RSA:在這個場景下,PreMasterSecret是由客戶端指定的,並用RSA公鑰加密發送給服務器。服務器不影響PReMasterSecret的生成。

TLS-DH:基於DH的密鑰交換也被稱為靜態Diffie-Hellman。在這種場景下,可能是雙方各自提交一個證書包含DH公開值,或者服務器端提交證書包含DH公開值,客戶端在每次會話中選擇一個值。協商好的DH值被用作PreMasterSecret。顯然證書中的參數是固定的,那麼每次鏈接的PreMasterSecret也是相同的。

TLS-DH不能提供前向安全性。

TLS-DHE:基於DHE的TLS握手中會有ServerKeyExchange消息。握手過程中交換參數的認證通過數字簽名來實現,支持的簽名算法包括RSA和DSS。DH參數會有它的數字簽名一起被包含在ServerKeyExchange中被發送出去。客戶端在ClientKeyExchange中返回它的公開DH參數,但沒有簽名保護。同樣協商出來的DH密鑰被用作PreMasterSecret。

2.3 密鑰生成

Pseudo-random Function(PRF):偽隨機函數是SSL協議中的一個重要組成部分,它被用來秘密擴展以及生成密鑰。在3.1節講解Finished消息時已經簡單提及PRF,在這裡我們詳細討論PRF的工作原理。SSL/TLS協議中的PRF如下圖所示:

這個PRF基於兩個hash函數:MD5和SHA-1,它有3個輸入,一個Secret(比如PreMasterSecret),一個標誌符(比如”client finished”, “server finished”),還有一個種子值(比如客戶端隨機數+服務器端隨機數)。

Secret在使用時被分為長度相同的兩半:S1和S2,分別作為P_MD5和P_SHA-1的輸入。

PRF的輸出按如下方式處理得到:

P_MD5和P_SHA-1都是擴展函數,用來擴展秘密值以用於密鑰生成,它們的計算方式如下:

其中A(0) = seed, A(i) = HMAC hash( secret, A( i −1) )

這個秘密擴展會一直進行直到得到足夠多的擴展數據。 Key Derivation:主密鑰(MasterSecret)是利用上述PRF從預備主密鑰(PreMasterSecret)生成的。每個MasterSecret為48字節,生成方式如下:

得到MasterSecret後,它會被進一步處理最後生成4個不同的密鑰和2個初始向量(IV)。處理過程如下:

處理過程一直持續到足夠多的輸出被生成,然後把輸出分為4個key和2個IV:

下圖完整闡述了SSL/TLS協議中的密鑰生成過程。

本節介紹SSL/TLS協議的版本變遷,不同版本的區別以及安全特性等。

SSL 1.0由於從來沒有被公開過,並且存在嚴重安全漏洞,我們就不討論了。

SSL 2.0:SSL 2.0於1995年4月被發布。SSL 2.0中主要存在的問題如下:

MAC不能覆蓋填充長度域,攻擊者可能利用這點破壞消息完整性;

缺乏握手認證,攻擊者可以篡改密碼套件列表,誘騙通信雙方使用較弱的密碼套件;

使用較弱的或有問題的密碼算法(如MD5,RC4等),或者使用不安全的分組模式(如CBC模式);

對於不同的密碼學基元使用相同的密鑰,違背基本安全常識。

由於以上安全問題,RFC 6176已經明確提出避免使用SSL 2.0,但是現實生活中還有少量客戶端和服務器支持SSL 2.0.

SSL 3.0:SSL 3.0引入了一些新的特性和機制解決了很多之前版本存在的漏洞。此外,SSL 3.0中引入了ChangeCipherSpec子協議。SSL 3.0向後兼容SSL 2.0,相對於SSL 2.0,它的主要改變包括以下幾點:

支持更多的密碼套件(支持更多的密碼算法如DSS,SHA-1)

在握手階段支持密鑰協商(DH和FORTEZZA)

支持密碼學參數的重協商

增加了消息壓縮選項

MAC能夠覆蓋填充長度域了,同時MAC可以使用MD5或者SHA-1

不同的密碼學基元使用不同的key

Alert子協議能對任何錯誤給出兩種提示:Warning和Fatal

中止鏈接的時候會用一個close_notify警告通知通信雙方

支持證書鏈,而非單個證書

通過Finished消息認證所有發送和接收的消息

加密了的PreMasterSecret包含當前使用的協議版本,防止協議回滾

TLS 1.0:TLS 1.0和SSL 3.0差別非常小。實際上,TLS 1.0是SSL 3.1,在IETF接手後改名為TLS。TLS 1.0版本是目前使用最廣泛的SSL/TLS協議版本。

TLS 1.0不再支持使用FORTEZZA的密碼套件。

TLS 1.0中MAC被替換成HMAC。

之前提到ChangeCipherSpec消息必須在Finished消息前發送,在TLS 1.0中,如果消息序列不符合這個要求,會產生FATAL警告並終止鏈接。

TLS 1.1:這個版本相比之前改動也很小。最重要的改動是預防了針對CBC分組模式的一些攻擊。現在的填充錯誤變的和非法MAC錯誤不可區分了,防止攻擊者利用可區分錯誤響應建立解密預言機對密文進行攻擊。

在每次加密過程中,使用CBC分組模式時,都需要顯示給出IV,而不用再密鑰生成時使用PRF生成IV。

此外,TLS 1.1禁止為適應之前出口限制而使用弱化的密碼套件。

TLS 1.2:這是最新的版本,部署的還比較少。這個版本禁用了PRF中的MD5和SHA-1,而用一個可配置的hash函數取代了它們,這樣的修改簡化了計算過程。修改後的PRF風格如下:

此外,TLS 1.2的一個重要變化是支持認證加密模式(支持GCM等)。但是由於一些AEAD(Authenticated Encryption with Associated Data)密碼算法要求IV為隱式的,所以IV又恢復到由MasterSecret生成,即TLS 1.0以前的風格。

TLS 1.2支持使用GCM、CCM的新密碼套件。

同時SSL 2.0被宣布放棄,不再向後兼容SSL 2.0.

本節簡單介紹一下流行的SSL/TLS實現庫,SSL協議非常複雜,由開發者自己實現常常會出錯,開發者在具體實現SSL協議時通常會依賴於這些密碼學庫。

4.1 常見的SSL/TLS 實現

OpenSSL:這是非常流行的開源SSL/TLS實現。

OpenSSLim完全用C語言實現,支持SSL 2.0/3.0,TLS 1.0/1.1/1.2以及DTLS 1.0。

OpenSSL 近年來出現了很多的安全漏洞,比如2014年曝出的著名的Heartbleed漏洞等。

JSSE:這是使用Java實現的,支持SSL 3.0,TLS 1.0/1.1/1.2.

Bouncy Castle:它不僅僅支持SSL/TLS,它是一個完整的密碼學庫,支持各種密碼學算法和協議。不過它僅僅支持TLS 1.0版本。

Android平台主要使用這個密碼學庫。

GnuTLS:這是另一個用C語言實現的庫,支持SSL 3.0,TLS 1.0/1.1/1.2以及DTLS 1.0。主要在Unix世界被使用。同時以各種安全漏洞多而聞名。

NSS:這是最初由網景公司(Netscape)開發的庫,支持SSL 2.0/3.0,TLS 1.0/1.1,現在主要被瀏覽器和客戶端軟件使用,比如Firefox使用的就是NSS庫,Chrome使用的是一個NSS庫的修正版。

下表是一些常見軟件以及它們所使用的SSL/TLS實現庫的情況:

其它還有一些常用的SSL實現庫,如cryptlib、CyaSSL、MatrixSSL、PolarSSL等,由於市場佔有率不高,我們這裡就不多做介紹了。

4.2 流行SSL/TLS實現庫的安全研究

最近幾年曝出的高風險SSL安全漏洞大多跟SSL實現庫有關,比如2014年4月曝出的“心臟滴血”漏洞,存在於OpenSSL 1.0.1-1.0.1f版本中,影響全球近17%的Web服務器;同樣是2014年曝出的蘋果公司iOS 7.0.6版本系統中存在的“gotofail”漏洞,因為程序員的疏忽導致SSL證書校驗中的簽名校驗失效;包括今年曝出的SSL Freak攻擊也是由於SSL實現庫的安全漏洞導致的攻擊,我們研究小組的同學對這個攻擊有詳細的分析,參見《SSL Freak來襲:如何實施一個具體的SSL Freak攻擊》。同時我們還開發了一個基於python的中間人代理攻擊框架“風聲”對某國內知名電商的服務器進行具體的攻擊,並上報了漏洞。

考慮到大量SSL/TLS實現庫中存在安全問題,同時這些主流的SSL/TLS實現庫對開發者而言使用難度較高,比如有些SSL/TLS實現庫要求開發者自己進行隨機數生成或密鑰管理,讓缺乏系統信息安全知識培訓的開發者去使用這樣高度複雜的密碼學庫容易產生很多安全問題。我們在這裡推薦一些高級密碼學庫:Google keycazer、NaCl、Cryptlib、GPGME。這些密碼學庫存在的安全問題較少,同時封裝了一些底層的密碼學操作,降低了開發者的使用難度。

以上就是本次要介紹的SSL /TLS協議基本知識,後續的文章我們會對一些典型SSL/TLS攻擊進行具體介紹。

參考:

1、

2、

3、

使用ssl或tls通信的遠控C語言源碼。謝謝!

#includestdio.h

#includestring.h

#define MAX(x,y)((x)(y)?(x):(y))

int main()

{

char a[1000][100],b[1000][100];

int i,j,k,m,n;

scanf(“%d”,n);

getchar();

while(n–)

{

gets(a[n]);

gets(b[n]);

k=MAX(strlen(a[n]),strlen(b[n]));

for(i=0; ik; i++)

{

if(a[n][i]==32)

{

for(j=i; jk; j++)

a[n][j]=a[n][j+1];

i–;

}

if(b[n][i]==32)

{

for(j=i; jk; j++)

b[n][j]=b[n][j+1];

i–;

}

if((a[n][i]=122)(a[n][i]=96))

a[n][i]-=32;

if((b[n][i]=122)(b[n][i]=96))

b[n][i]-=32;

}

if(strcmp(a[n],b[n])==0)

printf(“YES\n”);

else

printf(“NO\n”);

}

return 0;

}

c語言訪問服務器

lz要先知道什麼是socket,它是TCP/IP協議的API。再上層是http udp之類傳輸報文協議。而什麼是服務器,如你所說tomcat服務器,他是一個http(s)服務器。處理由客戶發送的HTTP報文。並返回報文給客戶。

簡單來說,http就是socket的一個封裝。所以c語言使用socket理所當然能訪問任何服務器。至於使用什麼格式,你可以看看HTTP報文格式。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/304203.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-01 11:05
下一篇 2025-01-01 11:05

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • 服務器安裝Python的完整指南

    本文將為您提供服務器安裝Python的完整指南。無論您是一位新手還是經驗豐富的開發者,您都可以通過本文輕鬆地完成Python的安裝過程。以下是本文的具體內容: 一、下載Python…

    編程 2025-04-29
  • STUN 服務器

    STUN 服務器是一個網絡服務器,可以協助網絡設備(例如 VoIP 設備)解決 NAT 穿透、防火牆等問題,使得設備可以正常地進行數據傳輸。本文將從多個方面對 STUN 服務器做詳…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • 解決docker-compose 容器時間和服務器時間不同步問題

    docker-compose是一種工具,能夠讓您使用YAML文件來定義和運行多個容器。然而,有時候容器的時間與服務器時間不同步,導致一些不必要的錯誤和麻煩。以下是解決方法的詳細介紹…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28

發表回復

登錄後才能評論