<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        使用 Salt + Hash 將密碼加密后再存儲進數據庫

        來源:懂視網 責編:小采 時間:2020-11-27 22:42:04
        文檔

        使用 Salt + Hash 將密碼加密后再存儲進數據庫

        使用 Salt + Hash 將密碼加密后再存儲進數據庫:(一) 為什么要用哈希函數來加密密碼 如果你需要保存密碼(比如網站用戶的密碼),你要考慮如何保護這些密碼數據,象下面那樣直接將密碼寫入數據庫中是極不安全的,因為任何可以打開數據庫的人,都將可以直接看到這些密碼。 解決的辦法是將密碼加密后再存儲
        推薦度:
        導讀使用 Salt + Hash 將密碼加密后再存儲進數據庫:(一) 為什么要用哈希函數來加密密碼 如果你需要保存密碼(比如網站用戶的密碼),你要考慮如何保護這些密碼數據,象下面那樣直接將密碼寫入數據庫中是極不安全的,因為任何可以打開數據庫的人,都將可以直接看到這些密碼。 解決的辦法是將密碼加密后再存儲

        (一) 為什么要用哈希函數來加密密碼

        如果你需要保存密碼(比如網站用戶的密碼),你要考慮如何保護這些密碼數據,象下面那樣直接將密碼寫入數據庫中是極不安全的,因為任何可以打開數據庫的人,都將可以直接看到這些密碼。

        image

        解決的辦法是將密碼加密后再存儲進數據庫,比較常用的加密方法是使用哈希函數(Hash Function)。哈希函數的具體定義,大家可以在網上或者相關書籍中查閱到,簡單地說,它的特性如下:

        (1)原始密碼經哈希函數計算后得到一個哈希值

        (2)改變原始密碼,哈希函數計算出的哈希值也會相應改變

        (3) 同樣的密碼,哈希值也是相同的

        (4) 哈希函數是單向、不可逆的。也就是說從哈希值,你無法推算出原始的密碼是多少

        有了哈希函數,我們就可以將密碼的哈希值存儲進數據庫。用戶登錄網站的時候,我們可以檢驗用戶輸入密碼的哈希值是否與數據庫中的哈希值相同。

        image

        由于哈希函數是不可逆的,即使有人打開了數據庫,也無法看到用戶的密碼是多少。

        那么存儲經過哈希函數加密后的密碼是否就是安全的了呢?我們先來看一下幾種常見的破解密碼的方法。

        (二) 幾種常見的破解密碼的方法

        最簡單、常見的破解方式當屬字典破解(Dictionary Attack)和暴力破解(Brute Force Attack)方式。這兩種方法說白了就是猜密碼。

        image

        字典破解和暴力破解都是效率比較低的破解方式。如果你知道了數據庫中密碼的哈希值,你就可以采用一種更高效的破解方式,查表法(Lookup Tables)。還有一些方法,比如逆向查表法(Reverse Lookup Tables)、彩虹表(Rainbow Tables)等,都和查表法大同小異。現在我們來看一下查表法的原理。

        查表法不像字典破解和暴力破解那樣猜密碼,它首先將一些比較常用的密碼的哈希值算好,然后建立一張表,當然密碼越多,這張表就越大。當你知道某個密碼的哈希值時,你只需要在你建立好的表中查找該哈希值,如果找到了,你就知道對應的密碼了。

        image

        (三) 為密碼加鹽(Salt)

        從上面的查表法可以看出,即便是將原始密碼加密后的哈希值存儲在數據庫中依然是不夠安全的。那么有什么好的辦法來解決這個問題呢?答案是加鹽。

        鹽(Salt)是什么?就是一個隨機生成的字符串。我們將鹽與原始密碼連接(concat)在一起(放在前面或后面都可以),然后將concat后的字符串加密。采用這種方式加密密碼,查表法就不靈了(因為鹽是隨機生成的)。

        Picture1

        (四) 在.NET中的實現

        在.NET中,生成鹽可以使用RNGCryptoServiceProvider類,當然也可以使用GUID。哈希函數的算法我們可以使用SHA(Secure Hash Algorithm)家族算法,當然哈希函數的算法有很多,比如你也可以采用MD5。這里順便提一下,美國政府以前廣泛采用SHA-1算法,在2005年被我國山東大學的王小云教授發現了安全漏洞,所以現在比較常用SHA-1加長的變種,比如SHA-256。在.NET中,可以使用SHA256Managed類。

        下面來看一段代碼演示如何在.NET中實現給密碼加鹽加密。加密后的密碼保存在MySQL數據庫中。

        image

        下面的代碼演示如何注冊一個新帳戶。鹽的生成可以使用新Guid,也可以使用RNGCryptoServiceProvider 類。將byte[]轉換為string,可以使用Base64String(我在以前的博客中介紹過Base 64 Encoding 編碼),也可以使用下面的ToHexString方法。
        代碼如下:
        protected void ButtonRegister_Click(object sender, EventArgs e)
        {
            string username = TextBoxUserName.Text;
            string password = TextBoxPassword.Text;
            // random salt
            string salt = Guid.NewGuid().ToString();

            // random salt
            // you can also use RNGCryptoServiceProvider class           
            //System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
            //byte[] saltBytes = new byte[36];
            //rng.GetBytes(saltBytes);
            //string salt = Convert.ToBase64String(saltBytes);
            //string salt = ToHexString(saltBytes);

            byte[] passwordAndSaltBytes = System.Text.Encoding.UTF8.GetBytes(password + salt);           
            byte[] hashBytes = new System.Security.Cryptography.SHA256Managed().ComputeHash(passwordAndSaltBytes);

            string hashString = Convert.ToBase64String(hashBytes);

            // you can also use ToHexString to convert byte[] to string
            //string hashString = ToHexString(hashBytes);

            var db = new TestEntities();
            usercredential newRecord = usercredential.Createusercredential(username, hashString, salt);
            db.usercredentials.AddObject(newRecord);
            db.SaveChanges();
        }

         

        string ToHexString(byte[] bytes)
        {
            var hex = new StringBuilder();
            foreach (byte b in bytes)
            {
                hex.AppendFormat("{0:x2}", b);
            }
            return hex.ToString();
        }



        下面的代碼演示了如何檢驗登錄用戶的密碼是否正確。首先檢驗用戶名是否存在,如果存在,獲得該用戶的鹽,然后用該鹽和用戶輸入的密碼來計算哈希值,并和數據庫中的哈希值進行比較。
        代碼如下:
        protected void ButtonSignIn_Click(object sender, EventArgs e)
        {
        string username = TextBoxUserName.Text;
        string password = TextBoxPassword.Text;

        var db = new TestEntities();
        usercredential record = db.usercredentials.Where(x => string.Compare(x.UserName, username, true) == 0).FirstOrDefault();
        if (record == default(usercredential))
        {
        throw new ApplicationException("invalid user name and password");
        }

        string salt = record.Salt;
        byte[] passwordAndSaltBytes = System.Text.Encoding.UTF8.GetBytes(password + salt);
        byte[] hashBytes = new System.Security.Cryptography.SHA256Managed().ComputeHash(passwordAndSaltBytes);
        string hashString = Convert.ToBase64String(hashBytes);

        if (hashString == record.PasswordHash)
        {
        // user login successfully
        }
        else
        {
        throw new ApplicationException("invalid user name and password");
        }
        }

        總結:單單使用哈希函數來為密碼加密是不夠的,需要為密碼加鹽來提高安全性,鹽的長度不能過短,并且鹽的產生應該是隨機的。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        使用 Salt + Hash 將密碼加密后再存儲進數據庫

        使用 Salt + Hash 將密碼加密后再存儲進數據庫:(一) 為什么要用哈希函數來加密密碼 如果你需要保存密碼(比如網站用戶的密碼),你要考慮如何保護這些密碼數據,象下面那樣直接將密碼寫入數據庫中是極不安全的,因為任何可以打開數據庫的人,都將可以直接看到這些密碼。 解決的辦法是將密碼加密后再存儲
        推薦度:
        標簽: 使用 數據 數據庫
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产高清美女在线观看| 亚洲开心婷婷中文字幕| 色爽黄1000部免费软件下载| 无码视频免费一区二三区| 亚洲乱码无限2021芒果 | 好湿好大好紧好爽免费视频 | 日韩免费视频一区| 亚洲精品国产摄像头| 国产在线不卡免费播放| www永久免费视频| 国产亚洲成av片在线观看| 久久这里只精品国产免费10| 久久丫精品国产亚洲av不卡| 青娱乐免费视频在线观看| 亚洲国产成人精品无码区二本| 国产91在线免费| 国产在线国偷精品免费看| 亚洲国产精品婷婷久久| 免费人成又黄又爽的视频在线电影| 亚洲AV中文无码乱人伦在线视色| 国产免费播放一区二区| 久久久久亚洲精品无码系列| 猫咪免费人成网站在线观看| 亚洲综合av一区二区三区不卡 | 特级毛片在线大全免费播放| 亚洲午夜福利AV一区二区无码| 久久免费精彩视频| 亚洲va久久久久| 国内精自视频品线六区免费 | 亚洲欧洲自拍拍偷午夜色| 天天摸夜夜摸成人免费视频| 免费一区二区三区在线视频 | 又黄又爽的视频免费看| 国产真人无码作爱免费视频| 亚洲国产日韩在线成人蜜芽| 免费A级毛片无码A∨男男| 最近免费中文字幕mv电影| 偷自拍亚洲视频在线观看99| 亚洲欧洲在线观看| 国产自产拍精品视频免费看| 97视频免费观看2区|