為什麼我的帳號會被盜?淺談密碼安全及實體金鑰

還在不同網站使用相同的密碼嗎?你的密碼是常見的組合或幾個英文數字湊合嗎?在資訊科技的進步的現在,不論年紀大小、身份,幾乎人人都有數個甚至上百的帳號密碼。網路上層出不窮的帳號被駭客攻擊、個資洩漏事件,就算是 Google、Amazon、Facebook 等大型企業也都無可避免,那麼這時候如何靠自己保護好帳號安全就顯得非常重要了。

我想這如果是方面的專家應該也不會看這篇文XD,所以會盡量用簡單易懂的方式說明。如果沒興趣知道背後的原理,只想知道如何保護帳號的朋友們可以直接跳到結論:如何保護好自己的帳號安全?

在知道如何保護自己前,當然要先來瞭解密碼這玩意到底是如何運作的。

我的密碼是怎麽被儲存的?

大部分人可能會認為帳號被駭就是單純有某個厲害的駭客在一片黑底畫面上打了一堆指令,然後擊破了資料庫拿到了你的帳號密碼。實際上流程確實大概是如此,不過有時候不是駭客技術高超,而是你所使用的服務公司並沒有做好基本的密碼儲存。

為了方便理解,首先可以先把資料庫想像是一個有保全守著的倉庫,帳號密碼等資料就存放在裡面。

明文儲存

明文儲存是最爛的一種方式,顧名思義就是直接把密碼原封不動的放進資料庫中如下表:

ID 帳號 密碼
0 account1 123456
1 account2 abc1234

這種方法儲存的密碼,只要攻擊者拿到資料庫的讀取權限就完蛋了(可能透過系統、程式漏洞等方式)。這意味著只要躲過保全衝進房間,密碼跟帳號就一覽無遺 (´゚д゚`) 非常不安全。

然而現在仍有不少網站還是使用這種方式處理,最簡單的判別方式就是按下忘記密碼,他們會直接發送你的完整密碼到信箱而不是要求重設定,代表儲存方式是明文儲存,正常情況就算是管理資料庫的工程師也不可能會知道密碼的明文是什麼(下面會提到為何),所以這樣儲存密碼是非常非常非常危險的。

加密/Hash

把密碼加密或 Hash(雜湊)處理過會比較安全,意思是密碼會先放進一個函式處理,將密碼變成一串跟原本完全不同的英數字,而且只要改動密碼中任一個文字都會讓結果完全不同。登入帳號時,系統也是將你輸入的密碼經過同樣 Hash 處理後,跟資料庫裡面的數值比對是不是一樣即可。

ID 帳號 密碼(MD5 Hash)
0 account1 E10ADC3949BA59ABBE56E057F20F883E
1 account2 A141C47927929BC2D1FB6D336A256DF4

這種方法比起方法比起明文儲存好了些,因為攻擊者就算得到了資料庫也只能看到 Hash 過後的值。但是這種方式也不是沒有缺點,如果有兩個帳號使用了相同的密碼,那麼他們的 Hash 結果就會相同,這時可以靠其他資料猜測或彩虹表(Rainbow Table 一種整理出來的常見密碼 Hash 值表)輕易的找出密碼的原文。

簡單來說,相當於密碼寫在紙上後,會用先一把對應的鑰匙鎖起來,但是如果有相同的密碼會被放到同樣的保險箱中(原文值相等所以 Hash 值也相等),在資料庫中可以看到這兩個相同密碼是被放在一起的,這樣只要保險箱被破解,其他放在同樣的密碼也就跟著全遭殃了。

補充:Hash 處理過後是不可逆的,相當於這把鑰匙只能把它鎖起來不能解開,而加密的鑰匙是能夠加/解密的(依照不同加密方式可以視同一把鑰匙或不同把鑰匙)

Hash + Salting (加鹽)

Salting 加鹽是在上述 Hash 前,在密碼後面加上一串隨機產生的字符(像是隨機撒些鹽巴的感覺),然後再進行 Hash ,這樣即使是相同密碼,Hash 出來也是完全不同的結果,增加攻擊者破譯出密碼的難度。

ID 帳號 密碼+鹽(MD5 Hash)
0 account1 01A682CCB070DFE296DF4BBAD02950C8
1 account2 B9BAA63E43E35D93366C4401EFFCC631

這種方法解決了上述同樣的密碼被放在一起的問題,大幅增加攻擊者攻擊的難度,但是使用的密碼過於簡單常見還是很容易被破解的,方法會在下方如何攻擊提到。

此處使用MD5僅為示範用,實際應該選擇安全性較高的 Hash 演算法。

駭客是怎麽盜取我的密碼的?

我們可能都看過朋友的帳號被盜用、或是某某知名人物的私人資訊檔案被流出,甚至自己曾經也是受害者。想知道如何保護好自己的話,當然得先瞭解一下所謂「駭客」是怎麽拿到你的帳號密碼的囉!(輸入密碼被看到、密碼借朋友不小心外流等比較物理性的方式就不另外討論)

這邊我們不討論明文儲存的密碼,畢竟那只要有系統漏洞就完蛋了。

以下攻擊皆假設在密碼有經過 Hash 的方式處理下,攻擊者拿到了帳號密碼的資料庫,要取得密碼的方式就是透過運算能力很強的電腦,把一串密碼經過 Hash 過後跟資料庫比對,如果相等就代表找到密碼原文了。

暴力破解

暴力破解是最簡單無腦的方法,實際應用比例不高。電腦會把各種密碼組合都 Hash 後去比對。

今天一個資料庫被攻擊者拿到了,可以放到電腦中將各種密碼組合都 Hash 過後進行比對,如果一樣的就可以記錄下來,表示這組密碼的 Hash 值是多少,這種方式越短(8字元以內)、全是小寫、英數字簡單的排列等不複雜的密碼最容易被破解出來,若是用 MD5、SHA-1 等比較老舊的 Hash 函式甚至幾秒內就能輕鬆破解。

字典攻擊

雖然上述的暴力破解,要是用了長密碼就會指數性增加破解的難度(需要嘗試的排列組合太多種),但是要對付長密碼現在最常見的方式其實是用字典攻擊。

假設今天我用了一個密碼 “password1”,有九個字元。雖然這時暴力破解會變的非常困難,但是卻是一個超多人都會用的密碼 根據此報告使用率排名第九,字典攻擊就是用在這種地方。所謂字典通常是大部分常見被破解的密碼 Hash 值的記錄表,裡面有大量常用密碼的對應資料,可以直接比對資料庫拿到的密碼 Hash 值得到密碼原文,在現實資料庫做破解效率上會比暴力破解高很多。

常用密碼的數量其實非常龐大,被洩漏的密碼可能幾億上到幾十億,像是一些有規律的 “password1234”、”password12341234” 等通常都被重複使用過,一些粗話或有意義的英文單字都非常容易被字典收錄,或是在單字或名字後面加日期等,雖然長度夠但反而是更容易被破解(還有那種用注音對照英文打出來的,只要有人用過一樣不安全)。另外 “Pa$$w0rd” 之類把幾個字改成相似符號的也很常見,絕對不是替換掉幾個特殊符號換個大小寫就代表密碼沒問題。

怎麼樣的密碼是弱密碼?

根據上面兩種攻擊方式,我們可總結出哪些密碼是太弱容易被破解的:

  1. 長度太短(8以內)
  2. 純數字
  3. 全小寫/大寫
  4. 有意義的文字(包含其中幾個字替換符號、尾端加數字生日等)
  5. 常用的注音文密碼(例如:au4a83)

如何保護好自己的帳號安全?

我們不一定能保證存放帳號資料庫資料不外流,但是可以做以下幾件事情來保護自己的帳號安全,讓攻擊者就算拿到資料庫也無法輕易得知密碼:

用一個不容易被破解的密碼

建議可以選四個以上平時較少使用單字或名詞排列,雖然是有字面意義的但是長度夠長的話基本上可以免去暴力破解、也不容易跟別人的密碼相同,就比較不容易被字典收錄。想要更進一步加強的話可以隨機在一些地方加上一個特殊符號,就能夠再提升破解難度。

每個網站都使用不同的密碼

這是非常重要但大部分人都沒做到的(我自己以前也是),假設一個密碼真的很不幸的被破解了,要是其他網頁都用同樣的密碼,攻擊者就能夠輕易的去嘗試登入你所有的帳號。但是帳號一多了還是很難記住所有密碼,此時就建議用密碼管理器來代勞。

使用密碼管理器(Password Manager)

密碼處理最好的方法當然是用密碼管理器,他能夠產生的隨機長密碼,這樣只要記住一個安全的主密碼,其他密碼就可以自動填入或複製貼上,藉此登入所有的帳號。基本上主流的密碼管理器安全性都不差,所以只要做好保護措施基本上不太會有問題,這裡就不另外推薦。

開啟兩步驗證(2FA, Two-Factor Authentication)

兩步驟驗證顧名思義就是要兩個步驟才能夠登入。目前市面上最常見的 2FA 是簡訊驗證,也就是登入時除了輸入帳號密碼,系統還會發SMS簡訊給你一串數字,要求輸入數字才能夠登入。

其他常見的 2FA 登入還有:

  • TOTP(Time-based One-time Password 時間性一次性密碼)

    會利用時間來產生一段密碼(通常六位數),在30秒內會失效,其他像 Steam 所使用的驗證器(Authenticator)也是TOTP的一種。

  • Trusted Device 信任裝置

    Google 帳號通常都會開這個功能,登入時會要求在你平常使用的裝置上按確認登入,相比TOTP方便了些。

  • Backup Codes 備份碼

    假設手機無法接收簡訊、信任裝置也無法使用,這時就能夠使用備份碼登入,通常為備援選項。這種備份碼通常都是一次性的,使用後就要重新產生新的備份碼。

目前簡訊方式的 2FA 已經被認為不夠安全、能夠利用攔截或釣魚的方式攻擊,可以的話盡量不要使用。

實體金鑰

實體金鑰顧名思義就是一把實體的 USB 鑰匙(通常作為實體的 2FA 驗證手段),設定完成之後會要求插入該金鑰才能夠登入,常見的有 YubikeyTitan Security Key 等。是目前安全性最高的等級的 2FA 方式,而且相比其他方式使用上不算是麻煩(某些程度上用實體金鑰還比輸入TOTP或等簡訊還快)

實體金鑰相對於傳統 2FA 的優勢是,斷絕了被釣魚網站騙的可能。簡訊等方式還是有可能會被攔截或利用欺騙方式取得,但實體金鑰是無法偽造及複製的,唯一的攻擊方法只有取得帳號密碼而且實體金鑰物理上被拿走才能夠登入。

不過我認為對於一般使用者來說,實體金鑰目前還是非必要的,目前很多主流網路服務商都有提供實體金鑰的 2FA 選項了(Google、Twitter、Facebook、Gandi等),但是還是沒有到很普及的程度,通常一隻金鑰需要花費 40~50USD 不等,加上在行動裝置支援上還不算非常成熟,對大部分人來說不一定是那麼適合。

如果你想非常好的保護自己的帳號安全,瞭解實體金鑰的使用,我會在另一篇文章詳述(待補)。

總結

要保護帳號安全可能常常聽到,不過多數人不會當一回事或嫌麻煩,當被盜之後資料洩漏、信用卡被盜刷才後悔莫及。資訊安全如地震火災等天災,未雨綢繆遠大於亡羊補牢。如果你真正在乎你的帳號隱私及安全,現在是時候把那些弱密碼處理一下了(^u^)(至於那些覺得沒差的,駭客們會非常感謝你們的

  1. 密碼強度要夠、不要重複使用密碼
  2. 使用密碼管理器
  3. 開啟兩步驟驗證(避免使用簡訊驗證)
  4. 使用實體金鑰(可選)

以上,祝各位下次不會在密碼洩漏清單中看到自己的密碼 (ゝ∀・)

參考資料

How to Choose a Password - Computerphile

Strong passwords: 9 rules to help you make and remember your login credentials

How NOT to Store Passwords! - Computerphile

羅技 Master 2S 拇指鍵維修筆記 利用 Raspberry Pi 控制 PWM 風扇及轉速偵測

評論

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×