題:
如果通過HTTPS完成,BASIC-Auth是否安全?
Morten
2010-12-06 04:42:45 UTC
view on stackexchange narkive permalink

我正在製作REST-API,可以直接進行BASIC身份驗證登錄。然後讓HTTPS保護連接,以便在使用api時保護密碼。

這可以被認為是安全的嗎?

是的,http用戶名/密碼通過SSL時可以,但是密碼必須很長。
好吧,我可以在服務器中添加一些邏輯,以禁止嘗試過多密碼的客戶端。這樣可以防止DoS和密碼猜測嗎?
九 答案:
AviD
2010-12-06 05:18:48 UTC
view on stackexchange narkive permalink

HTTP基本身份驗證存在一些問題:

  • 密碼以base64編碼(可輕鬆轉換為純文本)通過網絡發送。
  • 對於每個請求,密碼都會重複發送。 (較大的攻擊窗口)
  • 網絡瀏覽器會緩存密碼,密碼的長度至少應為窗口/進程的長度。 (可以通過對服務器的任何其他請求以靜默方式重用,例如CSRF。)
  • 如果用戶請求,密碼可以永久存儲在瀏覽器中。 (與上一點相同,此外,它可能還會被共享計算機上的另一個用戶竊取。)

其中,使用SSL只能解決第一個問題。即使這樣,SSL也僅在網絡服務器保護之前-任何內部路由,服務器日誌記錄等都將看到純文本密碼。

因此,就像查看所有圖片一樣,很重要。

HTTPS是否在傳輸過程中保護密碼?是的。

夠了嗎?通常不會(我想說的是,永遠不會-但這實際上取決於您的網站是什麼以及網站的安全性。)

實際上,即使使用HTTP Digest,您也可以對密碼進行哈希處理(`md5(username:realm:password)`,有時稱為HA1)。
@AviD♦請注意,3)和4)對REST API很少有效。
對於基本身份驗證,密碼“必須”存儲在瀏覽器中,只能通過cookie來完成,而cookie絕對不能被認為是安全的。我在這裡發布了一個類似的問題:http://stackoverflow.com/questions/27177224/how-to-keep-state-at-the-client-safely/27177995#27177995我的結論是基本身份驗證並不安全,它不應這樣使用,甚至不應考慮在客戶端存儲敏感數據(例如用戶密碼)。
@KimGysen用於基本身份驗證,密碼不會傳輸或存儲在cookie中,而是在“ Authorization:”請求標頭中發送,並存儲在瀏覽器內存的特殊(受保護)部分中。並非我不同意您的看法,在一般情況下不應該使用基本身份驗證,但是在某些情況下可能需要進行權衡。
第二點不是問題。發送每個請求的憑據會使您的後端保持無狀態。
除了“更大的攻擊窗口”外,沒有諸如帳戶鎖定之類的內置機制可以防止暴力破解。
@Artjom:在每個請求上發送基本憑據是一個問題,這不是因為您必須繼續發送憑據,而是因為在每個請求上都會發送相同的字符串。還有其他身份驗證機制,例如HMAC,其中Authorization標頭無法解密回用戶的秘密,並且服務器可以在不真正知道用戶秘密的情況下對請求進行身份驗證。在這種機制下,在Authorization標頭上發送的字符串會根據請求的哈希值進行更改。
-1
@DavidS:重播攻擊。另外,如果通過代理或CDN服務傳遞流量,則可以確保攻擊者無法攻擊代理/ CDN來更改用戶的請求。
@Bruno, HTTP Digest非常糟糕,因為它要求服務器以純文本格式存儲用戶密碼!
-1
“較大的附加窗口”所以作為cookie發送的普通會話令牌也有類似的問題吧?
@JithinJose不會包含用戶密碼,也不會在很長一段時間內保持靜態+有效。
與Basic和Digest不同,@LieRyan HMAC不是標準的HTTP身份驗證機制之一。您是否在談論[由AWS實施的](https://docs.aws.amazon.com/en_us/AmazonS3/latest/dev/RESTAuthentication.html#ConstructingTheAuthenticationHeader)?
@LieRyan:除非TLS有缺陷,否則重播和代理/ CDN方案都無法使用TLS。
Nemo
2012-07-15 08:27:07 UTC
view on stackexchange narkive permalink

嘗試這樣思考:當您使用SSL登錄任何網站時,您很有可能通過HTTPS以純文本格式傳遞密碼(例如GMail)。

唯一的區別Basic-Auth所做的是用戶名/密碼在請求標頭中傳遞,而不是在請求正文中傳遞(GET / POST)。

因此,使用basic-auth + https比通過HTTPS進行基於表單的身份驗證更安全或更安全。

這兩種情況之間略有不同:使用http基本身份驗證,每次請求都會發送密碼,而使用基於表單的登錄名,密碼只會發送一次,然後使用會話cookie之類的方式。這“非常輕微”地減小了攻擊面。
用戶密碼僅發送一次,但auth cookie也會在每個請求中發送,因此問題僅是發送用戶名和密碼,而不是cookie auth
@deFreitas,因此您具有OAuth的前提:使用另一個令牌進行身份驗證,而不是一直發送u / p。
我認為有一點點不同:在POST形式的示例中,必須在用戶決定輸入憑據並將其POST(安全地)之前通過HTTPS發送初始頁面呈現。使用HTTP基本身份驗證,即使服務器拒絕服務非HTTPS請求並重定向到HTTPS,憑據也已經不安全地通過了網絡,因此對於MiTM偵聽非常有用。客戶端必須決定最初啟動POST HTTPS或冒不安全通道的風險。對於POST形式,這種可能性較小。
@PepijnSchmitz我會注意到,會話密鑰(可以失效)的區別與竊取登錄憑據的區別大不相同。當另一方擁有您的私用會話密鑰時,仍然可以造成損害,但是它的性質要受限制得多,尤其是因為您可以在API執行完畢後使應用程序退出以使密鑰無效。
goodguys_activate
2010-12-06 11:49:54 UTC
view on stackexchange narkive permalink

基於HTTPS的基本Auth很好,但是並不完全安全。與 Fiddler用於SSL調試的工作方式類似,公司的HTTPS代理管理Web瀏覽器與代理之間的連接(其IP地址出現在Web服務器日誌中)。在這種情況下,HTTPS密碼將被解密,然後在公司代理中重新加密。

取決於誰在管理代理以及如何使用其日誌,從您的角度來看,這可能是可接受的,也可能是壞事。

有關如何進行SSL攔截的更多信息,請參見以下鏈接

當SSL代理攔截SSL連接時,它將向客戶端瀏覽器提供模擬的服務器證書。客戶端瀏覽器向最終用戶發出安全彈出窗口,因為該瀏覽器不信任ProxySG使用的發行者。如果SSL代理使用的頒發者證書作為客戶端瀏覽器的證書存儲區中的受信任根導入,則不會出現此彈出窗口。

ProxySG使所有配置的證書都可以通過其管理控制台下載。您可以要求最終用戶通過Internet Explorer或Firefox下載頒發者證書,並將其作為受信任的CA安裝在他們選擇的瀏覽器中。這樣就消除了模擬證書的證書彈出窗口...

一些公司通過將GMP部署(代理)根證書到每個工作站來解決上述證書彈出問題。儘管這只會影響使用Microsoft證書存儲的軟件。 Firefox等軟件需要進行不同的更新。

實際上,這取決於您正在談論的站點。例如。如果您下班時瀏覽到您的銀行,並且他們使用基本身份驗證,則在您的工作中不會被代理解密。 SSL正是通過這種方式。
這對我來說毫無意義-您在想什麼情況?如果瀏覽器使用實際的端點進行了設置,並且使用了良好的證書(或DNSSEC或其他適當方式)進行了正確的身份驗證,則代理無法看到https會話中的內容。
反對派選民應閱讀鏈接的文檔,因為這是一個鮮為人知的真實有效的觀點。文件:http://www.bluecoat.co.jp/downloads/manuals/SGOS_DG_4.2.x.pdf
是的,您是對的-BlueCoat確實看起來像公司惡意軟件,使用FUD來使業務不安全。
順便說一句-Chrome確實使用Windows證書存儲...
某種靈魂應該贊成這個答案,所以不再是(-1)這個答案包含真實的事實信息
@AViD,在某些情況下,公司代理實際上會通過提供自己的證書(由內部公司證書籤名,並作為所有公司工作站上的受信任根權限證書導入)來對SSL通信進行解密。我的公司針對包括Gmail在內的一些網站(但不適用於銀行網站)執行此操作。它可以工作,並且通常對用戶不可見,因為該公司還管理台式機/瀏覽器。請注意,嚴格的運輸安全(HSTS)可以克服這一問題……正是firefox HSTS警告使我首先意識到了這一點!
@MichaelLucas-是的,請參閱有關BlueCoat(該領域的流行惡意軟件,erm,軟件供應商)的先前評論。就像我暗示的那樣,這是一種反模式,有很多缺點(例如,用戶沒有任何有關無效或有問題的服務器證書的跡象……而且除了隱私問題之外)
-1
@Nappy可能是[HPKP](https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning)而不是HSTS的意思嗎?那肯定會打敗討厭的公司掃描儀。除了Wikipedia指出,大多數瀏覽器都禁用HPKP檢查,以專用於允許此類掃描程序使用私有根證書。那好吧...
如果公司對員工流量進行MITM攻擊,則它幾乎會擊敗所有形式的身份驗證,而不僅僅是基本身份驗證。因此,除非Web服務器願意使用更複雜的功能(如2要素身份驗證),否則Basic幾乎與任何其他形式的身份驗證一樣安全。
nealmcb
2012-07-14 07:04:17 UTC
view on stackexchange narkive permalink

您注意到需要對客戶端進行身份驗證,並詢問通過SSL的HTTP基本身份驗證的安全性。這就是SSL的設計目的,只要密碼是一個好的密碼,它就可以正常工作。如果您確實是為單個客戶端設置的,則可以通過選擇一個較長的隨機密碼來確保這一點,例如使用良好的隨機性源或本網站上討論的其他技術,可以輸入12個字符。在您所描述的情況下,如所引用的python ssl頁所述使用自簽名證書就可以了。

如果要進行自簽名,請確保傳達證書的SHA1和MD5指紋,以便他們可以在連接時驗證其合法性。或在可行的情況下提前分發。
使用HTTP基本認證還有另一個問題:完整的密碼通過SSL隧道發送。換句話說,密碼在提交之前不會被散列,因此有可能被捕獲(錯誤輸入應用程序代碼等)。這通常不是主要問題(對於您通過HTTPS提交的大多數密碼,甚至在網站登錄表單中,甚至在SSH密碼中,這都是正確的),但是值得一提。
@ChrisKuehl是否沒有強烈的理由反對在客戶端javascript中進行任何加密?那是你的建議嗎?在我看來,TLS除了支付簽署證書的費用外,幾乎和我所能得到的一樣好。
@StevenLu不是我所知道的或可以很快找到的,但是我會對閱讀有關該主題的任何內容感興趣。我看不到有任何辦法可以在將其發送到服務器端之前先對其進行哈希處理,這會降低安全性,即使服務器端在存儲之前進一步對其進行哈希處理也是如此。我很想使用[SSL / TLS身份驗證](http://goo.gl/xmzFI)代替(現代瀏覽器允許對使用密鑰身份驗證的網站進行雙向身份驗證),尤其是對於那些不應被查看的頁面由普通用戶使用。但是,這在很大程度上取決於您的用例,並且對於Python網絡服務器來說可能很困難。
TLS中的TLS呢,我認為將它包裝4次比包裝一次更安全。這樣,您可以將根密鑰散佈到不同的位置,因此,如果您使用4家公司來執行此操作,則它們(THEY)可能沒有秘密的根密鑰,也可能沒有。
看看:http://www.matasano.com/articles/javascript-cryptography/
@StevenLu有趣,但缺少要點; TLS身份驗證[在瀏覽器中實現](http://www.browserauth.net/tls-client-authentication)不涉及JavaScript。這是瀏覽器本身的功能。有一些問題使其不適用於面向用戶的身份驗證,但是對於開發人員/管理員而言,我認為可以為此做一個有力的證明。
@ChrisKuehl因此,我想我需要更深入地研究才能找到一種方法來設置服務器以進行完整的TLS客戶端身份驗證?
@StevenLu,您的設置對我來說聽起來不錯,但這完全取決於您想要多少安全性。只是拋出一個額外的想法:-)。
@ChrisKuehl TLS服務器身份驗證絕對可以滿足我的需求,當我發現設置它的簡單性時,我感到很驚訝。我現在想知道如何獲得完整的客戶端身份驗證。
Steve
2010-12-06 04:59:26 UTC
view on stackexchange narkive permalink

完全取決於其安全性。通過ssl進行的基本身份驗證仍將以純文本形式發送憑據,這意味著您只有一層保護。

您最好使用隨機數來哈希密碼,或者最好使用聲明模型將身份驗證傳遞給受信任的第三方。

Weber
2010-12-06 06:25:50 UTC
view on stackexchange narkive permalink

許多大型且受歡迎的網站都通過HTTPS使用基本(或其他基於表單的)身份驗證。它通常會引起安全意識敏銳的人們的“嘆息”。您可以在客戶端對哈希密碼進行哈希處理,而是發送哈希值嗎?

也就是說,在您承載登錄表單的登錄頁面也是HTTP / S的情況下,通常認為這是可以接受的。在使用RESTful API的情況下,您可能沒有登錄頁面,因此可以。如果可以的話,請使用 Watcher Skipfish等一些免費的安全工具來驗證您的應用程序。

只有帶有哈希的質詢響應才是安全性的升級,否則,攻擊者可以僅監聽哈希並在會話到期時仍然獲得訪問權限
Luc
2012-07-15 05:47:41 UTC
view on stackexchange narkive permalink

我在很多事情上都在使用它,只要您不忽略來自瀏覽器的TLS警告就可以了。

TLS在HTTP下工作,因此任何通過HTTP傳輸的數據將被加密。它將像提交任何密碼表一樣安全。

儘管建議不要使用自簽名證書,而建議使用讓我們的加密。它們提供免費證書,並且受到Microsoft,Mozilla等的信任,因此不會在瀏覽器中發出TLS警告。我認為最好使用此證書代替自簽名證書。如果您看到TLS錯誤,就知道它是真實的,而不僅僅是因為您的證書是自簽名的。

我絕對會做這樣的事情,特別是如果它是免費的。 “無效證書”錯誤非常明顯。
是的,StartSSL確實是一種自製的解決方案,但是它受到了大型團體的信任,因此,我想只要您不保護任何價值數百萬美元的東西就可以了。任何事情都比自簽名證書更好。使自簽名安全的方法是檢查指紋,但是您仍然可以在使用(例如)StartSSL時執行此操作。
我將安全內容託管在另一台服務器上,該服務器可以為證書設置目標域(由StartSSL頒發)。這是因為我沒有為使用靜態IP的VPS付費,而是使用No-IP服務來重定向到我的IP。我是否可以獲取密鑰/證書,使我可以從任何地方打開我的網站而不會顯示無效的證書錯誤?
因此,對我來說似乎很清楚,使用動態IP絕對無法建立適當的SSL證書。好的,我想我當時會遇到瀏覽器錯誤(除非我進行某種代理設置)。
更新:StartSSL已關門。下一個最佳選擇是“讓我們加密”。
@starbeamrainbowlabs謝謝!我更新了答案。
lightxx
2015-03-06 17:32:02 UTC
view on stackexchange narkive permalink

到目前為止(我想)還沒有提到的另一個論點是,許多智能手機等移動設備在通過瀏覽器中的HTTPS進行基本身份驗證時都不允許用戶檢查證書。這意味著與基於表單的身份驗證不同,您不能繞過基本身份驗證彈出窗口,該彈出窗口是大多數移動平台上的模式對話框,用於在輸入憑據之前檢查證書。當攻擊者使用有效證書時,這可能會帶來風險。

Daniel Szpisjak
2019-02-05 13:05:44 UTC
view on stackexchange narkive permalink

這裡有更多的歷史背景。就像其他人說的那樣,如果您可以有一些限制生活 b>,那麼基於TLS的基本身份驗證就可以很好地工作。

客戶端上使用,您可能需要處理會話管理,使用基本身份驗證很難

在後端上,基本身份驗證效果不錯,但完全依賴TLS 以確保機密性和完整性。它類似於基於令牌的身份驗證。如果您還需要其他聲音,請考慮使用簽名方案 TLS客戶端身份驗證



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