我最近讀的一篇博文(伯樂線上注:請看本文最後),是關於強制使用更復雜的密碼。原作者說這是為了更安全,但我認為這些技術不是最好的方式,比起「實用」來說,顯得很麻煩。
問題
你想實施更安全的密碼,我懂。但是,
請停止強迫我使用你那糟糕的密碼規則 :(
不讓這篇文章那麼嚴肅,我在試圖做到這一點。我只是因為那篇文章有了靈感寫下我的想法,不是針對作者。總之我是在和每一個在自己的網站和伺服器使用這些密碼規則的人講話。我討厭這些型別的規則:
1 2 3 4 5 6 |
'password' => [ 'required', 'confirmed', 'min:8', 'regex:/^(?=S*[a-z])(?=S*[A-Z])(?=S*[d])S*$/', ]; |
密碼必須包含 1 個大寫字母,1 個小寫字母和數字。
有了這樣的一個規則,密碼 Abcd1234
會通過你的有效性檢測,但是 mu-icac-of-jaz-doad
不會。
我知道你大概是想讓人們使用隨機字元密碼,像 i%Mk3c4n
,但是你的規則實際上並沒有這樣執行,這些密碼是個麻煩事而且不安全,除非它們足夠長——使得它們成為更麻煩的事。打出這些密碼很痛苦,尤其是在那些你沒有安裝密碼管理器的手機和計算機上。
其次,使用不安全密碼的人依舊會使用愚蠢的密碼(比如 Loverboy1964),
所以你沒有幫助任何人。
停止強迫我使用你專制的規則並鼓勵其他人這麼做——我的密碼是更好呢。
例子
那位博主允許使用的 2 個密碼:
下面這兩個是那位博主不允許使用的密碼:
解決方案
我不知道,但是如果你真的想要執行一些比此列表上的密碼更安全的東西,那就不要強制不必要的複雜模式。你的驗證規則,還是會讓人繼續用的原密碼中的大部分,只是增加一個大寫字母,或兩三個數字。
(注1:此處提到的密碼列表,裡面都是 123456 、password、qwerty 之類的「愚蠢密碼」)
相反,為什麼不提高密碼所需的最小長度,禁止 3 位或更長的數字序列 /[0-9]{3,}/?
你可以在那之後往前走一小步,不允許同樣的字元在一行(相鄰)重複兩次以上 /(.)1{2,}/
,而且還沒有太多的麻煩。
這將消除大部分的困擾,並不會不必要地限制您的使用者密碼選擇。
更新
更好的是,為什麼不忘記所有這些規則,只使用一個最小密碼強度要求。
來自 reddit 網友 sarciszewski 的建議:
我不明白為什麼那麼多人不用 Zxcvbn。
我們並不特別關心你的密碼包含了什麼,只要密碼強度估計量足夠好就行。想要用2000個’A’構成一個ASCII penis來檢測,zxcvbn 不會提醒你密碼不包含小寫字母不能使用而讓你失望。
相關漫畫
密碼強度 (xkcd)
《在 Laravel 中強制複雜密碼的建議》(英文原文)
根據簡單優雅的 Laravel 文件,我將快速介紹如何促進使用者使用更好的密碼。通過 Authentication 的標準文件,我們用一個登錄檔單來說明。在 Laravel 的 AuthController 中,我稍作了修改。
(伯樂線上補註:Laravel 是一個 PHP Web 開發框架。)
1 2 3 4 5 6 7 8 9 |
protected function validator(array $data) { $messages = ['password.regex' => "Your password must contain 1 lower case character 1 upper case character one number"]; return Validator::make($data, [ 'name' => 'required|max:255', 'email' => 'required|email|max:255|unique:users', 'password' => 'required|confirmed|min:8|regex:/^(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])\S*$/', ], $messages); } |
使用文件 http://php.net/manual/en/function.preg-match.php 和 Laravel 文件的正規表示式規則,我可以設定一個表示式來檢查這些字元,我還可以設定一個自定義訊息如果失敗。
通過這些微小的工作我們可以用一個錯誤訊息來幫助使用者設定更好的密碼。