題:
為什麼人們在存儲用戶名之前不對它們進行散列和加鹽處理
Grezzo
2012-12-13 17:48:03 UTC
view on stackexchange narkive permalink

每個人都知道,如果他們有一個需要密碼才能登錄的系統,他們應該存儲所需密碼的散列&鹽醃副本,而不是純文本密碼。

今天想知道為什麼他們不也將用戶ID也存儲在類似的哈希&鹽醃密碼中?攻擊者必須先“破解”密碼和用戶名哈希,然後才能破壞該帳戶。這也意味著,如果對用戶名進行哈希處理並添加鹽分的電子郵件地址,則可以更好地保護用戶名,避免將其出售給SPAMmers。

因為您可能需要儲存鹽?當您忘記用戶名和/或密碼時,會發生可怕的後果,該怎麼辦。有一個原因沒有完成。
用戶名不用於身份驗證,僅用於標識。考慮到任何一種安全協議對待它們都會帶來麻煩-識別*不需要*保密的內容和識別*不需要*一樣重要。明確區分很重要。
“每個人都知道,如果他們的系統需要輸入密碼,他們應該存儲所需密碼的散列和加鹽副本,而不是純文本密碼。” *不*,***他們不***。對於安全新手來說,這些都不是顯而易見的。甚至加密和散列之間的區別也超出了某些人無法理解的範圍。
@zzzzBov好,也許我的意思是“每個了解安全性的人”
@lynks,但是如果數據庫被盜用時,他們沒有獲得用戶的所有電子郵件地址,那不是很好。他們不僅可以將這些地址作為垃圾郵件,還可以針對特定站點的網絡釣魚攻擊將它們作為目標。
-1
一秒鐘我以為這是個好主意,但是哪個公司不需要向用戶發送電子郵件?
通常,在將數據存儲到數據庫時,不會對數據進行哈希處理和添加鹽分。僅在需要時(例如保護密碼)才進行哈希處理。哈希用戶名的需求是什麼?換句話說,您的問題的前提是錯誤的……您假設應該有一個不對用戶名進行哈希處理的原因,而默認情況下,不對數據進行哈希處理。
原因可能是進一步阻止定時攻擊嗎?由於用戶名通常是通過字符串比較完成的,因此從理論上講,人們也可以阻止人們猜測(以微秒為單位)用戶名(通常是電子郵件地址)嗎?例如,如果某人想破解每個10,000,000個密碼的電子郵件地址用戶名,那麼在PHP中使用類似password_verfify()的名稱作為用戶名可能會使失敗的返回時間更加不穩定,從而更難分析?人們仍然想通過電子郵件發送其社區信息,但這並不意味著電子郵件地址必須在...
...用於登錄的表。
但是,每個用戶名應有一個唯一的鹽...
基本上,我看到大多數人對此想法持懷疑態度的原因是“因為這不是過去的方式。此外,這是建立在過去基礎上的原因和假設。”登錄需要付出一定的代價,而無論您的觀點如何,該技術平均在計算上都更加昂貴。
衝突是可能的,但就何時存儲散列的用戶名而言,不可能提供良好的編程邏輯。
許多站點(例如stackexchange)都以評論和帖子之類的方式向公眾顯示用戶名。那麼散列用戶名有什麼意義呢?
九 答案:
user10211
2012-12-13 17:49:37 UTC
view on stackexchange narkive permalink

您看到那裡顯示用戶名的地方嗎?如果現在對用戶名進行散列存儲,他們就不能這樣做嗎?

一個詞,就是可用性。

蛇在這一個里很強;)
歡迎使用21840c1a3e3db69e01445c8782a99f9b。
但是,如果您有一個登錄名和一個顯示名,他們可以像在facebook和許多其他服務中一樣進行操作。實際上,我們不使用電子郵件地址登錄以進行堆棧交換,但是會顯示暱稱
@Thomas,是的,您了解我。
@Thomas好一個!
其實可以。成功登錄後,將未隱藏的用戶名存儲在會話中。
...但是,如果用戶名的安全性成為問題,則您不希望以明文形式將其從客戶端傳輸到服務器。重複哈希是一天中的事情;在客戶端對它進行哈希處理,然後將其發送到再次進行哈希處理的服務器。現在,其餘的用戶信息,包括用戶名或顯示名稱的副本,可以根據客戶端傳遞的全部或部分哈希值,用PBKDF加密;那麼您只需在驗證密碼後將其解密,然後將顯示名稱放入會話中即可供網頁使用。
我不認為用戶名不能僅在客戶端顯示。
@KeithS對於某種本來就不是秘密的事物來說,這似乎不是太複雜了嗎?
可以假定,如果用戶名是電子郵件地址,則轉儲數據庫將為某人提供一長串有效電子郵件地址。因此,在這種情況下,用戶名是敏感的。
-1
@TobiasKienzler代替了新聞通訊的“推送”系統(站點運營商或內容生產商鼓勵交付),他們可以使用更多的“拉動”機制,用戶可以訂閱“提要”,無論是RSSish還是其他格式/機制。
@JustinC確實會更好。只是希望那些“內容”製作人同意...
對於那些好奇的人,`echo -n“ gotcha” | md5` 21840c1a3e3db69e01445c8782a99f9b`
這是另一個詞。想像力。
這個答案顯然是不正確的,因為沒有規則要求顯示名稱和用戶名必須與我之前指出的相同。請停止投票。
Lucas Kauffman
2012-12-13 18:33:25 UTC
view on stackexchange narkive permalink

儘管Terry的說法是正確的,但有時登錄系統實際上會對用戶名進行哈希處理(但不添加鹽)。他們讓您選擇一個登錄名和一個顯示名。登錄名以散列方式存儲(不加鹽,因為您需要能夠查找它),並且密碼已加鹽。顯示名稱與您的登錄名不同(因為它也應保密),並顯示在需要的地方。

即使攻擊者看到您的姓名,他也將無法將其附加到您的登錄名上名稱。雖然我說可以加鹽,但實際上沒有必要。最重要的部分只是保持秘密。如果數據庫遭到破壞,攻擊者如果想對您的其他帳戶發起新的攻擊,將仍然可以使用您的電子郵件地址或名稱之類的東西。

是的,我已經看到了。實際上,這實際上是一種模糊機制,因為如果密碼被強烈地散列,則根本不需要。
@Polynomial不一定是必需的,但是如果登錄名類似於電子郵件地址,那麼如果要轉儲數據庫,這可能是嘗試隱藏用戶電子郵件地址的好方法,不是嗎?
不錯,如果您不打算將任何電子郵件發送給用戶,也可以對電子郵件進行哈希處理。我猜仍然可以通過電子郵件重置密碼。
@LucasKauffman我想這很不錯,它可以幫助向您的用戶發送電子郵件。那當然意味著在存儲之前無法對其進行哈希處理!
我認為這個答案及其評論對我來說是最好的。謝謝。
“日誌記錄名稱以散列方式存儲(不添加鹽,因為您需要能夠查找它)”您將如何查找它?彩虹桌?還是我錯過了什麼?
存儲散列的用戶名,當有人登錄時,對用戶名進行散列,並在數據庫中查找以找到相應密碼的散列。
如果用戶名是經過哈希處理的(根據定義),則無法查找。您只能測試數據庫中是否存在提供的用戶名/密碼(包括散列,加鹽或不加鹽),並且是否相互關聯。您唯一可以查詢的是顯示名稱。
@MarioAwad你錯了,我很敬佩。
@LucasKauffman您認為我的哪部分評論是錯誤的?請詳細說明,也許我們都會在這裡學到新東西。謝謝。
您可以在數據庫中查找用戶名,即使該用戶名是經過哈希處理的。一旦用戶介紹了他的用戶名,您就可以對其進行哈希處理。對其進行哈希處理後,您可以在數據庫中查找它。如果要使用鹽,則將不可能,因為您首先需要查找鹽,而由於需要查找的哈希已包含鹽,因此將不可能。
看起來我們都是說同樣的事情,但使用不同的術語。當我說查找時,我的意思是獲取用戶名並顯示它,而只是檢查它是否正確提供。乾杯。
這對我來說沒有多大意義。這意味著基本上將用戶名用作“密碼擴展名”。請改用更強的密碼,並避免混淆字段。
-1
散列用戶名可防止對登錄系統進行枚舉。基本上,大多數前端暴力攻擊如果沒有有效的用戶名開始都會失敗,因此使用站點範圍的鹽對其進行哈希處理意味著對數據庫的成功攻擊不會枚舉您的用戶帳戶。一個人需要破解您的應用程序的文件系統,以使您的工作變得更加困難。如果您不對用戶名進行哈希處理,則枚舉攻擊可能會伴隨著前端檢查,以檢查針對這些用戶名的弱密碼。
AJ Henderson
2012-12-13 20:15:05 UTC
view on stackexchange narkive permalink

通常,用戶名不被認為是安全的,它們是身份,不是身份驗證。最好不要透露哪些用戶名有效,但是如果碰巧發生衝突,情況會更糟。您仍然可以通過查看所有匹配的用戶名來查找匹配的密碼哈希來解決此問題,但這有點混亂。用戶名的數量對攻擊者幾乎沒有實際價值。這樣做的主要好處是網絡釣魚,但是如果您的官方來往信件中包含任何信息,則該信息將不會被散列,並且如果他們仍然損害了您的數據庫,他們會得到該信息。

此外,諸如特里說。如果他們可以看到用戶名,則查找您的帳戶要容易得多。在大多數情況下,嘗試保護標識符來證明其合理性並不能帶來足夠的收穫。

通過密碼查找存在一個問題-如果密碼相同,該怎麼辦(也-如何重置)?如果您禁止這種情況,那麼您可以有效地披露密碼。
@MaciejPiechotka-是的,如果發生兩次碰撞,這也是一個問題,儘管兩次碰撞的機會非常小。另外,如果您確實避免了兩次沖突,那麼您就不會透露它所對應的用戶名,因此您仍然很難利用這些信息,但這仍然是一個有效的觀察,它可以告訴您他們認為某些用戶具有可以使用其密碼解析的密碼,但是攻擊者設法擊中這種情況的機會非常小(從密碼學角度而言是安全的)。
FWIW如果發生衝突,則在嘗試註冊時,第二個用戶將收到“該用戶名已存在”消息。
-1
Edward Thomson
2012-12-13 22:30:30 UTC
view on stackexchange narkive permalink

儘管其他人都很好地指出了優點(如果有的話)很少,但我對您的主張沒有任何缺點表示懷疑。如果僅存儲散列的用戶名,則搜索用戶名很容易。如果您存儲了一個鹽化的,散列的用戶名,那麼搜索就會變得有些麻煩。

讓我們假設,如果我們構建一些包含用戶名和(散列)密碼的SQL表,並告訴SQL Server索引用戶名列,它將執行某種二進制搜索或其他某種魔術。我們可能有一個如下表:

 用戶名|密碼測試| j9lnvqjAuhNJs  

(這是老式的unix crypt(3)哈希,僅是為了簡潔起見。)

如果您將用戶名存儲為純文本格式,請檢索(用戶密碼是一個簡單的SQL調用。假設您要驗證輸入用戶名 test 的用戶的憑據:

 從用戶名中選擇密碼,其中username ='test`;  

足夠簡單。現在,如果我們以與密碼相同的格式存儲用戶名,則表的最終外觀如下:

  Username |密碼M1CAtvzDdJDGU | j9lnvqjAuhNJs  

現在,當用戶輸入其用戶名 test 時,如何驗證密碼?二進制搜索在這裡是無用的,因為您甚至都不知道用來存儲用戶名的鹽。取而代之的是,您需要遍歷數據庫中的每個用戶名,對給定的用戶名使用鹽對該用戶名進行 crypt 加密,然後將其與存儲的(散列的)用戶名進行比較以查看其是否匹配。 ch!

假設您已採取一些預防措施,並使用了像 bcrypt 這樣的慢速散列代替了舊的Unix crypt?如您所料,

存儲鹹的哈希用戶名而不是純文本存在一些嚴重的缺點。

但是,如果您不加鹽,或者對用戶名使用站點範圍加鹽,則可以使用相同的select命令,但是除了搜索純文本用戶名,還可以搜索其哈希值。還是我錯過了什麼?
如果在整個站點範圍內使用鹽,則可能根本不加鹽。 http://crypto.stackexchange.com/questions/1855/passwords-with-same-salt-what-does-this-mean
這不是真的。的確,使用特定地點的鹽,他們可以使用蠻力同時攻擊所有哈希,但是如果沒有鹽,攻擊者可以使用無鹽的彩虹表,這將省去更少的精力。畢竟,安全性不是要花太多精力進行攻擊,不是真的要使它變得不可能嗎?
如果您假設我的電子郵件地址存在於某個未鹽化的bcrypt彩虹表中,那麼是的,您是對的。
我想這是一個公平的觀點。我懷疑我的電子郵件地址是否在任何彩虹表中,因為它包含許多字符。我想這對包括您在內的大多數人都是正確的。話雖如此,必須有成千上萬個[a-zA-z0-9] {8} @hotmail.com的電子郵件地址。不需要大彩虹桌,儘管我不知道(也不確定)是否有人造過這樣的彩虹桌
我很喜歡這個帖子。我希望更多的人會談論散列用戶名的威脅。如果不使用定時攻擊安全的比較方法,則對用戶名進行散列將獲得零和。
SilverlightFox
2012-12-14 15:15:48 UTC
view on stackexchange narkive permalink

如果您對用戶名進行哈希處理和加鹽處理,系統將如何知道新帳戶具有唯一的用戶名,而無需遍歷所有現有記錄並使用每個現有的鹽對新用戶名進行哈希處理?

也許通過使用全站點範圍的鹽(或胡椒,我認為這是眾所周知的)
Vaibhav Kaushal
2012-12-13 23:19:15 UTC
view on stackexchange narkive permalink

您的想法高尚,問題很有趣。現在,我相信您在提出問題時根本沒有想到可用性,或者您錯過了哈希的要點(或者也許您只是拼寫錯誤的“加密”)。

散列是不可逆的,除非您擁有超級計算機來強行使用東西或使用彩虹表嘗試搜索散列。因此,如果您要散列用於登錄的用戶名/電子郵件,則可用性會下降。但是,如果要使用程序中預定義的密鑰(用於檢查用戶名的密鑰)本身對其進行“加密”,則可能有點安全。但是,再一次-直接存儲在程序中的加密密鑰與根本沒有密鑰一樣好。這些是未對用戶名進行哈希或加密的主要原因。

我絕對是要對它進行哈希處理,而不是對其進行加密。如果我們也有一個顯示的名稱,那有沒有犧牲可用性?
@Grezzo-如果您將顯示名稱分開存儲,那麼大多數人將使其顯示名稱與他們的用戶名非常相似。如果生成他們的用戶名,則會降低可用性。
讓我們[繼續聊天中的討論](http://chat.stackexchange.com/rooms/52884/discussion-between-aj-henderson-and-anthony-rutledge)。
devel
2012-12-14 04:38:00 UTC
view on stackexchange narkive permalink

我認為最可能的原因是對用戶名和密碼進行散列實際上並沒有提供任何額外的保護。

我們鼓勵用戶創建困難而復雜的密碼,使其難以破解。只需使用基本詞典,即可在幾分鐘內破解任何哈希的用戶名數據庫……除非您要求用戶名至少包含6個字母數字字符;)

它會提供很少的額外保護,但不能提供太多保護。儘管它會使用戶名模糊不清,但它可能會帶來好處,因為用戶名很可能是可用於定向網絡釣魚攻擊的電子郵件地址。
Anthony Rutledge
2017-02-01 19:37:22 UTC
view on stackexchange narkive permalink

此想法與兩種策略保持一致:1)默默無聞的安全性; 2)額外緩解計時攻擊(如果使用計時安全比較功能)。您不能使用獨特的鹽有效地執行此操作,但這是一個好主意。這樣一來,就可以將保存登錄信息的表與保存“人”信息的表分開。然後有兩個表,人員(可以保存純文本電子郵件地址)和用戶(可以保存哈希的用戶名{sitewide salted}和哈希的唯一鹽密碼)。通過散列的用戶名查找用戶不是問題。

James
2018-08-12 21:22:11 UTC
view on stackexchange narkive permalink

我認為這是個好主意。如Anthony Rutledge所言;這可以通過模糊/模糊處理來提供安全性,並且如果使用密鑰派生功能(例如PBKDF2),我想,潛在的攻擊者試圖破壞被盜數據庫的難度會增加幾個數量級。

例如,儘管我如上所述在方法中對用戶名撒鹽,事實上,對失竊的數據庫進行的離線蠻力攻擊仍需要查找用戶名和密碼的哈希衝突。

這意味著攻擊者將需要統領您的計算機,並識別和理解您的源代碼,因為鹽在數據庫中不會存在。它增加了多層附加防禦,而沒有增加Web應用程序的計算負載(如果有的話)。

關於散列問題:用戶名可以與專有服務器端一起使用散列,基於實際的用戶名/電子郵件。

這意味著鹽是已知的,儘管是通過編程實現的。相對於Web服務,計算和返回鹽的腳本可以以帶外方式駐留在計算機上-這樣,從任何面向Web的入口點都無法訪問生成鹽的任何方法。 >



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