初探網路安全

所謂保密防諜,人人有責,什麼是現代人應該注意的網路資訊安全呢?

我們接著就來輕鬆點看看日常生活中,需要做哪些事來鞏固資安,並探究其背後的道理吧。

密碼大小事

在每個要求你註冊會員的新網站,都必須要想一組莫名複雜的密碼,不但長度要夠長、更要包含一堆有的沒的字元。搞的在一個新網站註冊時想密碼的環節都會焦頭爛額,有些人索性就想一組密碼用在所有網站了。

註冊所需的密碼

但這樣做安全嗎?顯然所有網站都用同樣的帳號密碼不太妥當,被知道了其中一組,其它組也就不攻自破了。

要了解怎麼做比較好,我們先從一個網站的伺服器是怎麼儲存你的密碼開始吧!

密碼是怎麼被儲存的?存在伺服器的密碼安全嗎?

一般的網站在儲存密碼時,其實都不會將你的密碼以「明文」的方式儲存,而是被打亂了儲存。

例如你有一組密碼叫做 password123,經過一種叫做雜湊(Hash)的演算法打亂之後,會變成一組亂碼如 nrRIUdcl0TYA7PUjpsm/y.lJmzr3JG/lAn7irf3ENgGk24QbuMBIa,而網站在儲存你的密碼時就會存下這組亂碼,而不是你原本的密碼原文。

這樣做有什麼好處呢?

首先,就算伺服器不幸被駭客入侵,你的密碼也不會真的被洩漏出來,因為儲存的是密碼經過 Hash 運算後的結果,基本上沒有辦法透過這個結果反推出你的真實密碼為何。

密碼的雜湊運算

那麼當你登入時,網站怎麼知道這組密碼是正確的呢?這就要談到 Hash 的特性了:同一組密碼經過 Hash 的結果,會得到同一組亂數。也就是說網站能夠驗證你的密碼是否正確,但同時又不知道你的真實密碼為何,是不是很神奇呢?

但,不是所有網站都這麼做的

幾年前有個網站叫做我的網站沒加密,就是將一些沒把密碼做 Hash 的網站放上來,讓大家知道在這個網站註冊會員時,密碼是以明文被儲存的。當這個網站的會員資料被竊取時,駭客所拿到的密碼並不是亂數,而是真真實實的密碼呢,如果有人在所有網站都取相同的密碼,就真的慘了!

如何知道密碼是否儲存為明文?

因此在沒幫你密碼加密的網站,最好不要註冊,逼不得已的話,也要有密碼被公開的心理準備,取密碼時最好不要和其它網站的有重複。

但在此之前,我們要如何知道哪些網站用明文儲存你的密碼呢?

可以用忘記密碼來做測試,一般網站由於 Hash 過你的密碼,在你忘記密碼時只能夠讓你輸入新密碼重設。因此當你收到的確認信不是要你重設密碼,而是直接告訴你密碼時,可能就得注意了!

雖然這個網站或許沒有用 Hash 的方式處理你的密碼,也可能是幫你加密後儲存,但這樣也代表當這個網站加密用的金鑰被竊取後,你的密碼還是會被洩漏出去。

如果要人不洩漏秘密,最好的辦法就是不要知道。

密碼要怎麼取才好?

在聊到如何取一個好密碼之前,我們得先了解一下什麼是不好的密碼,就從駭客破解密碼的角度開始講起。

大家在用的密碼,你最好就別用

每一年都可以看到新聞在報資安公司所統計出來的年度最爛密碼,諸如以下

  • 123456789
  • picture1
  • password
  • qwerty
  • iloveyou

由於這些密碼太過常見,就算你不是一位對資訊安全有深入了解的專家、駭客,你也可以「試試看」把這些常見的密碼用在你仇人的帳號上,多試個幾次搞不好居然就能登入了。

而事實上,大多數駭客在破解密碼的思維也是如此,就是「試試看」而已,只不過是用比你快的多的速度在嘗試而已,運氣好的話,一些常見密碼就這樣被試出來了。

假如說一個網站伺服器不幸被駭客入侵,竊取了所有的密碼,恰恰好這些密碼都沒有被 Hash(密碼是怎麼被儲存的)過,這些密碼可能就被記到了駭客的小筆記裡,用來試試看其它網站。

也就是說,當你在想一組新密碼的時候,要盡量避免大家都想的到的密碼,否則就很容易被猜中。例如這組密碼 jie2k7au4a83,就曾被國外資安專家發現是一組常見的密碼,但熟悉注音的各位應該能發現這就是「我的密碼」用注音來表示吧!

當駭客不認識某個使用者時,比較難透過私人的訊息如生日、住址等去猜到密碼,這種情況通常也只能「暴力破解」,但用的是電腦的算力,和一些聰明的辦法暴力破解。

暴力破解密碼

最直接的方式就是把密碼能出現的每個符號都嘗試一次,假如有個 100 個可能字元,密碼長度為 1 的話,試 100 次就能猜出來;長度為 2 的話,就需要 100^2 次,以此類推,密碼長度越長所需要嘗試的次數就會越多。

假如駭客用的這台電腦,平均 1 秒能算 10 億(10^10)次的話,長度為 5 的密碼就只要花 1 秒便能試完所有組合,但長度為 10 的密碼卻要 300 多年才能試完,也就是說,越長的密碼要破解的話花的時間越多,而且是指數成長。

但這樣太暴力了,一般駭客也無法接受,他們通常比較溫柔。

所以拿出他們的小筆記,以及一本「字典」,會比較沒那麼暴力一些。

如果將有人用過的密碼先試一次、在字典裡出現過的字排列組合一下試過一次,這類的策略可以大幅的縮小範圍,例如

  • iloveyou 是常見的密碼,也是常見單字的組合
  • p@ssword 替換了 a 成 @,也是很常見的做法
  • whatever123 直接就是字典裡的字加上數字的組合

因為以一些符合直覺的方式組合,所以像這樣的密碼都是強度極低的密碼。懶得想密碼而想的密碼,駭客其實都知道。

諸如包含鍵盤排列的 qwertyqazwsx、密碼後加上簡單數字 123666666 等等讓你容易記的密碼,都會比較容易的被猜出來。

駭客怎麼大量嘗試密碼?

大家自己在輸入密碼登入時,應該都有注意到多數網站會限制輸入密碼錯誤的次數,那麼駭客要怎麼快速的嘗試多組密碼呢?

要在 3 次或 5 次之內試出密碼,這樣走正規的登入顯然會被伺服器擋住,既然要想方法和伺服器周旋,那為何不直接以駭入伺服器主機為目標呢?

對耶,這樣做只要拿到主機權限,裡面所有使用者的帳號密碼就全部拿光光了!攻擊的目標從眾多的使用者被縮小成主機的管理者。但這樣做的一個問題是,主機中儲存的密碼如果被 Hash 過後,駭客也沒辦法反推回去。

但沒關係,有了這串亂碼,駭客就沒有測試的上限了!

暴力測試密碼是否符合 Hash Code

只要拿常見的密碼測、拿字典裡的單字測、把有可能的組合都測一測,就有機會攻破某個使用者的密碼。

Hash 後的密碼就一定安全嗎?

那麼密碼被 Hash 之後就會是安全的嗎?當然不是!

為了要驗證密碼是否是正確的,當你在登入時輸入的密碼會再被 Hash 一次,和儲存的 Hash Code 來做比對,假如是同一組密碼的話,經過 Hash 出來的結果自然就會匹配。

因此拿到所有 Hash Code 的駭客,就可以任意的嘗試密碼的組合,就像一般使用者登入一樣,把要嘗試的密碼以同樣的 Hash 函式跑過一遍,得到 Hash Code 再比對即可。

不過 Hash 過的密碼,只要原本取的好,也不是不安全的。因為現在常用的 Hash 函式,例如 SHA256,都有一個特性:就是改了一個字元就會讓整個輸出結果完全不一樣。

也就是說透過觀察 Hash Code 幾乎無法回推原始密碼為何,縱然你手中握有類似的密碼。例如 password122password123 被 SHA1 這個 Hash 算法所運算出的結果,是 8dc32b0ebd38d5cc80b0aedb65dee2a96bbdfa76 以及 5eff8bb44b6170d4fd4e8636643c93ad68294982,只差一個字元的密碼,輸出的結果卻截然不同。

怎麼取密碼才好?

講了這些密碼如何被駭客所破解的技巧,就知道取一個好密碼的重要性了!那麼一個難以破解的密碼需要什麼條件呢?

  • 密碼盡可能長:由於「試」出密碼的難度和密碼長度成指數關係,越長的密碼就需要花越久的時間才能被破解
  • 密碼的特殊符號盡可能多:如果每個字元的可能性不限於英文字母及數字,而包含各種符號(前提是網站允許),則密碼組合的可能性也大幅增加
  • 組合盡可能隨機:由於「試」密碼的方式常被用字典中的字搭配數字等組合,你越不用常見字詞而改用越亂的方式組合密碼,被試出密碼的可能性也就越低

好的,以上提了幾點「較難以破解」密碼的特徵,但現實上  呢,根本做不到吧!取了一個複雜到難以記憶的密碼,下次不但輸入慢,更可能會忘記密碼。

由於怕忘記密碼,可能有些人就把密碼寫在便條紙上貼在螢幕旁,這豈不是更本末導致了?

怎麼取密碼更好?在不同網站怎麼取?

因此好記的密碼也會是一個很重要的考量,以下幾點供大家參考。

取個長一點的密碼其實就很有效了,雖然不用字典中出現的字可以提高難度,但不方便記憶,用多一點的單字組合難度也不會太低,如:it's-a-really-long-password-la 這樣的密碼就不太容易重複到,並且比較容易記。

再來就是加入自己的規律,例如每 1, 2, 3, 5, 8, … (Fibonacci number) 個字母大寫,像是 IT's-a-ReallY-long-pAssword-la 等等,又或是在某個位置加入特殊符號。把這樣的規律運用在每個網站,就不容易忘記了。

說到網站,用一組密碼打天下顯然不太好,但又要好記怎麼辦呢?同樣也是加入自己的規律,例如在 Google 註冊,可以把 Google 的名稱放在密碼裡,例如 googleit's-a-really-long-password-la;若是在 Yahoo 就取 yahooit's-a-really-long-password-la 這樣放在密碼前的做法。

如此一來就可以用一組熟悉的密碼,配上不同網站專屬特性的規律組出不同的密碼。除非剛好有兩個網站同時被破解,還特地找出你的密碼差異為何,不然安全性和實用性應該都是不錯的。

小結

想不出好密碼的話,也還能用市面一些密碼管理軟體,例如 1Password、LastPass 等等都是不錯的工具。

但在注重密碼之外,其實我們更該注意的是資安意識。

往往密碼洩漏出去不是透過上述的這些方法被硬找出來的,而可能是不小心點了釣魚網站、在網站或 Email 中分享密碼,甚至是寫在便條紙上貼在明顯的位置。

加密演算法

在前面聊到 HTTPS 時,我們有提到透過加密,可以讓你傳輸的資料不會被「中間人」所竊取。

但這會有一個問題產生,如果加密像是用一把鑰匙將裝滿資料的盒子鎖住,再用同一把鑰匙解開的話,我們要怎麼把這把鑰匙交給對方呢?在傳遞的過程中不也會有「中間人」可以偷走嗎?

回答這個問題之前,我們得先了解兩種類型的加密演算法,一種是「對稱式」加密,另外一種當然就是「非對稱式」加密。

對稱式加密

這種用同一把鎖「加密」及「解密」的演算法就稱做「對稱式加密」,例如凱撒密碼,就是典型的對稱式加密。

我們把要傳的資料稱做「明文」,被加密過的資料稱做「密文」,凱撒密碼的原理就是將明文的字母位移某個數目,例如往右位移 3,則 A 會變成 DB 會變成 E,而 Z 會繞回來變成 C,以此類推。

假如我們要加密一串明文 Hello,位移量設為 3 的話,輸出的密文就會是 Khoor,一串大家看不懂的文字。

凱撒密碼

其中 3 這個位移量就是我們所謂的鑰匙(密鑰)。

假如我們兩個之間已經先見過面了,互相確認過我們加解密的密鑰是 3,這樣我只要傳出一個加密後的文字 Khoor,你再用密鑰 3 將密文反過來運算(解密),就能得到明文 Hello 了。現實中的對稱式加密算法當然不會像凱撒密碼這麼簡單,但原理是類似的,都是通過同一把鑰匙將盒子鎖上,以及解鎖。

不過,我想你也發現了這種「對稱式」加密的最大缺陷,便是我們兩個要事先溝通密鑰為何,這在網路世界中基本上就不可行了,透過 TCP/IP 體系的溝通沒辦法做到「私下」,無論如何兩者間傳遞的訊息都需要其它節點幫忙轉送封包。

那這可怎麼辦?還好有「非對稱式」的發明,完美的解決這個難題。

非對稱式加密

這種聰明的做法是將鑰匙分成「公鑰」和「私鑰」兩把,用公鑰加密的資料,只能用私鑰解密;用私鑰加密的資料,只能用公鑰解密。

為何要用公與私呢?這是因為公鑰便是公開給大家的,用途就是讓別人用這把公開的鑰匙加密資料,這樣只有我自己可以解密,其它人都無法。

Bob 用 Alice 的公鑰加密,只能被 Alice 的私鑰解開

HTTPS 是透過哪種加密演算法呢?兩種演算法的優缺點

有了非對稱式加密這種演算法,居然就能在公開的情況下設定個人秘密,那麼我們上網時所使用的 HTTPS 是否都是用非對稱式加密來保護我們的資料?更進一步來說,是否就可以拋棄對稱式加密了?

事實上,HTTPS 兩種都有用!

當初步的連線建立時,會透過非對稱式加密來傳輸資料,至於是什麼資料呢?其實是之後再加密其它資料所用的「對稱式加密密鑰」。

這是由於相較於「對稱式加密」而言,「非對稱式加密」需要的運算量更大,也就意味著吃的資源更多,而且速度可能更慢。如果要長期的交換資料,每次都用非對稱式加密來處理資料,效能遠不如對稱式加密來的好。

數位憑證,怎麼防止假冒事件

前面在講非對稱式加密時談到網際網路中聰明的加密手法,公鑰和私鑰如何運用來保護資料被竊取。這樣的做法雖然可以保證資料傳輸的安全,讓「中間人」難以破解並得到資料,但是還有個小問題存在。

那就是,有人假冒你來傳訊息怎麼辦?

仿冒者

假設 Eve 想假冒 Bob 傳訊息給 Alice,便用 Alice 的公鑰加密後傳過去。

Alice 拿到密文後用自己的私鑰解密,發現解的開,這是要給我的訊息沒錯。

Eve 假冒 Bob,拿 Alice 的公鑰加密訊息

如果 Alice 沒有什麼防備心,可能就此相信了傳訊息給他的人就是 Bob,匯款到了 Eve 的帳戶裡。

數位簽章

這可怎麼辦?總得想想辦法讓 Alice 確定訊息是否由 Bob 所發出吧?

Bob 說沒問題,我簽個名好了!

問題是在網路的世界,要怎麼做到「簽名」這件事呢?可以透過公鑰及私鑰!

前面提到公鑰及私鑰是一組的鑰匙,用公鑰加密可以用私鑰解密,反之用私鑰加密可以用公鑰解密。

那麼我們是否可以反過來,這次不用對方的公鑰加密,讓對方用私鑰解密。而用自己的私鑰加密,讓對方用自己的公鑰解密?

Bob 用自己的私鑰加密,其它人用 Bob 的公鑰才解的開

當然可以,這就是數位簽章的基本原理。透過公鑰及私鑰,可以用兩種角度分別實現資料的加密,以及確定身份這兩件事。

但事情還沒結束,世界還沒和平,還有一個小問題:Alice 怎麼能確認在 Bob 網路上公開的公鑰,不是 Eve 掉包過的呢?

數位憑證

此時就需要第三方的公證人了,Bob 會把自己的公鑰放在公道伯 CA 這裡,所謂的 CA 是 Certficate Authority(數位憑證認證機構)。

這時 Alice 只要和這些機構拿取 Bob 的公鑰,在用這把鑰匙確認收到的訊息是否為 Bob 私鑰所加密的即可,再也不用擔心受怕了。

當我們透過 HTTPS 連上一個網站時,點下瀏覽器「鎖」的圖示便能查看數位憑證的詳細資訊,像是哪個 CA 發行、什麼時候過期等等。

Google 的數位憑證

這就是為什麼要輸入較敏感的訊息到網站上時,一定要確保這個網站是透過 HTTPS 協定了,加密訊息和確認目標身份是保證網路通訊安全的基石。

參考資料

  1. 我的網站沒加密
  2. Wiki - 密碼強度
  3. Wiki - List of the most common passwords
  4. Wiki - 凱撒密碼
  5. 改變世界的九大演算法
  6. Wiki - 數位簽章
  7. Wiki - 公開金鑰認證