2014年3月13日

[C#]密碼加「鹽」了嗎?

今天要來聊聊密碼的安全性,既然是密碼就應該有高度的安全性,只有使用者自己知道而已

密碼存在資料中通常用三種方式存在
一、明碼:這應該是沒人敢做吧?
二、可逆密碼:僅限於必須要還原密碼的情境,若無需還原建議選第三方案!
三、不可逆密碼:應該大多數人都選用這種方案吧!

主要要探討的是第二、三種方式,第二與第三種方式在被Hacker取走之後,
  • 可逆密碼:可用暴力破解法慢慢的破,破解之日指日可待。
  • 不可逆密碼:可用HashTable比對來擊破
看到這裡會想說....天啊....那還有什麼是安全的?

其實"沒有",緩兵之計是增加Hacker的成本,也就是增加破解的時間,
讓管理者有時間發現與通知使用者換密碼

至於要怎麼加強密碼強度呢?
可以採用加Salt的方式,加入Salt,這是什麼意思?
意思就是在加密之前,先對密碼做一次手腳
密碼->加Salt->加密 
而.net本身有提供這種加Salt的類別Rfc2898DeriveBytes,
方法如下:
        /// 
        /// 使用依據 HMACSHA1 使用虛擬亂數產生器,實作密碼式的金鑰衍生功能 PBKDF2。
        /// 
        private string GenRfc(string Password,int KeySize)
        { 
            //加鹽,加入(控八控控-控控控-控控控)
            byte[] salt = new byte[] { 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
            byte[] key = Encoding.UTF8.GetBytes(Password);
            Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(key, salt, 2);
            return rfcKey.GetBytes(KeySize);
        }

加鹽之後的對比如下圖:
除了能增加密碼複雜度,也能符合需要特定長度的對稱式加密演算法。

經過加密的密碼,即使是用hashTable也對不出真正的密碼其實是123456789.

獻給需要吃重鹹的使用者。

參考出處:
1.[C#.NET] 字串及檔案 利用 DES / AES 演算法加解密
2.密碼儲存要加”鹽”才夠安全



P.S.轉載請附上原文連結

沒有留言:

張貼留言