作者HuangJC (吹笛牧童)
看板PHP
標題[心得] 不要儲存使用者的密碼
時間Mon Aug 11 17:26:26 2008
這個標題應該有別人提過,不過我沒搜尋到
那就當做炒冷飯,請程度相當的朋友參考就好
高手可以笑笑跳過了 :)
;;
Win NT 系統有一個 NTFS 加密的選項
它可以做到如果你忘了密碼,就無法還原資料的境界
充其量就是 format,破壞它,一切重來
有人說重灌一顆 Win NT,登入後用它 access NTFS 就好了
這是沒設 NTFS 加密的狀況
如果只是缺乏 access NTFS 的能力,而且沒有加密的話
去拿一套專門支援 NTFS 的 DOS,會方便很多
可以快速拷出你的資料而不用重灌 NT
總之,Login 時的密碼是一關
而 Login 之後 access 資料又是另一關
這樣可以使 admin 也無法看到你的資料
在 linux,admin 可以取得最大權限
那什麼都有了 :P
當然 admin 應該可以'管理'使用者
我以為,管理不代表可以侵入;你頂多限制我的權限或刪除我的帳號
不過同事說,linux 的權限沒複雜到這樣(這點看有沒有高手可以補充)
;;
如果我架了一個站,讓人用 username & password 登入
當然就需要有一個 DB 去儲存這些東西
"但是不要儲存使用者的密碼",這是我們上課時,同事提及的
我以為,如果是 admin,或者被別人侵入
反正什麼都要被看光光了,你還在乎密碼幹什麼
"也許有用戶把這密碼通行各處,比如提款卡
我們被破就破了,但是還可以保護他的其他帳號不被侵入"
原來如此
難怪有這種說法,我(admin)架一個站給你上
我能知道你的密碼是否正確;但我並不知道你的密碼
也因此,有些網站的"忘記密碼",是讓你重設一個密碼,或者 admin 生一個新密碼給你
但是無法把你目前的密碼寄還給你
因為連網站自己都沒保存你的密碼!!
這觀念蠻有趣的,同事說有興趣去讀密碼學
要這麼說也不是 PO PHP 板了;只是我把它應用在 PHP 上
實作方法:
1.user 建立(輸入) $username & $password
2.$new_password=md5($username . $password);
3.在 DB 中,儲存 $username & $new_password
4.驗證時,user 會再次輸入 $username & $password
我們重新以 md5 編碼一次,如果可以得到相同的 $new_password
那就代表使用者輸入的密碼是正確的
因為步驟 3. 中,我們儲存的是 $new_password
而這是很難(並非不可以)反解回 $password 的
所以即使我們網站被破,使用者的 $password 也不會流出
以上概念,相信用在很多地方
;;
問題來了
目前我是使用 phpbb2,因為第三版太龐大,來不及學會
不過我 trace 過第三版,發現它用的 rule 更有趣
舉例來說
如果有一堆人,都恰好用 '123' 當做密碼
而他也曾經在別的站用同一個 ID 做過 MD5 (比如我這個 HuangJC)
那麼,'HuangJC123' 這樣的字串會做出什麼 MD5,他偏偏有印象
那就有機會破?
我不曉得這機率高不高,但我覺得 phpbb3 連這點都在防!!
它的演算法,基本上是同一個 $username & $password 連續產生 $new_password
也會每一次的 $new_password 都不相同的!!
幹麻做這麼神 XD
至於不同的 $new_password 為什麼都能反證我輸入的 $password 是正確的
我還沒看懂..
因為自己讀無法集中注意力,所以先來 PO 一下 :)
以上,謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.219.65.16
→ starjou :將密碼編碼後儲存的做法蠻常見的,md5 編碼可以加 08/11 17:32
→ starjou :seed,產生的編碼字串會不同 08/11 17:32
推 aquarianboy :加些鹽巴(salt)也不錯 :) 08/11 17:51
→ HuangJC :樓上連推文都是密碼,我 google 不到,無法領會啦~ 08/11 17:54
推 lgzenith :md5編碼前..自己加上自訂的字串就好了 08/11 17:58
→ HuangJC :原來自訂字串就叫鹽巴? ..應該有典故.. 08/11 17:59
$new_password = md5($username . $seed . $password);
以上,自己加 $seed 我可以了解
$seed 由亂數產生也很棒
但神奇的就是,既然如此,我如何確認 user 再次輸入的 $password 是正確的?
難不成,$seed 也被儲存了?
耶,有個方向,我查 code 先~
※ 編輯: HuangJC 來自: 61.219.65.16 (08/11 18:01)
推 lgzenith :md5 salt 就Google的到了 08/11 18:01
→ HuangJC :謝謝,果然查資料要有門道 XD,我用'php salt'沒找到 08/11 18:11
→ weiyucsie :其實看到這篇 我第一個想到的是one-way hashing 08/11 19:31
→ weiyucsie :(不過這篇講到的理由 倒是不錯XD) 08/11 19:32