摘自:http://time-is-life.cnblogs.com/articles/322523.html
給定標識哈希類型的密碼和字符串,該例程產生一個適合存儲在配置文件中的哈希密碼。
[C#]
public static string HashPasswordForStoringInConfigFile(
string password,
string passwordFormat
);
參數
password
要進行哈希運算的密碼。
passwordFormat
要使用的哈希算法。選項有“sha1”或“md5”。
返回值
返回一個包含哈希密碼的 String。
備注
支持的密碼算法是 SHA1 和 MD5。
以下是測試的例子:
<%@ Page Language="C#" autoeventwireup="true" %> <html> <head> <script runat="server"> void Cancel_Click(object sender, EventArgs e) { userName.Text = ""; password.Text = ""; repeatPassword.Text = ""; result.Text = ""; } void HashPassword_Click(object sender, EventArgs e) { if (Page.IsValid) { string hashMethod = ""; if (sha1.Checked) { hashMethod = "SHA1"; } else { hashMethod = "MD5"; } string hashedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text, hashMethod); result.Text="<credentials passwordFormat=\"" + hashMethod +"\"><br>" + " <user name=\"" + userName.Text + "\" password=\"" + hashedPassword + "\"><br>" + "</credentials>"; } else { result.Text = "There was an error on the page."; } } </script> </head> <body> <form runat="server" ID="Form1"> <p>This form displays the results of the FormsAuthentication.HashPasswordForStoringInConfigFile method.<br> The user name and hashed password can be stored in a <credentials> node in the Web.config file.</p> <table> <tbody> <tr> <td>New User Name:</td> <td><asp:TextBox id="userName" runat="server"></asp:TextBox></td> <td><asp:RequiredFieldValidator id="userNameRequiredValidator" runat="server" ErrorMessage="User name required" ControlToValidate="userName"></asp:RequiredFieldValidator></td> </tr> <tr> <td>Password: </td> <td><asp:TextBox id="password" runat="server" TextMode="Password"></asp:TextBox></td> <td><asp:RequiredFieldValidator id="passwordRequiredValidator" runat="server" ErrorMessage="Password required" ControlToValidate="password"></asp:RequiredFieldValidator></td> </tr> <tr> <td>Repeat Password: </td> <td><asp:TextBox id="repeatPassword" runat="server" TextMode="Password"></asp:TextBox></td> <td><asp:CompareValidator id="passwordCompareValidator" runat="server" ErrorMessage="Password does not match" ControlToValidate="repeatPassword" ControlToCompare="password"></asp:CompareValidator></td> </tr> <tr> <td>Hash function: </td> <td align="middle"><asp:RadioButton id="sha1" runat="server" GroupName="HashType" Text="SHA1"></asp:RadioButton> <asp:RadioButton id="md5" runat="server" GroupName="HashType" Text="MD5"></asp:RadioButton></td> </tr> <tr> <td align="middle" colspan="2"> <asp:Button id="hashPassword" onclick="HashPassword_Click" runat="server" Text="Hash Password"></asp:Button> <asp:Button id="cancel" onclick="Cancel_Click" runat="server" Text="Cancel" CausesValidation="false"></asp:Button></td> </tr> </tbody> </table> <p><asp:Label id="result" runat="server"></asp:Label></p> </form> </body> </html>
運行結果如下:
可以看到,可以產生SHA1碼和MD5碼。下面是有關這兩種加密算法的相關信息:
----------------------------------------------------------------------------------------------
引文1:
200分關于 MD5加解密/希望大家以后不要再問了
ShiningstarHu (Shining_star) 2005-06-08 21:29:33 在 Web 開發 / ASP 提問
發這個帖子,實在是因為我在這CSDN里2年的時間里,看了太多的有關于這個方面的問題了。
再加上本人最近考試綜合癥以及下面這個帖子里面提問的也好,回答問題的也好讓我看了很傷心。
http://community.csdn.net/Expert/topic/4065/4065846.xml?temp=.8402063
看來很多人對Hash算法還不是很理解。在這里,我簡單的講解一下。
我也不在希望以后再有人問關于MD5,SHA1如何解密了!
首先簡單的講一下Hash算法和他的通途!可能大家看了以后,很多人可能都會發現自己
目前在使用Hash算法的目的都是和Hash算法本身的設計目的不一樣的 :D
Hash算法不管是MD5也好SHA1也好. 他們都是一種散列算法,其算法的特點是,可以把任意長度的字符串經過運算生成固定長度的字符串,并且這個產生的字符串代表著原來字符串里的所有字符。
簡單的舉個例子,就拿我上面說的那個帖子里面的 kc_ren(天堂龍)的例子:
admin 加密后:
16位8f00b204e9800998
32位d41d8cd98f00b204e9800998ecf8427e
其中不管是16位也好,32位也好其生成的字符串8f00b204e9800998 (16bit)或者d41d8cd98f00b204e9800998ecf8427e(32bit)他們表示著admin這個原始字符串.
只要admin這個字符串沒有變,不管怎樣重復使用MD5或者SHA1進行重新運算,其結果保持不變。
利用這個特點,在計算機安全學上,我們使用這種算法來保證數據完整性(Integrity)
這里提到計算機安全學,我在這里擴充一下:簡單的概述計算機安全學,其實就是一門在講關于 CIA
的學科。 C = Confidentiality (機密性), I = Integrity (完整性), A = Avalibility(可用性)
顯而易見Hash算法,是用來保證 Integrity的算法。什么叫做完整性,不單單指數據不丟失,并且要保證數據沒有被非法修改過。舉個簡單的例子。
比如:A 發了一個Email給B內容為"Hello",因為我們目前使用的以太網的特點,任何人在網絡上都有可能截獲這封Email,任何人都有可能,修改Hello這個字符串。那么當B收到這封A發來的Email的時候,怎么確定這封Email在傳送過程中沒有被修改過呢? 我們就使用了Hash算法來保證數據的完整性。他的工作方式是這樣的:
1.A寫一封Email內容為Hello
2.A用Hash算法對Hello進行編碼(這里我用了編碼,沒有用加密這個詞)
3.A將原始Email Hello 以及經過Hash算法編碼過后的digest(原始Email的摘要信息)一起發送給B
(因此,A給B發的Email由2部分組成,1是原始的Hello,2是經過Hash編碼的摘要信息)
4.B接收到了A的Email,首先分離由2部分組成的郵件。
5.B通過Hash算法,根據收到的Email的內容,重新計算出該Email的摘要信息.
6.B將自己計算出的摘要信息和收到的摘要信息進行比較,如果比較結果一樣,則認為這封Email在中途沒有被修改過,否則的話,這封Email在中途一定被修改過,因此內容不可信。
至此,保證了原始數據的完整性。
很多人在使用Hash算
法在對密碼進行所謂的加密,其實是不妥的。這樣做的最終結果最多最多就是能夠讓使用的這個軟件的人放心。放心什么呢?放心的就是他們在你的軟件里面所保存
的密碼,開發軟件的人不能獲得。除此之外,沒有其他任何價值。如果一定要說出其他的價值的話。也就是如果開發軟件的人員或者維護該軟件的人員不小心將含有
客戶密碼數據的數據庫泄密的話,得到這個數據庫的人,無法從數據庫中獲得那些客戶的密碼。 但是,大家想想清楚,我都獲得了數據庫的數據,我還需要那些密碼干什么呢?
我相信很多在CSDN的開發者,他們為了實現向客戶承諾的所謂的 Pravicy,他們在開發Web base應用的時候,使用了Hash算法。這樣他們會對使用他們Webbase的應用的用戶說:"你們在我這里的登陸密碼是安全的,沒有人能夠知道。" 看上去好像想得很周到,其實,仔細想想,光光使用這種方法,如何保證用戶的Pravicy呢? 說白了,就是形同虛設,光光使用Hash算法對用戶的密碼進行編碼(所謂的加密)是沒有什么很高的價值的。
談了這么多,我相信大家應該理解Hash算法的用途了。現在我們來簡單的談一下,很多人很為之驕傲的山東大學王小云教授的關于什么MD5"解密"的新聞.(根據我剛剛看了山東大學的網頁,據說她連SHA1,MD4都"解密"了). 請大家注意,我在解密上面放了引號!!
如果網上這么傳,我只能說那些報道這則消息的新聞工作者的無知!(當然不能怪他們,因為他們不是計算機專業畢業的,而且報道的又是有關計算機安全學方面的東西。要知道在美國計算機安全學,是可以單獨作為大學本科的一個專業的,里面有太多的東西需要學了。我現在講得也只是皮毛而已。)
有點跑題了:P ......
回過頭,簡單的講一下王教授的碰撞法。 說到解密?王教授的方法不是用來解密的。所以傳什么王教授可以解密MD5,將MD5的編碼(所謂的加密)結果還原,這個是有點夸大了。沒有這么傳神的,那些說法用句時髦的話來描述叫做“傳說中的解密” :D
王教授的碰撞法是利用了MD5或者SHA1算法的一個漏洞(我暫且叫做漏洞吧,沒有考證過)
根據MD5和SHA1這種Hash算法的特點,因為他們是任意長度的字符串變成固定長度的摘要信息。
那么這里就有可能發生一個問題,就是不同的字符串在理論上是有可能產生相同的摘要信息。
王教授所謂的碰撞法,碰撞的就是不同的字符串所產生的摘要信息是一樣的那些字符串。因此得名碰撞法。 碰撞就是體現在這里。沒有什么其它的傳神的東西了。根據SHA1和MD5等Hash算法,在設計時候,設計這個算法的人認為不同的字符串要產生相同結果的摘要信息的可能性幾乎為零。而王教授則證明了SHA1和MD5等Hash算法產生的摘要信息規則是可以在比較短時間內被破解的。這樣一來,原始數據的 Integrity 就被打破了。 所謂的破解,也就是體現在這里。
如果大家還不明白,我再簡單的用王教授的碰撞法給大家舉個簡單的例子。
還是拿我前面的例子,A給B寫了個Email叫做Hello,然后通過王教授的碰撞法,可能得到Fuck這個字符串的摘要信息和Hello這個這個字符串產生的摘要信息是一樣的。因此,在前面的這個例子中。如果B收到的Email內容為Fuck B也將認為是A發來的Email,并且沒有被修改過!
看到這里,我相信很多目前在使用MD5或者SHA1等Hash算法的人來保證密碼安全的人來說,應該考慮一下,是否應該繼續使用目前的方法來保證安全了。
-----------------------------------------------------------------------------------------------------------------------------
下面是一些有關MD5,SHA1可以破解的文章,看了一下,并不是說MD5不是可逆的了,而是說MD5編碼不再唯一了,也就是說兩個不同的字符串可能產生相同的MD5編碼。
http://topic.csdn.net/t/20040908/11/3351527.html
又問了一下別人,原來因為MD5 無論多長的字符串都產生相同長度的字符串,也就是總共有2的128次冪個字符串,而字符串的組合是無窮的,所以必然產生重復,我想王曉云教授不應該是發現了這個規律吧。可能是發現了更快的找到能夠產生相同編碼的兩個字符串的方法吧。
--------------------->>>
文章列表