題:
如何通過HTTP保護密碼?
FireCubez
2018-11-09 19:57:16 UTC
view on stackexchange narkive permalink

說我的密碼是 abc 。我想通過HTTP將其發送到服務器。

我可以將其以純文本格式發送,然後讓服務器對其進行哈希處理並將其與數據庫中的條目進行比較,但是隨後任何人都可以看到該連接上的流量會以純文本形式顯示密碼。這個情況)。但是話又說回來,任何能夠看到流量的人都將看到哈希密碼,然後將哈希密碼發送到服務器,服務器將接受該密碼。

如何通過HTTP發送密碼?我是否需要實現一些加密算法,例如RSA公鑰加密?還是這不可能?

該方法應可在任何瀏覽器中使用。

為什麼不能只使用TLS?確實沒有其他方法可以安全地執行此操作。
我可以的@AndrolGenhald,這僅僅是概念證明。如果沒有其他方法可以安全地做到這一點,那就是我想要的答案。您應該將其發佈為答案
您不需要本機TLS-從理論上講,您可以通過HTTP實現TLS-但這幾乎不可行。
@AndrolGenhald沒有充分的理由不使用TLS,但是我相信還有很多其他方法可以安全地使用它。例如,可以通過ssh隧道http。
也許嘗試使用ECDHE安全地交換密鑰?
@emory發布者澄清說,上下文是Web瀏覽器與HTTP服務器的通信,而不是自定義應用程序與自定義服務器的通信。
這是您面臨的真正問題,還是只是思想上的嘗試?
-1
當您問A且人們回答“僅使用B”時,我討厭它,但我必須同意許多“僅使用TLS”的答案,因為這是解決實際問題的最直接方法。現在,您說的不是實際問題,而是“僅用於實驗”,因此您可能想閱讀[零知識協議](https://en.wikipedia.org/wiki/Zero-knowledge_proof),該代碼可以做什麼你要。
最初的MSN Messenger密碼實現可滿足這種情況。服務器向您發送了一個“鹽”,您使用該鹽對密碼進行了哈希處理,然後將哈希發送回服務器。由於服務器知道您的密碼,因此它可以執行相同的計算。服務器負責確保不重複使用鹽
FWIW,即使您設法安全地傳輸密碼,也不會做任何事情。會話的其餘部分未加密,很容易被盜或修改。即使您可以安全地證明“您是鮑勃”,在這種情況發生的那一刻,愛麗絲也可以竊取您的會話,並且只要她願意就可以“成為鮑勃”。
@curiousguy如果OP運行ssh -L 127.0.0.1:8080:intra.example.com:80 gw.example.com`,然後瀏覽到http://127.0.0.1:8080,則該連接將被加密並保護密碼。(1)假設OP可以ssh進入gw.example.com,並且(2)Web服務器可能不響應本地請求。該示例可能/可能不適用於OP,但是關於TLS是唯一方法的爭論是錯誤的。
-1
@TripeHound我建議只使用TLS,而不必擔心這些問題。但是,如果實際上使用TLS但使用ssh而不是直接在客戶端中實現它,則與真實Web服務器的連接將不容易被竊聽。
九 答案:
tim
2018-11-09 20:08:48 UTC
view on stackexchange narkive permalink

您不能。

要通過不安全的通道安全地發送信息,您需要加密。

對稱加密已失效,因為您首先需要傳輸密鑰,而這是無法在不安全的通道[*]上安全進行的。

這給您留下了公共密鑰密碼學。您當然可以自己動手,但是您不想成為戴夫,所以就這樣了,這使您只能使用HTTPS。

[*]當然,您可以嘗試使用安全通道交換密鑰,例如,物理交換密鑰。然後,您可以使用諸如Kerberos之類的秘密密鑰加密。 sub>

您不能將其哈希兩次嗎?一次在客戶端,一次在服務器上?
@NathanMerrill-[在客戶端哈希密碼只是使哈希成為密碼](https://security.stackexchange.com/questions/8596/https-security-should-password-be-hashed-server-side-or-客戶端)(缺少一些包含額外信息的方案)。但是,僅保護密碼是毫無用處的-您必須至少對**通道**進行身份驗證,否則,即使不知道密碼,攻擊者也可以模擬對話的兩端。
這是誤導。是的你可以。此問題詢問您在無法使用HTTP時如何保護密碼。公司政策不當,防火牆配置不當都會強制使用HTTP。在這種情況下,可以通過邊信道交換證書(IPsec TLS SCRAM等),這應該是答案。回答問題,而不是提供不需要的建議。
-1
我同意主要觀點-無法做到。但我要補充一點,即使您是Dave並推出自己的加密貨幣,也無濟於事。進行加密的代碼通過HTTP傳遞,因此可以被篡改。
AndrolGenhald
2018-11-09 20:09:53 UTC
view on stackexchange narkive permalink

TLS確實是唯一的方法。

但是如果我使用JavaScript對其進行加密怎麼辦?

攻擊者可以更改您的JavaScript。發送給客戶端,或者簡單地註入自己的JavaScript來記錄輸入的所有信息。

然後,我將使用CSP和SRI來防止添加腳本和修改自己的腳本。

很高興您正在使用現代工具來幫助保護您的網站,但是在非安全上下文中的SRI實際上只能防止外部資源受到損害。攻擊者只需修改CSP標頭和SRI標籤即可。

從一開始就不使用加密,實際上是沒有辦法做到的,唯一的標準方法就是使用TLS。

Melanie
2018-11-10 00:01:01 UTC
view on stackexchange narkive permalink

雖然我同意您應該使用HTTPS,但是通過使用Salted Challenge Response身份驗證機制(SCRAM,請參閱 RFC 5802)進行實際的身份驗證交換,可以使其更加安全。

實現並非易事,但要點是,不是向服務器發送密碼,而是向服務器發送知道密碼的證明,而不是向服務器發送密碼。由於推導證明使用的是客戶端和服務器的隨機數,因此攻擊者無法重用它(就像發送哈希本身一樣)。

與HTTPS和您描述的基本身份驗證:

  1. 服務器在登錄時從未真正看到您的密碼。如果有人設法在服務器上插入惡意代碼,他們仍然不會知道您的密碼是什麼。
  2. 如果HTTPS實施中存在錯誤(請注意Heartbleed),則攻擊者仍將無法獲取您的密碼。因為,即使繞過TLS,也無法使用密碼。
  3. 如果由於某種原因您無法使用HTTPS,則比直接發送密碼要好。攻擊者將無法根據交換信息猜測您的密碼。也就是說,您仍然應該使用HTTPS,因為深度防禦會更好。
  4. ol>

    請注意,這只有在客戶端能夠執行SCRAM的情況下才是安全的計算無需從服務器下載代碼。您可以提供一個胖客戶端,或者用戶可以編寫他們自己控制的代碼。通過HTTP下載SCRAM代碼將使攻擊者有機會修改SCRAM代碼,以以明文形式發送密碼,或以其他方式公開密碼。

您可以使用以安全方式分發的胖客戶端(台式機或移動應用程序)安全地執行此操作。但是,對於內部瀏覽器瘦客戶端,客戶端代碼本身也通過HTTP傳遞,並且正如@AndrolGenhald所指出的那樣,中間的攻擊者可以攔截並更改它,以將密碼發送給他們。
@Zoltan是的,非常感謝您的澄清。最初的問題並沒有說明他們是否需要瘦客戶機或胖客戶機,因此我的答案並不適用於所有情況。但是,即使通過HTTP,我認為這也提供了一些額外的安全性。攻擊已從僅偵聽流量到修改代碼。沒有什麼是無法克服的,所以它不是安全的,但是也許更糟?而且我認為同時擁有HTTPS和SCRAM是非常有益的。
如果您同意,則可以考慮在回答中提及此限制。否則,我真的很喜歡您的答案,因為挑戰響應也是我的第一個想法,其他答案都沒有提及。
謝謝,我已經更新了我的答案。如果您認為可以進一步說明,請告訴我!
對我來說看起來不錯,謝謝。不過,您應該刪除“感謝Zoltan”部分,因為在Stack Exchange網站上的問答中不鼓勵使用諸如問候,簽名和說謝謝的禮貌用語,以便專注於內容。哦,歡迎來到Stack Exchange!:)
@Melanie您絕對正確,即使使用HTTP還是更好。有些攻擊者只能進行被動攻擊。話雖如此,如今沒有理由不使用免費的HTTPS。
SCRAM是否要求密碼以可檢索的方式存儲在服務器上?還是可以鹽醃+霧化
@IanF1服務器只需要知道密碼的哈希即可。另外,我知道的所有瀏覽器都實現類似的機制:[HTTP摘要認證](https://en.wikipedia.org/wiki/Digest_access_authentication),因此即使是瘦客戶端,也可以使用此方法。另一方面,HTTP摘要基於過時的MD5哈希值,但是我不確定由於此原因它有多不安全(並不是每個應用程序都破壞了MD5)。
@Zoltan,我已經刪除了謝謝。儘管我不喜歡在到期時不給任何信用,但我認為它在評論中。再次感謝!
-1
Polynomial
2018-11-10 00:31:25 UTC
view on stackexchange narkive permalink

在這種情況下,您絕對應該部署TLS。

如果您決定嘗試通過HTTP發明一種傳輸安全系統,那麼最終您最終將最終實現TLS功能的多餘部分。在設計和實現這樣的系統時,有很多陷阱需要注意,當您選擇嘗試使用不提供許多安全功能的語言來實現該系統時,這些陷阱會進一步放大。

即使您確實在JavaScript中實現了加密協議的正確實現(這已經是一個很大的挑戰),您不能依靠該實現來抵抗定時攻擊,並且如果有人禁用了腳本(例如,使用NoScript),整個過程就會中斷。

作為一般規則,您應該選擇由最簡單,易於理解且值得信賴的組件組成的實現,而這些實現要求您編寫最少數量的安全關鍵代碼。引用安德魯·坦南鮑姆(Andrew Tannenbaum)的話:

(在應用程序安全方面)的大量問題是由有缺陷的軟件引起的,這是由於供應商不斷向其添加更多功能而引起的。他們的程序,這不可避免地意味著更多的代碼,因此也意味著更多的錯誤。

Brian Williams
2018-11-09 22:03:34 UTC
view on stackexchange narkive permalink

我是否需要實現某種加密算法,例如RSA公鑰加密?

如果您正在考慮嘗試這樣做,則不妨全力以赴並使用HTTPS。由於您似乎不是專家,因此“滾動自己的”加密無疑會有誤操作,從而使它不安全。

Pierre del Perugia
2018-11-10 15:38:45 UTC
view on stackexchange narkive permalink

實際上很有可能。

密碼必須在客戶端進行哈希處理,但不能使用靜態函數。以下方法分兩個步驟,並受到摘要訪問身份驗證的啟發:

注意:服務器保留密碼的HMAC和相應的密碼。 密鑰摘要);

  1. 客戶端從向服務器請求隨機數開始,服務器返回密鑰 Nonce
  2. 客戶端計算:HMAC(HMAC( Password Key ), Nonce )並將其發送到服務器;
  3. 服務器計算:HMAC(摘要 Nonce )並將其與接收到的值進行比較。
  4. ol>

    這可以防止重放。

    我看到的主要興趣不是防止竊聽,而是要完全確保不會在其上存儲明文密碼服務器,甚至不在系統日誌中(請參閱 Twitter GitHub)。

    注意:HMAC可以由PBKDF2代替。

然後,一些攻擊者可以注入一些代碼來直接從獲取密碼。一個瘋狂的主意:“很遺憾,在保留IP地址上支持HTTPS有點困難。請[在您的終端上運行此代碼](https://stackoverflow.com/a/7285256)並將結果HMAC粘貼為。”(當然,從長遠來看,請禁用複制粘貼,以防止粘貼劫持)。
CBHacking
2018-11-10 16:42:21 UTC
view on stackexchange narkive permalink

實際上存在一種通過不安全連接對用戶進行身份驗證的方法:安全遠程密碼(SRP)協議。 SRP專門用於允許客戶端向服務器進行身份驗證,而中間人攻擊者無法捕獲客戶端的密碼,甚至可以重播身份驗證以稍後模擬客戶端,而不管身份驗證是否成功。此外,通過SRP成功進行身份驗證會創建客戶端和服務器都知道的共享密鑰,而MitM則不知道。此秘密密鑰可用於對稱加密和/或HMAC。

但是,SRP存在許多限制:

  1. 用戶必須已經以某種安全方式進行了註冊。時尚,因為註冊過程確實需要傳輸與密碼等效的材料(儘管服務器不需要存儲它)。
  2. 儘管可以嘗試使用不受信任的服務器進行SRP登錄(這是安全的)不會將您的密碼公開給該服務器,並且您將能夠知道該服務器的數據庫中沒有密碼),從不受信任的服務器加載登錄網頁是不安全的(它可能會向下發送)一個頁面,其中記錄了您的每次擊鍵並將其發送到某個地方。)
  3. 儘管通過SRP成功進行身份驗證會生成安全的共享密鑰,但需要從Web應用程序中加載實際使用此密鑰的代碼一台服務器,攻擊者可能會篡改該代碼以竊取對稱密鑰並更改請求和響應。
  4. ol>

    換句話說,雖然SRP在您有一個受信任的客戶端不需要通過不安全的連接下載其代碼並且還有其他一些安全的方式來註冊用戶的情況下很有用,但是SRP不適合Web應用程序。網絡應用程序始終會從服務器下載其代碼,因此,如果與服務器的連接不安全,則MitM(或其他網絡攻擊者,例如欺騙DNS的人)可以將惡意代碼注入網絡應用程序,您無所適從,受害者,可以做到這一點。一旦有了該代碼,它就可以捕獲您輸入的任何密碼或其他數據,竊取所生成的任何密鑰,並且在您不知情的情況下篡改您發送的任何請求或收到的響應。

Christopher Schultz
2018-11-11 04:51:56 UTC
view on stackexchange narkive permalink

當然可以使用HTTP安全發送密碼。甚至有一個標準。它稱為 HTTP-Digest ,在RFC 7616中定義。它已經成為HTTP規範的一部分,已有相當一段時間了。它最初被設計為僅使用MD5消息摘要(“哈希”)算法,但是該標準的更高版本允許客戶端和服務器協商使用哪種算法。

不幸的是,存在許多問題使用HTTP摘要,最明顯的是服務器需要以明文形式獲取密碼。因此,儘管可以使用HTTP安全地傳送密碼,但是在使用時無法在服務器上安全地存儲密碼。因此,基本上,它沒有用。

如其他人所說,實施TLS會更好,因為它可以同時解決多個問題,並且具有相當的前向兼容性。

Richard N
2018-11-13 03:55:03 UTC
view on stackexchange narkive permalink

正如其他人所說的TLS! TLS! TLS! (並且具有適當的密鑰長度)

但是如果您必須使用HTTP和任何服務器來實現,這是用於編程用途還是人為使用?如果是人為使用,您是在尋找基本身份驗證還是基於表格?並且您的使用是否能夠應用一些邏輯例如

如果需要的話,您可以查看以下內容:

  • 使用一次性密碼鍵盤/密碼生成器(RSA密鑰卡並不便宜,如果您有那麼多錢可花,那麼您可以負擔得起TLS)
  • 其他一些2要素驗證,例如SMS(不是
  • 一種用於混淆密碼的簡單質詢/響應機制,例如,頁面在文本上顯示兩個數字(兩個都不標明),用戶必須以簡單的計算,例如添加到PIN的每個數字的兩個數字之間的差異,可能帶有之前和/或之後的隨機填充,例如98634572dkkgdld。更改挑戰號應該停止不是立即嘗試的重播攻擊,但是如果攻擊者可以捕獲足夠的嘗試,他們也許可以解決。您不會在面向用戶的腳本中添加任何混淆邏輯,要么會看到“ cos,如果方案太複雜,您的用戶就會更討厭您。”

我希望儘管使用TLS仍然如此,但是如今證書很便宜(甚至是免費的),因此令人費解的混淆方案確實沒有理由再存在了。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...