一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C#使用 Salt + Hash 來為密碼加密

C#使用 Salt + Hash 來為密碼加密

2021-12-18 15:29freeliver54 C#

本文主要介紹了幾種常見的破解密碼的方法,為密碼加鹽(Salt)以及在.NET中的實現等。具有一定的參考價值,下面跟著小編一起來看下吧

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

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

C#使用 Salt + Hash 來為密碼加密

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

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

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

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

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

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

C#使用 Salt + Hash 來為密碼加密

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

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

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

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

C#使用 Salt + Hash 來為密碼加密

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

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

C#使用 Salt + Hash 來為密碼加密

(三) 為密碼加鹽(salt)

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

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

C#使用 Salt + Hash 來為密碼加密

(四) 在.net中的實現

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

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

C#使用 Salt + Hash 來為密碼加密

下面的代碼演示如何注冊一個新帳戶。鹽的生成可以使用新guid,也可以使用rngcryptoserviceprovider 類。將byte[]轉換為string,可以使用base64string,也可以使用下面的tohexstring方法。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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();
}

下面的代碼演示了如何檢驗登錄用戶的密碼是否正確。首先檢驗用戶名是否存在,如果存在,獲得該用戶的鹽,然后用該鹽和用戶輸入的密碼來計算哈希值,并和數據庫中的哈希值進行比較。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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");
 }
}

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

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!

原文鏈接:http://www.cnblogs.com/freeliver54/p/3623299.html#undefined

延伸 · 閱讀

精彩推薦
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
主站蜘蛛池模板: 91国内精品久久久久影院优播 | 精品久久久久中文字幕日本 | 久久香蕉国产免费天天 | 四虎现在的网址入口2022 | 欧美艳星kagneyiynn高清 | 日本tube24xxxxx | 色偷偷伊人 | 操破苍穹全文阅读 | www.四虎com| 精品久久久久久久久久香蕉 | 国产全部视频 | 国产动作大片 | 嫩草影院永久入口在线观看 | yellow片在线观看 | 果冻传媒在线完整免费观 | 日本色吧| 美女班主任让我爽了一夜视频 | 青青青在线视频播放 | 亚洲国产AV一区二区三区四区 | 亚洲视频在线观看地址 | 国产成人精品视频午夜 | 精品综合一区二区三区 | 国产专区视频在线观看 | 日本男男gayxxxxx免费 | 99欧美视频 | 极品妖艳许清赵丽全文免费阅读 | 四虎私人影院 | 日本嫩交| 日本四虎影视 | 欧美日韩一区二区三区在线播放 | 天堂成人影院 | 欧美高清无砖专区欧美精品 | 国产成人免费观看在线视频 | 日本videossexx日本人 | 日韩一级片在线观看 | 亚洲人成激情在线播放 | 国产高清小视频 | 99亚洲| 日本免费一区二区三区 | 国产精品久久久久久久午夜片 | 色婷婷激婷婷深爱五月老司机 |