<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
        主站蜘蛛池模板: 亚洲1234区乱码| 亚洲情a成黄在线观看动漫尤物| 亚洲午夜电影在线观看| 亚洲AV成人潮喷综合网| 亚洲国产精品国自产电影| 中文字幕在线免费看| 精品亚洲一区二区三区在线观看| 一区二区免费国产在线观看| 99视频在线看观免费| 国产在线观看免费不卡| 久久久久亚洲AV片无码| 国产无遮挡裸体免费视频在线观看| 国产美女无遮挡免费视频| 亚洲AV日韩综合一区尤物| 四虎成人免费影院网址| 亚洲人成在线影院| 无码A级毛片免费视频内谢| 亚洲成AV人片在线观看ww| 国产亚洲精品仙踪林在线播放| 国产精品深夜福利免费观看| 亚洲成a人片在线不卡一二三区| 国产视频精品免费| 一级午夜a毛片免费视频| 最新中文字幕免费视频| 亚洲欧美国产欧美色欲| 3344免费播放观看视频| 亚洲另类精品xxxx人妖| 女性自慰aⅴ片高清免费| 日韩在线一区二区三区免费视频| 国产成人无码综合亚洲日韩| 日本免费一区二区三区| 国产精品亚洲综合五月天| 四虎成人免费观看在线网址| 九九九国产精品成人免费视频| 亚洲2022国产成人精品无码区| 精品国产无限资源免费观看| 亚洲精品免费在线观看| 女人18毛片a级毛片免费视频| 一级全免费视频播放| 亚洲精品福利网站| 亚洲毛片免费视频|