每個人都知道,如果他們有一個需要密碼才能登錄的系統,他們應該存儲所需密碼的散列&鹽醃副本,而不是純文本密碼。
今天想知道為什麼他們不也將用戶ID也存儲在類似的哈希&鹽醃密碼中?攻擊者必須先“破解”密碼和用戶名哈希,然後才能破壞該帳戶。這也意味著,如果對用戶名進行哈希處理並添加鹽分的電子郵件地址,則可以更好地保護用戶名,避免將其出售給SPAMmers。
每個人都知道,如果他們有一個需要密碼才能登錄的系統,他們應該存儲所需密碼的散列&鹽醃副本,而不是純文本密碼。
今天想知道為什麼他們不也將用戶ID也存儲在類似的哈希&鹽醃密碼中?攻擊者必須先“破解”密碼和用戶名哈希,然後才能破壞該帳戶。這也意味著,如果對用戶名進行哈希處理並添加鹽分的電子郵件地址,則可以更好地保護用戶名,避免將其出售給SPAMmers。
儘管Terry的說法是正確的,但有時登錄系統實際上會對用戶名進行哈希處理(但不添加鹽)。他們讓您選擇一個登錄名和一個顯示名。登錄名以散列方式存儲(不加鹽,因為您需要能夠查找它),並且密碼已加鹽。顯示名稱與您的登錄名不同(因為它也應保密),並顯示在需要的地方。
即使攻擊者看到您的姓名,他也將無法將其附加到您的登錄名上名稱。雖然我說可以加鹽,但實際上沒有必要。最重要的部分只是保持秘密。如果數據庫遭到破壞,攻擊者如果想對您的其他帳戶發起新的攻擊,將仍然可以使用您的電子郵件地址或名稱之類的東西。
通常,用戶名不被認為是安全的,它們是身份,不是身份驗證。最好不要透露哪些用戶名有效,但是如果碰巧發生衝突,情況會更糟。您仍然可以通過查看所有匹配的用戶名來查找匹配的密碼哈希來解決此問題,但這有點混亂。用戶名的數量對攻擊者幾乎沒有實際價值。這樣做的主要好處是網絡釣魚,但是如果您的官方來往信件中包含任何信息,則該信息將不會被散列,並且如果他們仍然損害了您的數據庫,他們會得到該信息。
此外,諸如特里說。如果他們可以看到用戶名,則查找您的帳戶要容易得多。在大多數情況下,嘗試保護標識符來證明其合理性並不能帶來足夠的收穫。
儘管其他人都很好地指出了優點(如果有的話)很少,但我對您的主張沒有任何缺點表示懷疑。如果僅存儲散列的用戶名,則搜索用戶名很容易。如果您存儲了一個鹽化的,散列的用戶名,那麼搜索就會變得有些麻煩。
讓我們假設,如果我們構建一些包含用戶名和(散列)密碼的SQL表,並告訴SQL Server索引用戶名列,它將執行某種二進制搜索或其他某種魔術。我們可能有一個如下表:
用戶名|密碼測試| j9lnvqjAuhNJs
(這是老式的unix crypt(3)哈希,僅是為了簡潔起見。)
如果您將用戶名存儲為純文本格式,請檢索(用戶密碼是一個簡單的SQL調用。假設您要驗證輸入用戶名 test
的用戶的憑據:
從用戶名中選擇密碼,其中username ='test`;
足夠簡單。現在,如果我們以與密碼相同的格式存儲用戶名,則表的最終外觀如下:
Username |密碼M1CAtvzDdJDGU | j9lnvqjAuhNJs
現在,當用戶輸入其用戶名 test
時,如何驗證密碼?二進制搜索在這裡是無用的,因為您甚至都不知道用來存儲用戶名的鹽。取而代之的是,您需要遍歷數據庫中的每個用戶名,對給定的用戶名使用鹽對該用戶名進行 crypt
加密,然後將其與存儲的(散列的)用戶名進行比較以查看其是否匹配。 ch!
假設您已採取一些預防措施,並使用了像 bcrypt
這樣的慢速散列代替了舊的Unix crypt?如您所料,
存儲鹹的哈希用戶名而不是純文本存在一些嚴重的缺點。
如果您對用戶名進行哈希處理和加鹽處理,系統將如何知道新帳戶具有唯一的用戶名,而無需遍歷所有現有記錄並使用每個現有的鹽對新用戶名進行哈希處理?
您的想法高尚,問題很有趣。現在,我相信您在提出問題或時根本沒有想到可用性,或者您錯過了哈希的要點(或者也許您只是拼寫錯誤的“加密”)。
散列是不可逆的,除非您擁有超級計算機來強行使用東西或使用彩虹表嘗試搜索散列。因此,如果您要散列用於登錄的用戶名/電子郵件,則可用性會下降。但是,如果要使用程序中預定義的密鑰(用於檢查用戶名的密鑰)本身對其進行“加密”,則可能有點安全。但是,再一次-直接存儲在程序中的加密密鑰與根本沒有密鑰一樣好。這些是未對用戶名進行哈希或加密的主要原因。
我認為最可能的原因是對用戶名和密碼進行散列實際上並沒有提供任何額外的保護。
我們鼓勵用戶創建困難而復雜的密碼,使其難以破解。只需使用基本詞典,即可在幾分鐘內破解任何哈希的用戶名數據庫……除非您要求用戶名至少包含6個字母數字字符;)
此想法與兩種策略保持一致:1)默默無聞的安全性; 2)額外緩解計時攻擊(如果使用計時安全比較功能)。您不能使用獨特的鹽有效地執行此操作,但這是一個好主意。這樣一來,就可以將保存登錄信息的表與保存“人”信息的表分開。然後有兩個表,人員(可以保存純文本電子郵件地址)和用戶(可以保存哈希的用戶名{sitewide salted}和哈希的唯一鹽密碼)。通過散列的用戶名查找用戶不是問題。
我認為這是個好主意。如Anthony Rutledge所言;這可以通過模糊/模糊處理來提供安全性,並且如果使用密鑰派生功能(例如PBKDF2),我想,潛在的攻擊者試圖破壞被盜數據庫的難度會增加幾個數量級。
例如,儘管我如上所述在方法中對用戶名撒鹽,事實上,對失竊的數據庫進行的離線蠻力攻擊仍需要查找用戶名和密碼的哈希衝突。
這意味著攻擊者將需要統領您的計算機,並識別和理解您的源代碼,因為鹽在數據庫中不會存在。它增加了多層附加防禦,而沒有增加Web應用程序的計算負載(如果有的話)。
關於散列問題:用戶名可以與專有服務器端一起使用散列,基於實際的用戶名/電子郵件。
這意味著鹽是已知的,儘管是通過編程實現的。相對於Web服務,計算和返回鹽的腳本可以以帶外方式駐留在計算機上-這樣,從任何面向Web的入口點都無法訪問生成鹽的任何方法。 >