在數碼年代,基本上每個人都有不少用戶密碼「跟身」,然而很多人似乎忘記了密碼背後,可能直接或間接與金錢連上關係而疏於防範,也並非所有公司都妥善儲存密碼,以下將會介紹甚麼方法不應該使用,以及比較安全的儲存方法。
錯誤示範:以純文字方式儲存
最簡單的方法是把密碼儲存在未經加密的資料庫,當用戶嘗試登入,身份驗證只是將輸入的內容與資料庫中的內容進行配對,不過由於存在攻擊者盜竊資料庫、利用軟件的安全漏洞作案,甚至擁有高存取權的居心不良員工盜竊密碼表的風險,又或者員工登入憑證外洩也能引發密碼盜竊等等,以開放形式儲存的資料正正是完全開放。
稍為好的方法:加密密碼
至於把密碼儲存在加密的表格內,概念看起來不俗,實際上就沒有那麼美好,因為每次都需要解密以配對用戶的輸入,這意味著解密金鑰就在附近某個地方,一旦落入黑客手上就等於密碼資料庫也手到拿來,有違原來的目的,網絡犯罪份子能夠快速解密資料庫然後取得在純文字狀態的密碼。有密碼學家開玩笑說,加密並不能解決私隱問題,只是把它變成儲存安全金鑰的問題,可能有方案降低風險,但並不能可靠地保存密碼。
正確方法:儲存密碼雜湊值
雖然最佳的方法是不儲存密碼,不過為了檢查登入用戶使用正確密碼,所以便有人引入了雜湊函數(hash function)的概念,它是一種特殊密碼演算法,以可預測但不可逆轉的方法,把任何資料打亂成固定長度的位元串。可預測指相同數據永遠轉換成相同的雜湊值,不可逆轉意思是完全無法從雜湊值復完打亂的數據,所以不少網上服務都有使用。
當一個用戶在登記時創立密碼,與用戶名稱一起記錄在數據庫的並非密碼本身而是它的雜湊值,當處理登入時便會對比輸入密碼時所轉換的雜湊值,如果吻合便即是密碼相同,即使不幸數據庫外洩,攻擊者並不會獲得密碼,而是密碼的雜湊值,由於無法逆轉的關係所以相對安全,但也並非完全無離,因為可能受到暴力破解(brute-force)攻擊。
更好的方法:「加料」的雜湊值
當黑客取得數據庫嘗試透過暴力破解「試」出密碼,意味著會不停試不同的字串組合以計算出雜湊值,再全部放到數據庫進行配對,如果配對成功便意味著密碼正確,而且黑客可以利用稱為rainbow table的龐大資料數組,通過預先計數常用密碼的雜湊函數,可以加速破解速度,而且整個步驟自動進行,令破解密碼的過程變得又快又舒適。
不過也有好消息,因為無法事先計算全部可能字串組合,一個完整的rainbow table(不管是哪種演算法)將是無法應付的容量,即使是不太可靠的MD5,其紀錄數量將會是39位數(方便理解:9位數為「億」)。而密碼學家為了對抗rainbow table的使用,提出了解決方案利用了雜湊函數的另一個重要屬性,即使來源文字最微小的變化,也會使雜湊結果變得無法識別。
在密碼雜湊被計算和寫入數據庫,一個隨機的文字(稱為salt)被加入在內,這方法令數據庫內的雜湊得以延申,令最常被利用的密碼,例如 「12345678」和「password」都無法以rainbow table暴力破解,最簡單可以是所有密碼都使用相同的「salt」,不過最有效的方法則是每個獨立紀錄都有不同的salt,即使知道salt也不會令攻擊者的工作變得輕鬆,始終仍需要經過所有字串組合。
資料來源:Kaspersky Blog