ASP.Net - 如何在使用Login Control登录前加密密码

时间:2011-05-14 10:09:48

标签: c# asp.net

我正在使用ASP.Net Login控件登录Web应用程序。当用户提交表单时,我想调用一个函数来加密密码,然后ASP.Net发送信息进行身份验证。

我尝试在密码字段中添加Customer Validator,如果密码不为空,则Password.Text将替换为加密值。但是,似乎ASP.Net仍然发送了原始密码进行身份验证。

我还尝试在登录按钮上添加onClick事件来加密密码,但ASP.Net仍然发送了原始密码进行身份验证。

有办法做到这一点吗?谢谢!

更新

我很抱歉没有说清楚。我需要的是加密服务器端的密码。

在注册用户时,我没有使用ASP.Net Membership来加密或散列密码。 passwordFormat属性已设置为“Clear”。

我在做的是:

  1. 当新用户注册时,我使用自定义功能加密密码并将其保存到数据库。
  2. 当用户尝试登录时,我想使用相同的功能加密用户输入的密码,让ASP.Net对用户进行身份验证。
  3. 我遇到的问题是在ASP.Net启动身份验证过程之前找不到调用加密函数的方法。

    希望这是有道理的。谢谢。

    阿伦

3 个答案:

答案 0 :(得分:1)

通过添加OnClick事件,你肯定是在正确的轨道上。如果您尝试进行加密客户端,则需要使用OnClientClick事件(OnClick发生在服务器端,OnClientClick发生在客户端)。我最初假设你用它来调用加密的客户端javascript函数?

[修改

但是,如果您正在使用加密服务器端并使用Login控件,那么您可能希望使用OnAuthenticate事件:

<asp:Login id="Login1" runat="server" OnAuthenticate="OnAuthenticate">
</asp:Login>

然后在这里进行加密:

private void OnAuthenticate(object sender, AuthenticateEventArgs e) {
    bool authenticated = false;
    String encryptedPassword = Encrypt(Login1.Password);
    authenticated = YourAuthenticationMethod(Login1.UserName, encryptedPassword );

    e.Authenticated = authenticated;
}
private bool YourAuthenticationMethod(String username, String encryptedPassword) {
    //test the encrypted password against that retrieved from your database using the username
}

答案 1 :(得分:1)

为什么在将密码客户端发送到服务器之前尝试对其进行加密?这实际上并不比向服务器发送普通密码更安全。您编写的用于加密此密码的代码可供任何人查看。

在服务器上你应该使用这样的东西:

public static string createPasswordHash(string pwd)
    {
        return FormsAuthentication.HashPasswordForStoringInConfigFile(pwd, "md5");
    }

答案 2 :(得分:0)

很抱歉,如果我误解了ASP.NET技术的某些内容,但它应该提供服务器端应用程序。因此,您不应该使用任何“c#代码”来加密传输密码。如果您不能使用安全HTTP(如果可以,您不需要加密密码,因为所有通信都将被加密),JavaScript是“唯一的方式”。但是,如果您的项目包含客户端应用程序(在客户端计算机上真正安装(或运行)的应用程序),您当然可以使用完整的c#潜力。

有一个讨论为什么你需要它。由于我没有找到更好的解释,我将尝试提供自己的解释:如果您希望有人在客户端的计算机和服务器之间收听通信,则通过Internet传输的密码加密是必不可少的。据我了解,如果用户点击您站点上的登录按钮,他看到该表单的页面实际上是在他的计算机中下载的,而点击只会导致数据从客户端传输到服务器。数据根本没有加密,任何邪恶的Eve都可以​​收听转移获取客户端的纯文本密码 但您应该知道即使您发送加密密码,加密也只包括纯文本密码问题。如果您的服务器端应用程序需要使用静态算法加密密码,并且我唯一的目标(如邪恶的Eve)是成功登录系统,我实际上并不需要知道密码本身,其加密形式将足够好。这是一个非常复杂的问题,它取决于您的连接确实需要多少安全性 - 如果成本(或您的努力)与风险相关。如果您确实尽可能保证安全,那么您应该遵守一些安全标准 关于看到用JavaScript编写的算法的观点是无关紧要的,因为它已经很好地实现了(RSA既开放且易于访问,但足够安全)。