SSL 連接是否提供完整性?
我是密碼學的新手,我正在嘗試使用 OpenSSL 實現一個安全的聊天應用程序。
我想確保公共消息(將顯示給所有使用者)在傳輸過程中不會被更改。
使用 SSL 連接可以保證嗎?
如果不是,那麼使用數字簽名對每條消息進行簽名以證明發件人的身份是否是一個合適的解決方案?
是的。SSL 連接提供傳輸的機密性和完整性:攻擊者(不是兩個通信方中的任何一方)無法找到或檢查傳輸的數據,也無法修改傳輸的數據。對手也無法重播數據。
關於機密性,請注意,攻擊者可以觀察到哪台機器正在連接到哪台機器,以及交換了多少數據。這意味著雖然攻擊者無法知道消息的內容,但他們可能能夠猜到誰在和誰說話。隱私需要額外的預防措施。
關於完整性,請注意它依賴於真實性。完整性保證當 Alice 與某人交談時,除了 Alice 之外沒有人可以修改他們正在交換的數據。但是,如果 Alice 想與 Bob 交談,那麼她可以與身份不明的一方進行未經修改的通信對她沒有好處:她需要知道她正在與 Bob 進行未經修改的通信。TLS 是一種客戶端-伺服器協議,始終保證伺服器的真實性。它可以選擇性地保證客戶端的真實性。
請注意,最高 1.2 的 TLS 版本具有一些不尋常的密碼套件,其安全性保證會降低。雖然所有主要 TLS 庫的預設配置預設禁用這些密碼套件,但您確實需要小心不要意外啟用它們。TLS 1.3 僅具有完全安全的密碼套件(請注意,客戶端身份驗證仍然是可選的,因為 TLS 旨在支持連接到已知伺服器的未知客戶端)。
最後,請記住,TLS 只能提供有關傳輸的安全保證。網際網路上的兩台隨機機器很難直接通信,因此聊天通常通過中央伺服器傳輸。如果您僅在每個客戶端和伺服器之間依賴 TLS,則 TLS 會在消息在客戶端 1 和伺服器之間傳輸時以及在伺服器和客戶端 2 之間傳輸時保護消息。但是由伺服器軟體來保證消息之間的安全性——例如,消息被路由到正確的收件人。有更複雜的協議可以保證消息的端到端安全性,一種流行的協議是Signal. 使用此類協議的應用程序可能仍會在躍點之間使用 TLS。例如,這可以通過向竊聽者隱藏誰在與誰交談的資訊來保護隱私,或者幫助防止花費資源來路由虛假消息,否則這些虛假消息只會在它們到達預期的接收者時被丟棄)。
TLS(你稱之為 SSL 的正確名稱)確實提供了端到端的完整性保證;也就是說,接收者可以知道他們得到的正是發送者發送的。
但是,它是點對點協議;任何消息(記錄器)都來自特定的發送者和特定的接收者。
一種看待它的方式就像它是一個安全的“管道”。一側可以將東西放入管道,另一側可以將其取出 - 沒有其他人可以查看進入管道的內容(除了進入的內容),也沒有其他人可以修改管道中的內容(沒有被檢測到)。但是,TLS 不保證數據在進入管道之前會發生什麼,或者離開管道後會發生什麼。
您聲明您有公開資訊;消息如何到達多個接收者?TLS 只是為您提供點對點連接(管道);你如何把它變成一個廣播系統?發送者是否使用獨立的 TLS 連接將消息發送給每個接收者?初始接收者是否將消息轉發給其他接收者?發送者是否將消息放置在一個可以被不同接收者閱讀的公共區域?
在第一種情況下,TLS 將提供端到端的完整性(假設可以信任發送者發送完全相同的消息 - TLS 不做任何驗證)。
在第二種情況下(消息被轉發),沒有什麼可以阻止初始接收者修改它轉發的消息 - 如果可以信任他不會這樣做,那麼它是安全的。如果他不能被信任,則需要 TLS 之外的一些保護(例如使用發送者的公鑰簽名)。
在第三種情況下(將消息放入公共區域),TLS 不提供任何保護 - 您需要簽名之類的東西。