iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
Security

無趣的密碼學,有趣的加密!系列 第 23

[Day 23] 023 - 雜湊 - Hash(附錄)(密碼Hash,分享,非細節)(附:後端資訊安全常識)

雜湊 - Hash(附錄)(密碼Hash,分享,非細節)(附:後端資訊安全常識)

說起來會開這一章真的是我很想分享一些後端的資訊安全常識。

在Backend的洗禮下,學習了蠻多的東西。

希望能一一分享給大家。

這邊在此著名一下,這邊引用了Triton Ho 「安全」的常識的文章

並且也有部分是直接複製文中的敘述,在文章中就不一一附註。

現在公司很多的問題

我忘記了網站的密碼,當我使用忘記密碼後……

系統居然把你的密碼寄回給你!!

然後很多人還覺得:『不存明碼……很危險,要是發生什麼就不能登入了……』

還有『我把資料庫的用戶密碼做加密就好。』

這類的的想法……我實在是不知道怎麼說了。

安全的常識

這就有趣了,我們必須思考一下安全是什麼。

在這之前我來說一個故事好了。

我的學長

在同一個實驗室中,我的學長快要畢業了。

他跑過來跟我聊天……

學長:「學弟,這台電腦裡面東西都很重要。」

我:「喔喔,我知道了。」

我繼續用電腦,學長突然拍了拍我。

學長:「學弟!你怎麼把防毒軟體移除了!」

我:「嗯?阿,因為電腦太卡了。」

學長:「學弟!你都不怕駭客攻擊喔!裡面東西都很重要!」

我:「可是學長……也不需要安裝到4套防毒吧。」

學長:「學弟,你不懂,現在駭客…………」

先不說駭客多厲害,但我想問學長:

  1. 裡面有銀行帳號嗎?沒有
  2. 裡面有任何金錢先關的嗎?沒有
  3. 裡面有國家或科學等級的研究嗎?沒有
  4. 裡面有很重要的個人資料嗎?沒有

我:「那什麼東西很重要?」

學長:「我們以前修改的程式碼,很重要。」

我:「那東西……是多重要,商業還是研究?」

學長:「就……修改課本裡面的程式碼。」

我:「………」

駭客真的有那麼閑嗎?

這就要說到『安全的常識』了。

我們思考一下,怎樣的人會很不安全:

  1. 他看起來很有錢。
  2. 他看起來很好欺負,犯案成本低。

什麼是「安全」?

很簡單,就是就是「犯案成本」比「犯案後得到的利益」更低。

以一般普通的個人來說就是:

  1. 不要上一些奇怪網站。
  2. 安全更新要更新。
  3. 不要下載來路不明的檔案。
  4. 很多東西不要亂開。
  5. 不要把自己的訊息隨意洩漏。
  6. 密碼不要太簡單如:123123。
  7. 用Window10內建的防毒就很安全了。

不裝不必要的軟體。

少裝軟體就少了軟體的Bug引起的安全缺口。

那麼簡單,總之就是減少入侵的手段來提高駭客的作案成本。

不過我是developer而不是資安專家,只能聽大神們說的,然後整理而已。

說真的……駭客也要吃飯,會修改別人的網站首頁

  1. 收了錢或政治目的。
  2. 系統太爛,小屁孩用工具都能破解。

好……說回來,接下來我們來談談常識吧~

常識1:後端存『密碼』不要使用『可逆』或『明文』

現在的人都有超過1個不同的系統帳戶。

很多人又很懶加上不擅長寄一堆奇怪的密碼,因此……

而大家的密碼會重複使用。

所以當這個系統沒什麼能偷,但系統要是有可還原的用戶密碼,駭客得到了某客戶的密碼,就有可能用這組帳密來登入其他的網站。

只要你存放了可還原的用戶密碼,就會增加駭客獲利的可能。

常識2:密碼不要使用加密(可逆)

  • 為何上傳密碼時要用POST Body不能用GET的?

    • 因為Query String會留在CDN/Apache/nginx的access log內。
      所以公司的內部人員就能從access log內看到這些密碼。
      就有可能大大方方地使用密碼登入用戶的帳戶來偷錢。
  • 同理『為何不要使用encrypted完後放資料庫』?:

    • 即使用戶密碼被encrypted才放資料庫也好。
      你的Cipher不管是放在資料庫還是放在App、Server也好。
      總需要有人來管理的。
      而有人來管理,這就代表這個人可以偷用戶密碼再作壞事。
      然後一堆公司嘛,通常內部權限沒設好,Cipher和production database全公司(呃,甚至是全世界)都可以拿到……

總之就是就是要讓密碼無法重現。

常識3:不要使用自制的Hash

這就要提到Hash的幾個特性:

  1. 不可逆。
  2. 難以重複。
  3. 高熵。

要是自己發的,要是沒有經過長時間的驗證很容易:
看光光你的source code,知道你的Hash算法。

簡單的一個例子:Hash(x) = (x mod 10)

這是為什麼MD5為何今天已經不安全,因為可以偽造重複。

常識4:加鹽(Salting)和彩虹表(Rainbow Table)

現在用戶在資料庫中只有Hash過的資料。

很好,那駭客今天使用了『彩虹表』得到一大堆Hash摘要。

只要這用戶數目夠多,那我就能在你的資料庫中比對出相同的Hash摘要。

而『加鹽』就是這個意思,就是每一用戶的密碼基礎上,都加入不同的一段亂數。

然後把這個亂數存到用戶的紀錄上,這時一個彩虹表必需要加入這一段亂數來跑。

大大增加了破解的成本。

常識5:別用SHA來做密碼的Hash

做加鹽很好,但如果Hash很快的話……那成本也不是很高。

SHA大家都知道了,是為了快速和大檔案而開發出來的。

理想的密碼用Hash應該是要讓CPU和RAM很慢。

跑一個密碼的Hash要花上1秒鐘,那你的彩虹表除了不能直接用,而加入亂數後跑,必需要花上極大的時間。

那哪些是專門來做密碼的Hash呢?

以下這些都是專門來做密碼Hash的:

  1. BCrypt
  2. PBKDF2
  3. Scrypt
  4. Argon2id

目前我個人推薦,或者說大部分的人推薦的是『Argon2id』。

這邊有Argon2的論文:

Argon2

這邊是WiKi:

Argon2 WiKi

Argon2會幫你做Hash跟Salting,而且夠慢,CPU類的加速都沒辦法使其變快。

Bcrypt這邊也有一篇文章:

Bcrypt: Choosing a Work Factor


密碼用Hash 結論

這一篇不知道是很水還是很不錯。

但我還是把一些東西介紹了一下,除了常識之外大家請一定要好好的對待客戶的密碼。

很多的大老們都會注意這個部分,但目前很多公司還是沒有去處理。

有機會的話來說說Argon2、BCrypt、PBKDF2這三個,但那就是後話了。

這一次因為篇幅的關係跟密碼學其他很重要的東西要說,就先在這邊挖個坑。

下一章就是Hash的最後一章了,HMAC。

一樣,大家明天見。


參考資料

Triton Ho

Triton Ho 「安全」的常識 文章

Argon2 WiKi

Argon2

Bcrypt: Choosing a Work Factor


上一篇
[Day 22] 022 - 雜湊 - Hash(番外)
下一篇
[Day 24] 024 - 訊息鑑別碼 - Message authentication code
系列文
無趣的密碼學,有趣的加密!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言