表示巴哈姆特的伺服器供應商有資料外流的風險
為了避免大家的恐慌,以及協助了解自身帳號的安全情況
所以小妹我就來這裡解釋一下一般大型網站的密碼儲存原理
首先來講講最白癡的做法:
假設今天小妹我的帳號是 johnny860726,密碼是 12345678
於是網站直接在資料庫裡面登錄:["johnny860726", "12345678"]
好了!會認為網站都這樣儲存密碼的人,應該沒有資訊相關背景
小妹我以前一直認為大部分的網站都是這樣儲存密碼的
後來才知道,有點程度的網站並不是這麼一回事
因為只要被駭客找到漏洞,他們可以利用語法上面的錯誤
進而取得權限,把整個資料庫的內容通通都載下來
這樣他就能知道所有使用者的帳號跟密碼了,整個網站直接爆炸
時至今日,仍有部分的網站採取這樣的做法
經過時代的演變,後端工程師(就是搞伺服器那邊的)發展出新的模式:
當使用者註冊帳號的時候,在密碼欄輸入 12345678 並送出,進行 MD5 的運算
MD5("12345678") = 25d55ad283aa400af464c76d713c07ad
接下來網站就在資料庫裡面儲存:["johnny860726", "25d5(下略)"]
這樣等到下次再登入,假設我輸入 12345679
MD5("12345679") = defac44447b57f152d14f30cea7a73cb
伺服器端就比對這個字串的 MD5 值和資料庫裡面儲存的是不是一樣
比對之後就知道這個密碼「並不是」註冊時填入的密碼,所以登入錯誤
這麼做就能同時達到「連站方工程師都不知道你密碼」和「站方可以知道你密碼對不對」兩件事
既然連站方都無法知道你密碼,就更不用說剛拿到資料庫心裡很興奮的駭客了
不過有些人不知道 MD5 是什麼,因此我們還是要解釋一下它的作用
這個 MD5 是一個「函式」(函數),它的運算方法是公開、大家都知道的
能把一個任意長度的字串轉換成「固定長度的字串」
這個字串通常是 32 位數,每一位都是 0123456789abcdef 的組合
而 MD5 函式是經過特別設計、經過大量樣本測試的
所以當初設計的科學家認為,它不容易被找出規律,也不容易產生碰撞
(所謂的碰撞就是「兩筆資料不同,但它們的 MD5 碼相同」的情況)
所以它可以把大量的資料縮減成短短的 16 bytes
讓大家只要看這 16 bytes 的內容就知道兩筆資料是不是一樣了
因此,這類的函式又被稱為「訊息摘要」、「雜湊函式」
而使用這函式的運算過程又被稱為 hash
這個就跟你用 BT 下載東西的時候看到種子檔的 hash 是一樣的道理
是為了方便讓你來辨認載下來的檔案是不是跟原本一樣,有微微防駭的作用
當然,所謂「道高一尺,魔高一丈」
MD5 本身並不是真的能 100% 防止駭客
有的駭客會老早就把 MD5 的一些運算結果記起來
譬如他們先記下 "12345678" <=> 25d55ad283aa400af464c76d713c07ad
這樣他們哪天只要能偷到別人的資料庫內容
並且遇到有人密碼的 MD5 值為 25d5(下略) 的時候
就知道可以用 "12345678" 這組密碼登入該帳號了
駭客也會利用大量的電腦把 1~N 位數字串的 MD5 值算出來
形成大筆的對應資料,以備不時之需
因此,後端工程師也會利用 SSL 加密,使得封包傳送過程都保持加密的狀態
然後把所有可能會讓資料庫內容外洩的漏洞補起來
這樣子,就可以預防更多的駭客(絕對不是 100% 預防!)取得資料
再更複雜的做法是「站方先把密碼原文混入一段字串,才做 hash」
譬如站方先把 12345678 混入 GaMeR0AfApLe
變成 1G2a3M4e5R607A8fApLe 以後再 MD5,才存入資料庫
這樣子駭客就要算到天荒地老才有機會找到同樣 MD5 的字串了
這個過程稱為「加鹽」,而這個 GaMeR0AfApLe 就被稱為 salt(鹽)
如果還嫌不夠,再更死守的做法就是:
將原文加鹽後 hash 過再加一次鹽才存入資料庫
譬如 8496a74bed7e92aa78e799b622d85a61 混入它們自訂的內容 1af3feec
變成 8496a174bed7aef92aa738ef799b6ee22d8c5a61
等到要用的時候才把這個 salt 拿掉(反正只有站方工程師知道加鹽的規則)
這樣駭客看了就會黑人問號了
※ 20 位大小寫英數字串有 7 × 10^35 種組合
也就是至少 704,423,426,000,000,000,000,000,000,000,000,000 種組合
光是儲存這麼多組合的密碼 MD5 出來的 hash 值
也需要 6.4 × 10^23 TB 的儲存空間才放得下
當然因為 MD5 本身的某些問題
現在很多網站都採用更多複雜、安全的演算法,所以上述的 MD5 只是方便舉例
所以在這種情況下,判斷自己巴哈帳號安全有以下準則:
* 伺服器的資料不是外流?
(e.g. 最近公告的伺服器資料部分「可能」外流事件)
* 密碼長度是不是很短?
(e.g. 密碼長度越長,駭客就要花更久的時間才能「算」出你 MD5 碼的值)
* 密碼內容是不是很簡單?
(e.g. zxc12345678 之類的這種垃圾密碼就別用了)
* 登入的環境是否安全?
(e.g. 有些安全措施做得很差的網咖,會被裝能側錄鍵盤的木馬程式)
* 登入的地點是否正確?
(e.g. 釣魚網站會偽裝得好像真的一樣,騙你輸入帳號密碼)
像小妹我本身就用摻有 大寫英文 + 小寫英文 + 數字 + 特殊符號 的將近 20 位密碼組合
就算跟人明講我有幾位,也幾乎攻不破,可謂資安界的典範 ![]()
如果把
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789
~!@#$%^&*()_+=-[]{}\"':;?/<>,.
這裡面的所有字做 20 位的密碼組合
這樣就有 1.8 × 10^39 種組合
比單純「大寫英文 + 小寫英文 + 數字」的 20 位密碼還要安全兩千多倍
所以我會建議在密碼裡面摻入特殊符號
相較之下,固定八位數的「小寫英文 + 數字」密碼
就只有 2.8 × 10^12 種組合了(可見「強密碼」跟「弱密碼」差別多大)
倘若你密碼只有八位小寫英數組合的情況下
然後很不幸地,後端工程師和伺服器業者又同時耍二,不加鹽兼搞外洩
那你的帳號就會暴露在風險中了(這樣都已經很危險了,更甭說那些密碼設 123456 的人了)
不過呢,基本上巴哈姆特工程師不會出這麼大的包,該有的措施還是都會做
而且巴哈伺服的供應商 Cloudflare 也說「帳號密碼相關外洩率小於 330 萬分之一」
即使你是那 330 萬分之一的人,也可以好好放心
當然如果你的密碼位數很少的話
我還是會建議你弄個超級複雜的密碼,這是長久之計,任何網站都一樣
我也是最近才弄個長得像 3e$8e54bFjS#2Xkdzv 的東西來當密碼
然後把各大網站的密碼都改得像這樣一樣複雜
這種類型的密碼可以說是靠杯難記,但是卻靠杯安全
就算你直接在別人面前打密碼,他們也盜不了你的帳號
因為他們大概興奮完就忘記你當時打了什麼密碼了(除非他是雨人)
初期為了怕睡一覺就忘掉,我還特地先抄下來收好
等到確定自己每次都可以不用思考就打出密碼的時候,才把抄下來的紙銷毀
因為多用幾次,腦袋就會自動記起來了,所以不用擔心以後登入都要想半天
不過呢,如果你想要效仿小妹我用這種很複雜的隨機字串當密碼
得要注意有些網站(例如以前的 Pixiv)密碼不能有特殊符號
我的解決辦法是只要遇到 # 就改成 3、遇到 @ 就改成 2,以此類推
然後遇到 { 或 ? 這種沒有對應數字的就一律以 z 之類的文字替代
所以剛剛的那組範例密碼就會被設為 3e48e54bFjS32Xkdzv
這樣就不需要因為該網站的規定而害你要多記一組密碼了
以上是小妹我預防駭客盜帳號的全套攻略
因為這陣子有人來信詢問巴哈的資安問題,所以特此說明
希望大家會喜歡這篇文章