我已经实现了一个 md5 哈希加盐算法。
使用此算法,我已将散列密码和盐值保存到数据库中。然后在登录页面上检索登录用户的盐值,获取密码字节添加盐值和计算的哈希值并将结果与保存的密码匹配,它工作正常但我仍然能够以明文形式看到我的密码值在客户端。
如何在客户端与 md5 哈希加盐算法一起加密密码值?
你做对了。在不知道盐的情况下,您将无法在客户端散列密码(并且将盐传递给客户端不是一个好主意)。如果您希望客户端发送的数据是安全的,请使用ssl。
注意:如果你使用 ssl 客户端仍然会able to see my password value in clear text
因为数据只会在发送前被加密。
您可以使用数据保护 API (DPAPI)在客户端安全地存储密码。使用 SafeString 类将密码存储在内存中,并且正如 @PLB 已经提到的,使用加密连接。
有很多不同的方法可以解决这个问题,我现在能想到的最简单的方法就是使用某种挑战;服务器发送一个值,客户端必须用作盐。服务器确保该值是唯一的,没有过期,并且只使用一次(这确保了重放攻击是不可能的。)
这样可以确保不发送纯文本密码,而只发送散列密码。服务器可以信任(与进行纯文本身份验证时一样信任)客户端不会简单地重新发送一些旧哈希,因为需要明文密码才能使用“一次性盐”计算哈希。
另一种更复杂(和安全)的方法是从服务器拥有公钥和客户端私钥的密码生成 RSA 密钥对。客户端还拥有服务器公钥的副本。用户输入密码,只有正确的密码才能得到正确的rsa-key。
然后,用户使用服务器的公钥对请求进行加密,然后使用用户的私钥对请求进行签名。然后只有服务器可以解密请求,并且服务器可以通过使用用户的公钥验证签名来验证发送者确实是正确的用户。而反应恰恰相反。为了增加一些安全性,您应该添加一些独特的“盐”,就像我之前写的那样,以确保重放攻击是不可能的。
如果您担心在文本框中输入的密码。然后将文本框的TextMode更改为密码
像这样
<asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox>