ASP.Net - 如何在使用登录控件时加密密码?

3
我正在使用ASP.Net Login控件登录Web应用程序。当用户提交表单时,我想调用一个函数来加密密码,然后ASP.Net发送信息进行身份验证。
我尝试在密码字段上添加自定义验证器,如果密码不为空,则将Password.Text替换为加密值。然而,似乎ASP.Net仍然会发送原始密码进行身份验证。
我还尝试在登录按钮上添加onClick事件来加密密码,但是ASP.Net仍然会发送原始密码进行身份验证。
有没有办法做到这一点?谢谢!
更新:
抱歉没有说清楚。我需要在服务器端加密密码。
我没有使用ASP.Net Membership在注册用户时加密或哈希密码。passwordFormat属性已设置为“Clear”。
我所做的是:
1. 当新用户注册时,我使用自定义函数来加密密码并保存到数据库中。 2. 当用户尝试登录时,我想使用相同的函数来加密用户输入的密码,并让ASP.Net对用户进行身份验证。
我遇到的问题是,在ASP.Net启动身份验证过程之前,我找不到调用加密函数的方法。
希望这有意义。谢谢。
Allen

只是确认一下:你是在页面上使用JavaScript进行加密,对吗?你不是试图在C#代码中进行加密吧?如果你无法钩入验证,那么你可能需要钩入表单元素的onsubmit。 - Rup
谢谢Rup。实际上,加密是在服务器端进行的。因为登录按钮上的登录命令(CommandName="Login")由ASP.Net自动处理,我不确定如何在执行登录命令之前更改密码。 - Allen Qin
在我看来,服务器端是无用的,因为您必须将密码传输到服务器,这就是我认为危险所在的地方。 - Pleun
3个回答

1

你在添加OnClick事件方面肯定是正确的。如果你想在客户端进行加密,那么你需要使用OnClientClick事件(OnClick发生在服务器端,而OnClientClick发生在客户端)。我最初假设你是用它来调用一个客户端javascript函数来进行加密的?

[编辑]

然而,如果你正在服务器端进行加密,并且使用登录控件,则可能需要使用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
}

感谢您的迅速帮助,Monty。根据您的建议,我首先加密了密码,然后手动调用Membership.ValidateUser方法来验证用户。它非常有效!感谢您的时间。 - Allen Qin
没问题,Allen。这是我第一次发布帖子,很高兴它很有用。我发现stackoverflow是获得高质量答案的最佳/唯一途径,所以如果可能的话,我想做出贡献。 - monty
你说得对,大多数时候我可以在这里得到非常有用的答案,并作为回报,我也会尽量做同样的事情来回馈社区。 - Allen Qin
1
ASP.NET成员资格提供程序不支持开箱即用的加密密码吗?我们为什么需要重新发明轮子?还是我错过了什么? - ryancrawcour

1

你为什么要在客户端加密密码然后再发送到服务器呢?这样做并不比直接发送明文密码更安全。你编写的加密代码可以被任何人查看。

在服务器上,你应该使用类似以下的方式:

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

实际上,安全公司的SSO网关会这样做 - 例如,我见过一个他们在提交密码之前使用JS将其加密为RSA密钥。不过我记不清原因了。 - Rup
@Rup,我曾经遇到过一个网站,他们在JavaScript中实现了登录系统。右键单击>查看源代码,你就可以得到用户名和密码。这在客户端上是不必要的,因为A. 你应该有SSL B. 你将进行HTTP Post。 - The Muffin Man
1
不,这是由一家正规的安全公司(我想是泰勒斯SSO)完成的,所以我相信他们有充分的理由。话虽如此,我也想不出一个:是的,用户最终是在网关服务器或HSM上进行身份验证,因此这是直接通道,但您必须信任Web服务器,因为没有办法防止服务器的中间人攻击。我会问一位同事是否记得为什么要这样做。 - Rup

0

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

有人在讨论为什么你需要它。我认为没有更好的解释,我会尝试提供我的看法:通过互联网传输的密码加密是必要的,如果你希望有人监听客户端计算机和服务器之间的通信。据我所知,如果用户在您的网站上单击登录按钮,他看到的页面实际上是在他的计算机上下载的,单击只会导致从客户端到服务器的数据传输。数据根本没有加密,任何邪恶的Eve都可以监听传输并获取客户端的明文密码。
但是您应该意识到,即使您发送了加密密码,加密也仅涵盖了明文密码问题。如果您的服务器端应用程序期望使用静态算法加密密码,而我的唯一目标(作为邪恶的Eve)是成功登录系统,我实际上不需要知道密码本身,其加密形式就足够了。这是一个相当复杂的问题,它取决于您的连接实际上需要多少安全性 - 如果成本(或您的努力)与风险相关。如果您真的非常重视最佳安全性,您应该遵循一些安全标准。
关于查看您的JavaScript编写的算法的观点是无关紧要的,只要它实现得很好(RSA是一种开放且易于访问的算法,足够安全)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接