跳至内容
cutty.dev
All posts

密碼連結的安全 — 點擊時會發生什麼事

你可以為你的短連結加上密碼。我們會向你展示背後的運作原理——不使用任何專業術語——以及為什麼這值得這麼做。

一半關於密碼連結的教學都以「額外的安全層」這句話作為開場。然後就此結束了。在我看來,這恰恰是關於這件事最不重要的一點。

因為「安全層」並沒有解釋任何事情。它沒有告訴你這個密碼會發生什麼事、誰能看到它,或者它在什麼時候才有效。而這些正是你在點擊「新增密碼」之前,值得問自己的唯一問題。

所以,我們按順序來。

連結上的密碼不等於大門上的鎖

人們想像密碼可以萬無一失地保護連結。事實並非如此。帶有密碼的連結安全性更像是演唱會門票:持有票券的人即可入場。如果有人把票交給別人,那個人也能進入。

這聽起來像是一個缺陷。事實並非如此。你只需要知道這個機制是用來做什麼的。

三個真正派上用場的情況:

針對高級客戶的價格表,或是正式發布前的 Beta 版本文件。如果沒有密碼,這樣的連結遲早會出現在 Google 上,或是在人與人之間傳播。

包含有效日期的內容。優惠僅限週五。會議資料僅供參與者使用。密碼將連結轉換為受控入口——讓你知道有人是從你那裡獲得的,而不是偶然發現。

另一種是你完全公開發布,但仍想掌握進度的東西。連結可能會被傳播。反正沒有密碼,誰也進不去。

現在,這是這份指南不應遺漏的部分

你在表單中輸入密碼。就在那一瞬間,它消失了。字面上的意思。你設定的「tajne123」在你不放開按鈕之前,就不再以可讀的形式存在。

什麼會留在資料庫中?不是密碼。密碼之後是指紋。專業術語來說:hash。這是一串字元,只有當有人輸入與你完全相同的內容時,才會與你的密碼匹配。它本身不會洩露任何資訊。

我會直說,因為這很重要:我,作為服務的營運者,無法讀取你的密碼。這不是因為我很有禮貌,而是因為物理上根本沒有東西可以讀取。即使有人入侵了資料庫,也只會帶走一堆這些指紋而已。

計算此內容的演算法是刻意設計得很慢。我知道「慢」聽起來像是在抱怨,但這其實是一個優點。其目的是為了讓竊取資料庫的人在嘗試破解單個密碼時,必須耗費極其漫長的時間。我們談論的是年,而不是秒。

另一側的點擊

有人點擊了你的連結。他們沒有直接抵達目的地,而是看到一個畫面:「此連結受密碼保護」,接著是一個輸入框和一個按鈕。

輸入。伺服器將輸入的內容與儲存的指紋進行比對。一致嗎?接著會獲得一個有效期為 24 小時的會話權杖(token)。在接下來的 24 小時內,點擊連結即可返回,無需再次輸入任何內容。不需要記住,也不需要費力。

不一致?錯誤。來自同一個 IP 地址的五次錯誤嘗試,登入將被鎖定五分鐘。試圖依序暴力破解密碼的機器人將會碰壁。

這裡單純缺少了什麼


我們不會以明文形式儲存密碼。任何地方都不會。甚至在我在排查錯誤時查看的日誌中也不會。

我們不會透過電子郵件發送密碼。這意味著如果有人忘記了密碼,我無法直接寄給他,因為我並不知道密碼。你必須使用與之前相同的管道自行發送。

我們不會將密碼傳遞給外部。任何分析、任何行銷、任何 A/B 測試都不會觸及這些數據。(這正是適用於整個 cutty.dev 的原則,而不僅僅是在這裡。)

兩個能帶來改變的習慣

第一個:不要憑空想密碼。公司名稱加上成立年份,對任何認識你的人來說都是個好選擇。瀏覽器上的產生器一秒鐘就能產出更好的結果。

第二個,更重要的:不要透過與連結相同的管道發送密碼。連結是透過電子郵件發送的嗎?那就用簡訊發送密碼。或者反之亦然。其用意在於,即便其中一個帳號被盜,也不會讓任何人拿到完整的資訊。

一個很少人知道的小技巧:你可以建立幾個指向同一個位址、但具有不同密碼的連結。你可以給五個人存取權限,每個人都有各自獨立的連結。如果其中一個人需要被移出?你只需要封鎖她的連結,其他人甚至不會察覺。

無需建立新連結即可更改密碼。進入「編輯」面板,輸入新密碼。注意:所有 24 小時內的有效工作階段將立即失效。每個人都必須重新輸入密碼。

值得及時了解的界限

讓我們回到演唱會門票的話題。密碼可以防止搜尋引擎以及不經意的訪客。但它無法防止那些知道密碼並決定將其分享給全世界的人。

如果你的情境是「這只能給這一個人看,不能有其他人」,那麼單純的密碼是不夠的。這裡你需要帳號、登入與授權。這是另一個層次,也是不同的問題。

但是舉手示意一下,你真的多常遇到這種情況?根據我的經驗,很少見。在絕大多數的情況下,這只是單純的「我不希望路人隨意進出這裡」。而這個理由已經綽綽有餘了。

如果你想看看內部是如何運作的 —— 在建立連結時,展開「進階選項」並勾選「新增密碼」。其餘的部分會自動完成。