我照顧的是一個擁有大量“低等級”信息的系統,除了名稱/地址/電子郵件等之外,什麼都沒有。有人建議我們從當前的內部密碼加密算法提高安全性,以使用ICO建議的哈希/鹽。我做了一些閱讀,仍在努力尋找好處,我的觀點已經回到“專家”身上,他們提出了這個建議,但是他們不會(無法)回答我相當簡單的問題。
我缺少什麼?
我照顧的是一個擁有大量“低等級”信息的系統,除了名稱/地址/電子郵件等之外,什麼都沒有。有人建議我們從當前的內部密碼加密算法提高安全性,以使用ICO建議的哈希/鹽。我做了一些閱讀,仍在努力尋找好處,我的觀點已經回到“專家”身上,他們提出了這個建議,但是他們不會(無法)回答我相當簡單的問題。
我缺少什麼?
用戶經常在多個站點上使用相同的密碼。您的網站可能沒有任何財務數據,但是如果他們的銀行或在線商店使用相同的密碼怎麼辦?
您可能會說這不是您的問題,但這很普遍問題,這就是為什麼每當發生違規時,立即聲明之一就是“更改密碼,並在您使用相同密碼的任何其他網站上更改密碼”。
如果您的網站使用了某些內容像Bcrypt(實施中沒有缺陷-請參見Ashley Madison)一樣,攻擊者能夠確定所使用的密碼的機會更小,並且增加了用戶在其他地方更改密碼的時間。如果您只是將密碼存儲在數據庫中而沒有任何哈希,則攻擊者可能會徘徊於電子郵件地址和密碼並立即開始攻擊另一個站點。
電子郵件地址和密碼對也經常在攻擊者之間進行交易,形式為“組合列表”,這意味著即使原始攻擊者只對您的網站感興趣,他們也可以通過將數據出售給其他人而獲得一些利益。
為回應有關提到2路加密存儲的問題的評論而添加的內容。
2路加密方法的問題是要解密的信息必須存儲在系統中的某個位置。如果攻擊者獲得了對您數據庫的訪問權限,則很有可能他們也有權訪問您的加密密鑰。哈希不能以這種方式反轉-用於反轉哈希的在線工具可以有效地在預先計算的列表中查找哈希。
即使他們沒有加密密鑰,他們也可能確定密鑰是什麼-他們可以通過輸入系統密碼並查看結果來使用已知的明文攻擊。這可能不是一個快速的過程,但是如果您的數據中有任何高價值目標(名人,政客...),那可能是值得的。
另一方面,使用強而有規律的散列,唯一有力地找到原始密碼的方法是使用適當的散列來散列所有可能的輸入。使用Bcrypt之類的工具需要花費數年時間,儘管仍然可以相對較快地找到弱密碼。
很好的問題,很高興您提出了。我希望人們在Google上找到該線程,以便他們-不會犯許多其他公司所犯的錯誤。
您不應該只是 hash
密碼,則應 salt
,並確保您的哈希算法使用某種形式的 SlowEquals
。您不應該止步於此:您應該使用一種安全的散列算法,該算法可以大大地抵抗衝突
,例如bcrypt或scrypt。
我將以md5為例,因為它是眾所周知的。 請勿使用它,因為它很容易發生碰撞,而且速度很快,這意味著它更容易折斷。假設您只是在不加鹽的情況下哈希密碼。您幾乎每次都會產生一個靜態輸出。
例如,將“ myDarnPassword
”散列為md5時,最終將轉換為“ aca6716b8b6e7f0afa47e283053e08d9
”。此時,您可以發起字典攻擊並使用Rainbow表。您甚至可以生成一個數據庫,該數據庫將盡可能多的隨機字符轉換成易於搜索的數據庫,而無需費時的彩虹表查找。您可以隨著時間的流逝慢慢地創建它,以後再查找哈希。
您將創建一個如下表:
+ --------- ---------- + ---------------------------------- + |密碼| UNSALTED_HASH | + ------------------- + --------------------------- ------- + | myDarnPassword | aca6716b8b6e7f0afa47e283053e08d9 | + ------------------- + --------------------------- ------- + | pleaseDontSueMe11 | 0dd395d0ec612905bed27020fb29f8d3 | + ------------------- + --------------------------- ------- +
然後,您將像這樣從數據庫中進行選擇:
SELECT [password] FROM [table] WHERE [ unsalted_hash] ='aca6716b8b6e7f0afa47e283053e08d9'
它將返回 myDarnPassword
, plus 發生的任何衝突。
有了足夠的處理能力和時間,您就可以創建數万億個組合,並且很容易在很短的時間內破解大量密碼(由於數量龐大,我建議將數據庫拆分成多個密碼長度) )。但是,您將需要大量的硬盤空間。
在那一點上,您真正要做的就是查找它,而不會每次都在蠻力地浪費一切的處理能力。而且,如果您過去曾從數據庫中竊取過他人的密碼,則可以添加這些密碼,並將其轉換為哈希值。許多網站已經做到了這一點。
當網站驗證您的密碼時,他們會將密碼與存儲的哈希進行比較,如果該密碼與數據庫中的哈希匹配,則被視為有效密碼。然後,您可以允許用戶登錄。
對哈希值進行設置可以幫助抵禦此攻擊,但無法避免衝突。您可以將被入侵的哈希與生成衝突的哈希列表進行比較,然後在網站上輸入該密碼,即使您輸入的密碼錯誤:只要哈希驗證有效,您就可以被偽裝。
下面僅是一小部分示例,這些示例說明了仿冒者和其他惡意人員可以使用您未加密且未加鹽的純文本密碼。它不一定可以直接用於定位您,但是假設 Hacker
想要定位 Person A
。讓我們來推斷一下如何定位人員A
。
Hacker
。您的工作是黑客入侵網站並開發數據庫以匯總此信息。人員A
是一個有興趣的人。 Person A
出現在您的一個被黑客入侵的網站數據庫中。現在,您知道他們的電子郵件地址,以及他們用於該網站的密碼
。密碼
登錄其電子郵件地址
。親愛的,它起作用了! IMAP
或通過他們的Web郵件下載他們的所有電子郵件。此時,您會發現很多有趣的東西。他們正在與人員B
通信。 假裝像他們
,或查找其他信息。信息/活動可以包括:人員A
在網上發佈為 Mark Buffalo
。那是一個相對獨特的名字。然後,您可以搜索Mark Buffalo,並查找他發布的網站。也許他在其他網站上展現了更多個性? Mark Buffalo
在該網站上具有相同的密碼。也許您可以登錄該網站並查看他與他人的私人交流? Mark Buffalo
的身份,如果他在某些網站上共享個人信息
該怎麼辦?如果他在craigslist上發布以尋找男性或女性護送,並將他的電話號碼留在那裡,該怎麼辦?您已經找到了他的電話信息,因此可以找到一種方法來設置他並勒索他,以獲取金錢/信息/權力。除非您不包括電話號碼,否則這與給密碼加鹽沒有太大關係,但是由於您的洩漏,他們在另一個網站上找到了他們的電話號碼。這是可以針對您收集和使用信息的許多非常強大的方法之一。畢竟,這是一個 Information Security
論壇,因此我想使用此示例。 Facebook
帳戶(我沒有)。我們可以使用相同的密碼訪問嗎?如果Buffalo使用的是相同的密碼/電子郵件組合,則可能是這樣。您可能可以從您之前訪問的他的電子郵件中推斷出這一點,在那裡您發現了很多有趣的東西。現在,我們可以登錄並閱讀他的Facebook消息。現在我們知道他的家人是誰。然後,我們可以更輕鬆地協調勒索攻擊。人員B
,並假裝自己認識他。您已經閱讀了足夠多的電子郵件,因此可以模仿 Mark Buffalo
到看上去就像他一樣。您以一種使 Person B
毫無疑問的方式製作電子郵件的方式,現在您可以對 Person B
做同樣的事情,或更糟的是。 而這只是一小部分想法。別人的憑證有很多不同的用途。對您的密碼進行加鹽和哈希處理,使用抗衝突的哈希算法(例如bcrypt和scrypt)以及 prevent SQL注入攻擊。請不要把我變成尋求護送的褻瀆!保存Mark Buffalo!
(我知道有些網站可能會在您使用其他IP時阻止您訪問其服務的嘗試,但是有很多解決方法,並非所有網站都這樣做) 。
順便說一句,祝賀您被黑客入侵後可能會提起集體訴訟。
常見的違規類型是對用戶表的只讀訪問。這是因為此表用於執行不需要身份驗證的登錄的代碼。獲得密碼將允許對所有數據進行讀訪問。但是,即使攻擊者已經對數據庫具有完全讀訪問權限,他仍然可以通過密碼獲得寫訪問權限,能夠登錄帳戶並輕鬆更改某些數據。
添加和散列用戶密碼的一個非常簡單的原因是:
用戶密碼是他/她的秘密
沒有人應該知道。不是您,不是您的同事,也不是DBA。 沒人。就這麼簡單...
麻煩的一部分是使分析和竊取密碼以及在其他站點上使用其用戶名/電子郵件和密碼組合變得更加困難。
用戶在以下位置重複使用1或2個密碼是相當普遍的多個站點。強烈建議您將算法更改為繁瑣的算法,並花費更多時間(例如bcrypt,scrypt等),並且在大多數語言中都非常容易實現。
鹽的目的有兩個:首先,它為每個密碼引入一個獨特的(-ish)元素,因此,如果兩個用戶碰巧使用相同的密碼,則密碼的哈希文本將有所不同。如果用戶A看到她的密碼哈希為“ QWERTYU123”,並且用戶B的密碼哈希也為“ QUERTYU123”,則用戶A可以推斷出她具有與用戶B相同的密碼。
第二,它對於希望通過字典攻擊對密碼進行暴力破解的任何訪問數據庫的人,都會帶來巨大的提速。無需添加鹽,攻擊者可以簡單地對“ TRUSTNO1”進行哈希處理以獲得哈希值“ QUERTYU123”,然後掃描密碼列以查看該文本是否出現。攻擊者必須加鹽,才能為數據庫中的每一行重新散列“ TRUSTNO1”,以測試是否匹配,從而大大增加了檢查每個字典條目所需的CPU數量。
如果他們有權訪問數據庫,那麼他們實際上不需要密碼,因為他們可以直接從數據庫中竊取數據
密碼是很有價值的東西。那是因為很多人重複使用相同的密碼。因此,您鴿舍俱樂部的密碼可能與網上銀行使用的密碼相同。地址/電子郵件等。
這些也很有價值。我忘記了最近從“ eBay”或“ Apple”收到的聲稱我的帳戶受到限制的電子郵件數量,除非我“驗證”我的詳細信息。通常他們顯然是假的,因為他們沒有提到我的真實姓名。但是,如果您存儲名稱和電子郵件地址,則發出逼真的郵件會很容易,要求提供更多的個人信息。例如:
尊敬的哥譚市車站街42號的史密斯先生。
我們剛剛意識到我們俱樂部在本財政年度向您收取了超額費用,並希望向您退還10美元。請回复您的銀行詳細信息,以便我們將資金存入您的帳戶。
因此,請勿忽略電子郵件和姓名。
底部但是,我們的結論是,對現有數據庫進行哈希處理和添加鹽分大約只需一個小時的編碼和測試。然後,您可以將純文本密碼“批量轉換”為散列和加鹽的密碼。
加密用戶信息(例如姓名,電子郵件等)並存儲在數據庫中,而不是以原始格式存儲,為您的應用程序提供了更高級別的安全性。其次,有權訪問您的數據庫的人也無法輕鬆讀取數據。您存儲的,來自任何客戶的任何信息都是保密的。由於這些數據是他們的數據,因此開發人員有責任以某種方式存儲數據,從而使黑客難以理解其含義是低級信息還是最高機密信息。另外,解密和加密數據應該在服務器端進行,因為通常服務器都位於防火牆後面。因此從安全角度來看,它變得更加安全。
如果攻擊者也能夠訪問數據庫,我可以理解您的意思。不過,設計良好的安全系統只會讓數據庫存儲用戶和服務器已分別加密的信息。
通常,密碼是隱藏值的第一道密碼,您可以讓用戶提供該密碼的哈希值,可以對哈希值進行哈希處理以解密其數據,從而在數據庫的加密密鑰曾經存在時提供第二層安全性妥協。這樣,即使發生數據洩露,用戶的數據仍然是安全的。
在這種情況下,散列的要點是基於單向函數或陷門函數的思想:一種易於計算但難以逆轉的函數。用戶生成密碼時,系統將計算其哈希並將該值存儲在數據庫中。當用戶提交密碼以進入系統時,它將計算其哈希並將其與數據庫中的值進行比較。如果它們相同,那就太好了;如果不是,則密碼是錯誤的,應防止用戶訪問系統。為了使這項工作有效,散列需要兩個屬性:(1)將不同的原始值散列為不同的值; (2)從散列值到原始值在計算上很困難。
那麼,為什麼還要打亂散列呢?如果有人入侵您的數據庫(不僅僅是通過計算機黑客,而是通過社會工程學攻擊,在總線上留下打印輸出,不滿員工的行為等),他們得到的僅僅是一系列哈希值。很難從哈希值中恢復原始值,因此這對黑客不是很有用。如果明文密碼存儲在數據庫中,則如果數據庫受到威脅,黑客將獲勝;否則,黑客將獲勝。他可以直接訪問所有帳戶和密碼,並且基本上可以執行他想做的任何事情。此設置還意味著您無法訪問用戶的密碼。這是一件好事;即使您信任自己,您大概也不會信任-也不應該信任-銀行的對等人,工作的前任或繼任人等。您不必依賴大手筆。或管理員的心血來潮,以確保您的信息安全。
關於鹽,我在上面提到過,哈希必須具有兩個非平凡的屬性才能有效。 (我現在跳過了一些其他功能。)具有這些屬性的功能很難找到,而依靠站點的特定管理員來提出一個體面的功能是不明智的。取而代之的是,大多數人都使用廣泛可用的哈希。鹽的重點是確保不同的站點有效地使用不同的哈希值:我們不只是對'password'進行哈希處理,而是針對各種'salt'值使用'salt'+'password'。這意味著,如果某人在兩個站點上使用相同的密碼,則他們在兩個系統上實際上具有不同的哈希值,因此黑客無法使用一個來破解另一個。而且,如果沒有鹽,黑客就可以蠻力地將所有哈希值強加給合理長度的密碼。我在上面提到,哈希值必須很難逆轉。如果您有一個表,其中包含所有可能的密碼散列,例如最多10個字母(甚至只是最常用的密碼),則反轉散列很簡單;只需在桌子上查找即可。
除了其他答案外,請記住,在完全安全和完全訪問數據庫之間還存在許多漏洞。一個漏洞可能隻公開某些密碼,或者僅公開其前幾個字符,或者很難與特定用戶關聯等。散列和加鹽可以使較小的漏洞變成主要的漏洞。
此外,入侵者喜歡限制自己的接觸範圍。他們使用漏洞或後門進入系統的時間越長,就越有可能在完成目標之前被發現並鎖定。如果您保留密碼不變且未加鹽,則只是給他們提供了一種非常簡單的方式來冒充任何用戶身份回到系統,這是很難檢測和緩解的。
我認為最好的表達方式是:2015年,您的用戶委託給您的最私人和個人信息是他們的密碼和用戶ID。保護它,不是用生活而是無知,不是能力,而是無能。
如果您不知道他們的密碼,也無法恢復他們的密碼,那麼沒有人可以竊取它。
任何能勝任的數字小偷,只要在名稱和地址以及一千個電子郵件地址/用戶名和密碼之間進行選擇,每次都將花費較晚的時間。
>我了解成本和時間,但是從一開始就可以正確地做到這一點,實際上並不需要花費任何額外的時間,並且切換到更安全的方法並不是那個費時的。