FormsAuthentication.HashPasswordForStoringInConfigFile 方法 之研究

摘自: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="&lt;credentials passwordFormat=\"" + hashMethod +"\"&gt;<br>" +

                  "&nbsp;&nbsp;&nbsp;&lt;user name=\"" + userName.Text + "\" password=\"" +

                  hashedPassword + "\"&gt;<br>" + "&lt;/credentials&gt;";

            }

            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 &lt;credentials&gt; 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>&nbsp;&nbsp;

                                                 <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>

运行结果如下:

FormsAuthentication.HashPasswordForStoringInConfigFile 方法 之研究

FormsAuthentication.HashPasswordForStoringInConfigFile 方法 之研究

可以看到,可以产生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次幂个字符串,而字符串的组合是无穷的,所以必然产生重复,我想王晓云教授不应该是发现了这个规律吧。可能是发现了更快的找到能够产生相同编码的两个字符串的方法吧。

--------------------->>>

上一篇:[UWP 自定义控件]了解模板化控件(6):使用附加属性


下一篇:testng入门教程12 TestNG执行多线程测试