題:
為什麼客戶端的密碼哈希很罕見?
Muis
2014-03-18 15:18:54 UTC
view on stackexchange narkive permalink

很少有網站在將用戶密碼提交到服務器之前對其進行哈希處理。 Java甚至不支持SHA或其他算法。

但是我可以想到很多優點,例如防止跨站點洩漏或SSL所不提供的惡意管理員。

>

為什麼這種做法在網站之間如此罕見?

您認為客戶端哈希密碼有什麼優勢?
-1
Javascript不再那麼慢了。現代的javascript引擎已經變得如此之快,以至於它們與已編譯的語言相提並論,最近的增加(如類型數組)為密碼學所需的數字運算提供了適當的工具。
@TimLamballais的一個優點是服務器永遠不會看到我的真實密碼,也不會洩漏它(是的,他們仍然可以洩漏哈希,但是應該對域名加以限制,因此對登錄其他站點沒有用)。但是,對於最大的優勢,請參閱我對Phillip的回答的評論。
許多人質疑這種做法是否會獲得額外的安全性。它所做的一件事就是降低風險。如果您始終進行哈希或加密(我見過使用公開密鑰對蒸汽/閥門進行加密,並且我敢打賭他們沒有解密),那麼您就不可能有尷尬的明文後門。不...它不再安全了,但並非毫無意義
WPA2-PSK使用客戶端的密碼哈希進行身份驗證。
十一 答案:
paj28
2016-11-29 15:39:09 UTC
view on stackexchange narkive permalink

JavaScript密碼哈希的發明人

早在1998年,我就建立了一個Wiki,這是我使用登錄系統建立的第一個網站。我無法負擔得起使用SSL託管的費用,但我擔心通過Internet傳輸的純文本密碼。我讀了有關CHAP(挑戰性哈希身份驗證協議)的書,並意識到我可以在JavaScript中實現它。我最終以獨立項目的形式發布了 JavaScript MD5,它已成為我開發的最受歡迎的開源軟件。 Wiki從未超越alpha。

與SSL相比,它有很多缺點:

  • 僅可防止被動竊聽。活動的MITM可以篡改JavaScript並禁用哈希。
  • 服務器端哈希成為等效的密碼。至少在通用實現中;可以避免這種情況。
  • 捕獲的哈希可能會被強行強制使用。從理論上講,使用JavaScript RSA可以避免這種情況。

我總是在前面就提到了這些限制。我曾經定期為他們發火。但是直到今天,我仍然堅持原來的原則:如果您出於某種原因未獲得SSL,那將比純文本密碼更好。在2000年代初期,許多大型提供商(最著名的是Yahoo!)都使用此軟件進行登錄。他們認為,即使僅用於登錄的SSL也會有太多開銷。我認為他們僅在2006年就登錄使用SSL,而在2011年Firesheep發佈時,大多數提供商都切換到了完全SSL。人們使用SSL代替。

客戶端哈希仍然有一些潛在的好處:

  • 某些軟件不知道是否將其與是否使用SSL,因此包含散列在某種意義上是有意義的。 vBulletin是這種情況的常見示例。
  • 服務器緩解-具有計算量大的哈希值,對於客戶端來說,做一些工作是有意義的。請參閱此問題
  • 惡意管理員或受感染的服務器-客戶端哈希可以阻止他們看到純文本密碼。通常將其忽略,因為他們可以修改JavaScript並禁用哈希。公平地說,這種行動會增加他們被發現的機會,因此對此有一些好處。您將在嘗試提高安全性時引入一個更嚴重的漏洞。對於需要比密碼更高的安全性的人,多因素身份驗證是一個更好的解決方案。

    因此,第二個簡短的答案是:因為多因素身份驗證比客戶端密碼哈希更安全

如果_服務器已被黑客破解,並且他想從客戶端收集普通密碼以在其他地方使用它們,該怎麼辦?沒有安全措施,只有客戶端哈希。為什麼我們必須強制客戶端信任服務器?
@КонстантинВан-請參考答案的“受損的服務器”部分
客戶端哈希的另一個缺點是您不能在服務器上實施密碼策略。基本上,您無法驗證用戶選擇的密碼是否足夠強
@Michael在我看來,這是一件好事,因為大多數服務器上的密碼策略都是荒謬的。無緣無故禁止使用許多密碼字符。
AJ Henderson
2014-03-18 18:36:31 UTC
view on stackexchange narkive permalink

要了解此問題,首先您必須了解為什麼我們對密碼進行哈希處理。完全有可能以純文本格式將密碼存儲在服務器上,並將發送的密碼與收到的密碼進行比較。只要在傳輸過程中保護密碼,這就是一種安全的身份驗證方法(共享機密)。

密碼被散列的原因是問題不在於身份驗證,而在於存儲。如果服務器遭到破壞,攻擊者將立即訪問所有用戶帳戶,因為他們現在知道用於驗證用戶身份的機密。

散列對此構成障礙。由於服務器不知道進行身份驗證所需的實際輸入,因此即使對數據庫的妥協也無法授予攻擊者訪問用戶帳戶的權限。他們仍然需要找出輸入,以提供達到應用程序檢查的哈希值。當然,他們可以將所有值更改為他們知道的值,但這會很快引起懷疑,並且系統將關閉並受到保護。

因此,客戶端哈希處理的問題在於,它會有效地使哈希的結果是密碼而不是密碼。沒有什麼可以阻止攻擊者繞過官方客戶端,而只是將完成的哈希直接發送到服務器。它在身份驗證期間不會提供任何額外的(或損失)安全性,但是在哈希旨在防止的情況下,它沒有任何作用,因為存儲在數據庫中的哈希實際上是傳輸到服務器的共享機密。

也就是說,客戶端哈希確實為您提供了兩個值得注意的東西。雖然它根本無法幫助保護您的系統,但可能可以幫助保護您的用戶。如果您不安全地傳輸密碼或在不破壞客戶端代碼的情況下破壞了傳輸,您仍然可以防止用戶密碼(他們的密碼可能會在其他站點上重複使用)。

另一種方法是,您可以提供哈希的其他迭代,以使對DB的脫機攻擊更加困難,而不必使用服務器週期(同時還可以延長“客戶端提交的中間密碼”的長度),但是您仍然需要足夠的服務器週期來保護加長密碼以防惡意客戶端。再次,此提供的主要保護措施是防止發現原始密碼,但無助於保護您站點的身份驗證機制。從服務器的角度來看,應將客戶端哈希視為用戶的直接密碼。 與用戶直接提供密碼相比,它在服務器上提供的安全性 或多或少都沒有,並且應該受到同樣的保護。為了能夠提供額外的安全級別,我建議使用兩個哈希。哈希一次客戶端以構建一個新的唯一密碼,然後將該密碼哈希到服務器上以使值存儲在數據庫中。這樣一來,您可以兼得兩全。發送給客戶端的代碼,這樣就不會執行初始哈希。但這根本不是SSL的有效替代方法,並且沒有提供足夠的額外優勢來彌補成本和復雜性。

我需要在客戶端加密一些數據,並且通過僅將哈希發送到服務器,可以證明服務器無法解密本地數據,因為它不知道純文本密碼。同樣,在用域名對哈希值加鹽時,有一個保證,即服務器永遠不會洩漏我的密碼,而只是加鹽(無用)的哈希值。
@Muis我的觀點是,加鹽的哈希並不是沒有用的。由於它是身份驗證的新密碼(即使不是用於加密的密碼),因此它可能會損害身份驗證系統的完整性。攻擊者仍然可以從服務器上的數據庫獲取哈希,並說服服務器他們是用戶,並訪問文件的加密副本(這是被授予的,無論如何他們都可以訪問)。此外,鹽應該是全球唯一的,而不是域名。
@Muis-我的意思僅僅是,在處理服務器端時,您應該將散列生成的客戶端視為用戶自己的密碼。使用客戶端的哈希值來保護用戶的密碼不被服務器暴露是不錯的選擇,但是就服務器而言,它實際上就像用戶的直接密碼一樣。
我主要擔心的是,洩露的密碼可用於登錄其他網站,客戶使用相同的用戶名/密碼組合。通過將域名添加到哈希中可以防止這種情況(因為我無法在javascript中永久存儲唯一值)。
@muis不需要保護鹽。將其存儲在服務器上,然後在散列之前將其發送給客戶端。如果不能為此信任服務器,則也許仍使用服務器提供的數據後附加的域名和用戶名。
為什麼不那麼簡單地同時做兩個呢?在客戶端進行哈希處理以避免洩漏實際的明文密碼,並在服務器端再次進行哈希處理以避免哈希成為密碼問題。
@xaser-可以,但是不會增加太多。這基本上是穆爾斯和我在評論中談論的內容。只有在中間有一個只能觀察的人(否則他們可以剝離客戶端哈希)並且只有在salt全局唯一(不能被彩虹列出)和密碼時才起作用,此命令才生效本身俱有足夠的安全性,可以抵抗被哈希餅乾強奸的情況。它不會保護站點本身,因為客戶端哈希是該站點的用戶密碼,並且只會保護共享密碼(無論如何都是無效的)。
客戶端和服務器端的哈希不能提供與使用SSL / TLS以明文形式傳輸密碼一樣有效的安全性。如果這些協議被破壞,是否甚至更不安全?此處不考慮長度,如果需要,可能需要復雜的密碼@AJHenderson
@uhfocuz號完全沒有,原因很多。主要問題是,出於登錄目的,客戶端哈希將是用戶的密碼,而不是用戶鍵入的任何密碼,因為服務器無法驗證客戶端的身份。此外,在沒有提供頁面內容的通道保護的情況下,中間的人可以簡單地完全剝離客戶端哈希並捕獲用戶密碼。最後,即使沒有這些問題,除非密碼所代表的熵程度與SSL中使用的密鑰相同,否則暴力破解哈希衝突將更加容易。
@AJHenderson如果“作為用戶密碼的哈希”提供了更安全的介質,並且在客戶端和服務器端使用了兩種完全獨立的哈希算法,該怎麼辦?只是為了安撫您,此處還使用了SSL。對於安全的客戶端哈希來說,這是否可以是動態的,同時還可以將哈希的性質安全地存儲在服務器端。
我的意思是@uhfocuz。它沒有提供更安全的媒體。兩種不同的哈希算法並不重要。我從來沒有說過您不能做客戶端哈希,只是說客戶端哈希的性質實際上並不能為您提供任何安全性。它僅保護在多個地方使用同一強密碼的用戶,避免將密碼發送到服務器。對於很多工作而言,這是一個非常有限的優勢,並且可能增加xss表面積。
@AJHenderson我仍然強烈反對您的主張,即這樣做將提供非常有限的優勢,它將使暴力破解時間翻倍,在我們的HTTPS協議已經被破壞的情況下,真實密碼永遠不會輕易洩露,而XSS,不,篡改,是的,但是該數據源自註冊,與使用篡改數據一樣有效
@uhfocus不會對額外的服務器端沒有的暴力破解時間產生任何影響,並且對實施它的站點完全沒有好處,因為客戶端哈希與身份驗證無關。如果ssl中斷,則係統不會提供任何優勢,因為它不會提供任何完整性檢查或服務器身份驗證。它提供的唯一優勢是我描述的優勢。如果它提供了您所描述的內容,那將會很棒,但事實並非如此。
如果您願意,我們可以繼續在[此處](http://chat.stackexchange.com/transcript/message/31963600#31963600)的聊天室中進行討論。
@AJHenderson我認為您不希望服務器將鹽發送給客戶端。如果數據庫遭到破壞,Salt有助於防止the彈槍方法,立即為許多用戶確定密碼。它無助於防禦針對單個用戶的攻擊。向嘗試使用該用戶名登錄的任何人公開洩漏用戶的食鹽會稍微降低他們的整體安全性。
@lordcheeto如何?沒有數據庫數據,就不可能進行離線攻擊。對於攻擊者來說,沒有哈希值的鹽值是零。這就是為什麼不將鹽視為安全數據的原因。數據庫必須知道它,如果攻擊者沒有數據庫(或至少沒有哈希),則它完全是無用的信息。如果客戶端本身受到威脅,則只需鍵入日誌即可。
“ *如果服務器遭到破壞,攻擊者將立即可以訪問所有用戶*”哇,真是個大驚喜!擁有服務器的人實際上可以訪問服務器上的內容!除了諷刺,我覺得這個答案並沒有突出正確的事情。當然,應該在服務器上進行快速哈希處理,但是如果不出於用戶保護的目的,為什麼還要用緩慢的哈希值和鹽值打擾呢?客戶端哈希具有[許多優點](https://security.stackexchange.com/a/201099/10863),我認為阻止登錄是一個很好的副作用,對於系統安全而言,這絕對不是必不可少的。
@Luc-並非所有違規都涉及全面控制。如果僅以只讀模式訪問用戶表,則將完全破壞所有用戶。如果散列是安全的服務器端,則每個用戶仍然需要付出相當大的努力,以便能夠進一步危害系統。可能只是脫機備份服務器受到威脅,或者開發筆記本電腦上的備份被盜。只期望全部或完全沒有違反是愚蠢的。可以略過繞過緩慢的客戶端哈希,因為可以跳過客戶端,而只需輸入服務器期望的結果即可。
@Luc-請注意,在處理應用程序時,我實際上同意您對另一個問題的回答。對於應用程序而言,繞過附加的哈希以直接跳到中間密碼至少要困難一點,因此有一定的價值,但是這個問題專門針對的是跳過中間密碼的網站。對網站進行的所有客戶端哈希處理都是使用密碼派生的密碼,而慢速哈希處理並不比快速客戶端哈希或密碼派生的密鑰有效。
@AJHenderson跳過中間密碼很簡單,您的意思是說,攻擊者只是修改服務器的代碼以阻止其將必要的JavaScript發送給客戶端,而是由客戶端提交密碼?在這種情況下,請參閱底部的FAQ,這是我經常看到的一種說法,我認為不足以抵消所有優勢。
@Luc-對於網站,您的常見問題解答有誤。註釋不是進行深入討論的好地方,但是,簡單來說,慢散列僅在哈希沒有受到破壞(因此數據庫也受到破壞)時才重要,而在服務器沒有受到破壞的情況下,只要是純文本形式,通道加密就位。關於瀏覽器擴展的觀點完全無關緊要,因為攻擊者不是在攻擊用戶的計算機,而是網絡層。實際上,入侵受限的機會非常高,尤其是在存在不錯的IDS時。
如果不應該寫入數據庫的內容開始寫入數據庫,將會引起注意,但是有許多可能的方式可以提取只讀哈希列表。這樣就可以開始更改帳戶,以更改系統中的內容或尋找其他服務上的匹配憑據。那是更現實的情況,客戶端哈希將無濟於事。它具有密碼擴展的價值,但這僅是真正的完成。
Cyker
2016-11-29 16:21:54 UTC
view on stackexchange narkive permalink

如果您有很多優點,則應在問題中列出它們,以便人們了解它們是否真正有用(如果這樣,您可能會出名;)

人們不會不建議使用客戶端哈希,因為它們具有更好的保護用戶私人信息的方法。讓我們考慮一下可能發生信息洩漏的地方,其中有三個:

  • 客戶端。
  • 客戶端和服務器之間。
  • 服務器。

然後讓我們看看為什麼客戶端哈希在這些地方有所幫助。

  • 客戶端。

    如果您自己的計算機上存在惡意軟件,例如,如果您的瀏覽器受到感染或您的計算機植入了密鑰記錄軟件,則客戶端哈希不會阻止黑客獲取您的密碼。原因很明顯。

  • 客戶端和服務器之間。

    客戶端和服務器之間存在通信通道。如果有一個竊聽者在監聽通信,則客戶端哈希可以使密碼洩漏更加困難,因為竊聽者必須從其哈希中恢復原始密碼。

    但是,此漏洞是基於不安全的通信渠道的前提。實際上,有些協議的存在試圖準確地解決這個問題。他們的主要任務是在不安全的通道上建立安全通道。最著名且部署最廣泛的示例是SSL / TLS,它比客戶端哈希提供更多的功能和更好的安全性。更好的工具。

  • 服務器。

    如果服務器被黑客攻陷,則用戶信息可能會在服務器上洩漏。如果用戶密碼以明文形式存儲,則黑客可以從數據庫中獲取用戶密碼。這就是為什麼今天大多數服務器不這樣做的原因。相反,他們存儲密碼的哈希值,以使黑客無法輕易地從其手頭的信息(即哈希值)中恢復原始密碼。在客戶端計算的哈希值。但這是嚴重錯誤的。在這種情況下,散列本身變成了密碼等效項。黑客可以通過簡單地移交哈希而不反轉哈希來通過身份驗證。黑客的目標不是反轉哈希,而是闖入您的帳戶。重要性在於服務器對客戶端數據的驗證過程,而不是數據是哈希值。因此,客戶端哈希的好處在這裡微不足道,服務器也必須重新哈希。

總而言之,客戶端哈希在以下方面很有幫助保護用戶信息,但該保護很大程度上適用於通信通道。由於我們在那裡有更好的方法(SSL / TLS),因此客戶端哈希的應用受到了極大的壓制。這根本不是解決當前任務的最佳工具。

回复:這句話:“黑客的目標不是反轉哈希,而是侵入您的帳戶。”我會說這取決於網站是什麼。通常,用戶密碼比訪問該站點更有價值,希望該口令可以在其他具有更大訪問價值的站點上使用。
-1
這個答案超級有幫助。
我同意TTT。我不同意客戶端以明文形式發送密碼(而不是添加鹽值哈希)是“更好的”(如您所說)。這帶來了一些服務器端代理由於惡意或過失而竊取或洩漏客戶端密碼的風險。由於許多用戶都在重複使用密碼,這是一個非常令人擔憂的風險。
因此,您的答案摘要是“因為我看到的只是一點優勢”?不是因為僅在服務器上執行快速哈希處理而在客戶端上執行慢速哈希處理有任何缺點嗎?我在[此答案](https://security.stackexchange.com/a/201099/10863)中詳細介紹了該主題,並很想听聽您的想法。
@Luc的想法是服務器使用客戶端傳遞的任何內容作為身份證明,無論是否為哈希。服務器只是將其視為純字符串,並且服務器必須執行自己的工作以保護該字符串不被惡意程序恢復。如果客戶端認為需要保護其密碼不受惡意服務器或易受攻擊的通信通道的侵害,則可以免費這樣做。但這不是Web服務器的工作。例如,客戶端可以為每個站點使用隨機密碼,並且不需要哈希。
@Cyker是的,如果每個人都將使用具有唯一,隨機密碼的密碼管理器,我們將不必進行討論!但是事實並非如此,我們都知道網站被黑客入侵的頻率以及數據是用來黑客攻擊其他網站上的用戶的,他們在這些網站上重新使用了密碼。保護用戶確實不是您的工作,但在非洲修復水也不是您的工作。仍然,有能力負擔的國家支付發展援助(在民主國家,人們集體對此表示同意)。我們會盡力幫助其他人,因此,如果我們只能在更好的地方進行哈希處理,為什麼不呢?
@Luc對於“更好的散列”:是什麼讓您認為,如果通道是安全的,則客戶端散列比服務器散列更好?如果使用的是純HTTP,則應改用HTTPS,而不要依靠自己的客戶端哈希。
@Cyker參見我之前發布的鏈接:https://security.stackexchange.com/a/201099/10863客戶端哈希具有許多優勢,所有這些都假定傳輸通道是安全的(您剛剛提醒我,忘了提及傳輸渠道受損的情況!)。順便說一句,完全同意https比客戶端哈希更重要。如果您沒有https,那麼還有更大的問題。
@Luc好吧,如果您認為客戶端哈希對您的特定用例有用,那麼您可以自由地實現它。假設您使用的是合理的哈希算法,那麼我只會浪費客戶端計算機上的某些資源,否則看不到它的危害。例如,如果您認為客戶端計算機比服務器計算機更安全,因為有些討厭的員工在服務器端攔截了用戶數據。在這種情況下,請不要忘記給哈希加鹽。
@Cyker鹽醃,是的,謝謝您提醒我添加。人們確實不應該忘記這樣做。
Mayhem Software
2015-05-05 12:36:57 UTC
view on stackexchange narkive permalink

優良作法是先在客戶端進行哈希處理,然後對密碼加鹽並在服務器端再次進行哈希處理。這是針對中間攻擊中人的額外防護層。 SSL是第一層,但是Snowden的啟示明確表明SSL可以相對容易地被NSA等組織破壞。

這個答案沒有提供其他答案不能提供的任何東西,並且錯過了指向MitM的要點,可以使用客戶端的密碼哈希,就好像密碼本身一樣。
@Mark Um沒有標記。這確實有助於mitm。 Mayhem表示將再次哈希哈希密碼。
這是我沒想到的好主意。在客戶端進行哈希處理以隱藏純文本密碼,然後在服務器端進行哈希處理以防止服務器違規。感謝分享!
@Karl,“中間人”仍將提供與目標用戶相同的請求參數。僅僅因為它不是密碼,並不意味著攻擊者無法攔截哈希並將該哈希提供給服務器(讓它“哈希”並成功進行匹配)。
@RedGlobe但這是事實。但這確實有幫助,因為大量的互聯網用戶對所有內容使用相同的密碼。我同意這可能不利於該特定係統,但是它將在更大範圍內有所幫助。
Philipp
2014-03-18 17:12:43 UTC
view on stackexchange narkive permalink

客戶端密碼散列有什麼優勢?

那麼,密碼不會以明文形式通過網絡發送。但是登錄時確實應該使用TLS加密,所以密碼監聽應該不是問題。

另一個原因可能是您不希望服務器永遠注意用戶密碼,即使是一微秒也要知道。這意味著您在註冊時為服務器提供了密碼哈希,然後使用該密碼哈希登錄。不幸的是,這並不能解決任何問題:登錄帳戶的共享機密現在是哈希,而不是密碼。當您了解哈希值後,就可以在不知道實際密碼的情況下登錄(因為服務器也不知道該密碼)。

對我來說,這樣做的好處是,我可以使用用戶的密碼來加密我的應用程序中的某些本地數據,並證明服務器永遠無法解密該數據(因為它僅知道哈希值)。否則,我將有兩個提示最終用戶輸入兩個不同的密碼(1個用於登錄,1個用於加密)。
-1
@Muis,對“證明”的定義必須很弱,因為由於字典攻擊非常成功,所以通常哈希的知識等同於密碼的知識。我確實明白你的意思。可以證明用戶是否選擇了正確的密碼。
@mikeazo我會對哈希值加鹽,因此字典攻擊毫無用處。
@Muis這不是鹽醃的工作原理。鹽只能防止預先計算的彩虹表,而不能防止字典攻擊。
@Philipp, salt確實可以防禦字典攻擊,在這種攻擊中,攻擊者只希望從捕獲的哈希中選擇一個即可。它無助於針對單個散列的字典攻擊。
在這種情況下,@muis使用受密碼保護的私有對稱密鑰。由於對稱密鑰的較高熵,這通常將為加密數據提供更好的安全性,同時還確保服務器不具有解密能力(因為它不具有私鑰)。不要自己動手...使用已建立的已知安全模式。
@Muis使用用戶密碼加密本地數據可能不如您想像的那樣好。如果用戶更改密碼會怎樣?另外,如果服務器具有使用用戶密碼對其進行加密的數據,則該服務器不需要解密該數據,它已經擁有該數據,因此您無法證明服務器無法訪問該數據(這是解密的重點)
-1很短視的答案。當然,您傳輸到服務器的內容等同於密碼。總是這樣。但是,它可以更好地保護用戶在傳輸之前對它進行哈希處理(TLS有很多問題),尤其是在到達服務器之前(通常會發生真正的漏洞)。
Sky
2014-03-18 18:56:40 UTC
view on stackexchange narkive permalink

由於您正在談論Web應用程序...

在數據庫中,我們有一個表調用dbo.useracc,我們正在存儲這些哈希密碼

 用戶密碼- ------- ---------- user1 5f4dcc3b5aa765d61d8327deb882cf99user2 202cb962ac59075b964b07152d234b70user3 098f6bcd4621d373cade4e832627b4f6  

和我們在Web應用程序中的登錄功能類似

 如果(用戶== $用戶名和密碼== $通行證){return auth.token}  

比方說,攻擊者成功入侵並竊取了數據庫並保存了dbo.useracc數據。現在,他有了我們的哈希密碼。

如果您的登錄哈希過程存儲在客戶端中,攻擊者仍然可以通過使用HTTP POST方法更改密碼字段來發送,從而使用哈希密碼訪問您的帳戶。您的哈希密碼,他仍然可以登錄。請記住,您的應用程序數據最終會在經過哈希檢查後通過POST方法與服務器進行通信。

但是,如果哈希過程在服務器中,那又是另一回事了。

  $ pass = md5.hash($ pass); if(user == $ user和password == $ pass){return auth.token;}  

如果黑客使用哈希密碼登錄,則將使用哈希密碼來檢查哈希密碼。

在這種情況下,假設攻擊者發布

$ user = user1 $ pass = 5f4dcc3b5aa765d61d8327deb882cf99

在服務器端執行$ pass = md5.hash(5f4dcc3b5aa765d61d8327deb882cf99 ),它將返回“ 696d29e0940a4957748fe3fc9efd22a3”,這將返回錯誤的語句。

這是為了防止攻擊者成功竊取數據庫數據,並嘗試使用哈希密碼通過Web應用程序進行訪問。當然,如果攻擊者通過字典攻擊成功地對暴力破解/破解了哈希,那麼攻擊者仍然可以入侵這些帳戶。但是,如果密碼在破壞系統後是一個好的密碼,則黑客需要更長的時間,並且服務器管理員可以重置密碼並通過電子郵件向用戶發送電子郵件。企業。在企業中,將有數據庫管理員和開發人員。他們是不同的角色。現在,為了防止員工用戶訪問敏感數據,他們需要同時訪問應用程序和數據庫才能訪問數據。當然,您可能會爭辯說,DBA仍然可以通過數據庫本身來更改數據庫數據,但是開發人員無法訪問它,並且更容易確定攻擊的來源。這是關於訪問控制權,並最大程度地降低風險和威脅。

您是正確的,它不會使攻擊者更難使用被盜的哈希值進入我的網站,但由於另一個站點很可能不使用完全相同的salt +哈希算法,因此很難登錄到另一個站點。
只要ANOTHER網站不在客戶端中進行哈希運算,攻擊者就無法使用哈希密碼訪問ANOTHER網站,而且這是一個很好的密碼,很難通過字典或Rainbow Table攻擊強行使用。作為開發人員,您為什麼首先還要關心“ ANOTHER”網站。如果用戶非常重視其他數據,則應練習不要使用全局密碼。
Steven Coco
2018-01-21 13:15:54 UTC
view on stackexchange narkive permalink

正如@Cyker指出的那樣,儘管該主題有一些具體的洩漏點,但這裡的討論還是有點輕快……我想補充一點我沒有提到的問題。

如果您盡快對哈希進行哈希處理,就可以減少意外將明文密碼傳遞到不應傳遞的地方的編程風險。我們已經採取了安全字符串和安全數組之類的措施,試圖盡快銷毀明文。在獲得密碼的那一刻,散列是另一種類似的措施……隨著代碼的演變等,風險似乎仍在降低。

我只是寫了一個小小的C#“ Box”, SecureString清除文本並立即對其進行哈希處理---這樣,我只知道它永遠不會被記錄或傳遞給我不希望的庫。這與協議無關,它只是程序員坐在這裡看著密碼而已---我不想碰它! (在某些方面,它仍然是等效的密碼,但至少立即被愚蠢地掩蓋了,就像在鏈接的方法調用中移動右括號並將明文傳遞到錯誤的位置一樣。而且仍然沒有隱藏安全數組。) >

DeepS1X
2017-05-08 07:36:50 UTC
view on stackexchange narkive permalink

我打算以權衡明確的目的加入客戶端哈希機制。讓我們看看這對我們有何好處:

客戶端:無改進。

在傳輸中:如果SSLstrip最終以明文形式傳輸密碼,則保護密碼。但是,如果實施了HSTS,那麼大多數人會說SSLStrip將不起作用。是嗎?否。

在進入服務器時:最後,我們看到了最大的好處。如果有人破壞了服務器怎麼辦?如果他們只是啟動Wireshark / TCPDump並導出服務器的私鑰,他們將獲得連續的明文密碼流。現在,他們可以坐在網絡上幾個月,而對於高容量的服務器(每月有數百萬的用戶註冊),他們將遇到大量的純文本漏洞。當然,這是假定為服務人員獲取密碼比在他們的服務器上擁有RCE更有價值。

在服務器上:無需運行就可以提高性能對每個傳入的密碼進行bcrypt加密,這將在客戶端上分擔一些計算成本,而不會引入任何新的漏洞。對於服務器管理員和硬件成本來說,這似乎是一件好事。

看起來,最佳實踐似乎是將密碼哈希合併到客戶端,除非它為用戶創建了難以忍受的頁面加載時間用戶。

我很想知道為什麼有人不贊成這個答案。SSLStrip有點過時了,但沒有錯,其餘答案對我來說似乎很準確。
我當然不知道重讀幾年前的評論,我在推理中看不出任何明顯的缺陷。
BeloumiX
2019-01-10 14:19:25 UTC
view on stackexchange narkive permalink

我同意,如果可以使用SSL / TLS,則限制客戶端哈希處理以保護身份驗證過程的優勢。但是,如果攻擊者可以訪問存儲的哈希(此過程之後),則SSL / TLS不能解決針對定制硬件攻擊的漏洞。諸如簡單的鹽漬哈希之類的功能或諸如PBKDF2之類的功能由於對內存的需求低而非常容易受到這些攻擊。受這些方案保護的密碼破解既便宜又快速。至少這是密碼哈希處理的主要問題之一。通過使用密碼散列方案(例如Scrypt,Argon2或Catena)來保護自定義硬件攻擊,服務器的硬件要求急劇增加。因此,實際上,服務會降低內存硬度或切換到易受攻擊的方案。客戶端哈希可以幫助解決該問題。當客戶端計算這些昂貴的(內存硬性)功能時,服務可以使用它們而無需更好的硬件。

因此,現代密碼哈希方案可以委派最昂貴的(內存硬性)部分該功能的客戶端。此功能稱為服務器救濟,由Argon2和Catena提供。

結論:使用現代的密碼散列方案(該漏洞不太容易受到自定義硬件攻擊),將來會增加或至少應該增加客戶端散列的使用,當然還有SSL / TLS

savvy
2016-11-29 14:29:35 UTC
view on stackexchange narkive permalink

我認為客戶端哈希具有一個弊端和一個缺點:

pro:在dns /網絡釣魚/任何情況下,您都隱藏密碼,這對用戶很有用,因為大多數人會重用密碼在幾個服務上。正如其他開發人員所說,這對您自己的安全無濟於事。

cons:您的服務器未獲取密碼,從而避免了諸如警告用戶密碼強度的問題。我知道有人會說這可以/應該是客戶端,但是當您有多個客戶端時,集中服務器端會很好。

(我沒有拒絕投票,如果人們可以解釋一下反對票會很好。)密碼建議實際上應該在客戶端進行。我會推薦像[zxcvbn](https://github.com/dropbox/zxcvbn)之類的庫,該庫可以使用許多不同的語言,並且看起來非常面向目標並且設計合理。這也將限制將建議單獨納入所有客戶代碼中的限制。
Li Billy
2014-03-18 15:42:11 UTC
view on stackexchange narkive permalink

我認為客戶端被黑客入侵的可能性比服務器端更高。 (因為有一些IT專家照顧服務器)。如果您的計算機已經被黑客入侵。用來散列密碼的客戶端算法也可以被黑客竊取。盡快,您的算法不再是秘密。我認為,它變得毫無用處。

我們通常不願使用秘密算法(請參閱[Kerckhoffs原理](http://en.wikipedia.org/wiki/Kerckhoffs's_principle))和“安全性模糊不清”。密碼哈希當然不需要依賴於此。我們應用了一個密鑰,並希望即使攻擊者設法竊取數據庫也不會找到攻擊者。
在這種情況下,“服務器更安全”的說法毫無意義。 1)客戶端知道明文密碼,因此特洛伊木馬可以使用鍵盤記錄程序輕鬆竊取它。 2)當服務器被黑客入侵並且數據庫被盜時,密碼散列僅比純文本密碼更具優勢。
丹科,CodesinChaos。您免費為我提供了有用的課程。
另外,請原諒,我發現您的Twitter內容翔實。請問我是否關注您?
Twitter的工作方式是,您關注那些您發現其推文有趣的人。無需徵求許可。
謝謝。
具有所有用戶數據的服務器是比單個用戶更具價值的目標。


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