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>

运行结果如下:

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

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

FormsAuthentication.HashPasswordForStoringInConfigFile 方法 之研究

时间: 2024-12-13 09:18:23

FormsAuthentication.HashPasswordForStoringInConfigFile 方法 之研究的相关文章

FormsAuthentication.HashPasswordForStoringInConfigFile 的替代方法

由于项目中要和php对接,要将一段字符串生成md5(16位)验证码,在英文字符时,没有太大问题,但在遇到中文时,两边字条始终不一致. php是别人的项目,看不到源码,网上一查,估计是这样写的: <?php echo substr(md5("admin"),8,16); // 16位MD5加密 echo "<hr>"; echo md5("admin"); // 32位MD5加密 ?> 之前的 md5代如下(对md5没有过多

FormsAuthentication.SetAuthCookie 方法登录

FormsAuthentication.SetAuthCookie 方法,登录的原理. FormsAuthentication.SetAuthCookie 方法登录的过期时间. 登录相关阅读 asp.net 登陆验证 Form表单验证的3种方式 FormsAuthentication.SetAuthCookie: FormsAuthentication.RedirectFromLoginPage;FormsAuthenticationTicket

FormsAuthentication.GetRedirectUrl 方法

https://msdn.microsoft.com/zh-cn/library/8a22t5t3(v=vs.80) FormsAuthentication.GetRedirectUrl 方法 .NET Framework 2.0 其他版本 返回导致重定向到登录页的原始请求的重定向 URL. 命名空间:System.Web.Security程序集:System.Web(在 system.web.dll 中) 语法 C# C++ VB public static string GetRedirec

jdk_Arrays类_排序方法_研究

private static void sort1(int x[], int off, int len) { // Insertion sort on smallest arrays //长度小于7,采用冒泡排序 if (len < 7) { for (int i=off; i<len+off; i++) for (int j=i; j>off && x[j-1]>x[j]; j--) swap(x, j, j-1); return; } //长度不小于7,采用快速

槽填充中模式优化方法的研究

槽填充中模式优化方法的研究(硕士毕业论文) 沈晓卫 针对槽填充任务的实现方法 主要可以分为三种: 第一种是把槽填充任务转换为关系抽取任务,用传统的信息抽取方法来实现槽填充任务,按照具体实现方法的不同,信息抽取方法又可以分为模式匹配的方法和基于分类器的方法 第二种是以问答系统(Question  Answering,QA)为基础,通过把槽填充任务中定义的每一个槽解析为一个等价问题集合的方式来完成槽填充任务. 最后一种是基于规则的方法,即直接依靠人工的方法为每一个槽构建对应的模式库或规则库,然后以这

移动机器人视觉定位方法的研究

本文针对移动机器人的局部视觉定位问题进行了研究.首先通过移动机器人视觉定位与目标跟踪系统求出目标质心特征点的位置时间序列, 然后在分析二次成像法获取目标深度信息的缺陷的基础上, 提出了一种获取目标的空间位置和运动信息的方法.该方法利用序列图像和推广卡尔曼滤波, 目标获取采用了H IS 模型.在移动机器人满足一定机动的条件下, 较精确地得到了目标的空间位置和运动信息.仿真结果验证了该方法的有效性和可行性. 运动视觉研究的是如何从变化场景的一系列不同时刻的图像中提取出有关场景中的目标的形状.位置和运

bitmap-setBounds方法参数研究

对于如下的代码,一直有点不明白它具体每一步操作的影响.今天就稍微研究下.代码如下 xml代码 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    xmlns:internal="http://schemas.android.com/apk/prv/r

LuaJ 调用java方法性能研究

先简单写一下: lua调用java的方法,在luaJ中有两种. 1 使用官方提供的luaJava库 local ins = luajava.newInstance( "com.test.lj.TestClass");ins:test() 2 自己绑定方法,采用类似原版lua的方式将方法 local ins = TestClass.new() --new方法自己绑定 ins:test() 哪种方法好? 结论: 令人惊讶的是,luajava库反射调用的性能在某些情况下,竟然比java原生绑

Security Access Control Strategy &amp;&amp; Method And Technology Research - 安全访问控制策略及其方法技术研究

catalog 0. 引言 1. 访问控制策略 2. 访问控制方法.实现技术 0. 引言 访问控制是网络安全防范和客户端安全防御的主要策略,它的主要任务是保证资源不被非法使用.保证网络/客户端安全最重要的核心策略之一.访问控制包括 1. 入网访问控制 2. 网络权限控制 3. 目录级控制 4. 属性控制等多种手段 访问控制相关领域知识是CISSP的重要章节,本文将重点讨论访问控制模型.及其相关的方法和技术 0x0: 访问控制概念组成 访问控制涉及到三个基本概念 1. 主体 是一个主动的实体,它包