通过Hascode验证密码
本文关键字:密码 验证 Hascode 通过 | 更新日期: 2023-09-27 18:06:57
经过研究,我发现使用hascode来验证登录页面上的密码更安全,但谁能给我一些见解代码明智如何实现它?
我不会为你写代码,但我会简要地解释它是如何工作的。
首先,了解散列和加密之间的区别。如果您没有意识到两者的区别,请阅读以下内容:哈希和加密算法之间的根本区别
默认情况下,您的密码是明文,这是不好的。理想情况下,您希望能够以非明文方式存储该密码,以便您可以将其与用户发送给您的数据进行比较。为此,您可以存储加密密码或散列密码。
如果您选择存储加密的密码,这意味着您打算有朝一日检索原始的明文密码(实际上,您永远不需要这样做)。此外,你需要将密钥存储在某个地方,这会变得很混乱(因为你也不想存储明文,所以你加密了它,但随后你需要另一个密钥,等等),所以让我们假设你不想这样做。
如果您选择存储哈希密码,那么您存储的是该密码的固定长度表示。人类不能仅仅通过查看哈希来确定原始密码(这很好)。
在客户端,您仍然有他们需要提交的明文密码。这就是加密的用武之地。您需要对客户机和服务器之间的连接进行加密。用户提交他们的明文密码,它被加密,所以没有人能理解它,你的服务器解密它,然后立即散列它。此时,您可以将该哈希值与存储在数据库中的哈希值进行比较。
请注意,客户端散列密码并假设不再需要加密是不安全的。
将给定密码转换为其哈希值:
using System.Security;
using System.Security.Cryptography;
...
public static String GetHashValue(String password) {
// You may find useful to add "salt" here:
// Byte[] buffer = Encoding.ASCII.GetBytes(password + "some const irregular string");
Byte[] buffer = Encoding.ASCII.GetBytes(password);
// I've chosen the strongest (but the longest) hash provider
using (SHA256 provider = SHA256Managed.Create()) {
return String.Join("", provider.ComputeHash(buffer).Select(x => x.ToString("X2")));
}
}
然后尝试通过他/她的登录名和密码哈希找到用户:
select permissions,
...
from Users
where login = @prm_login and
password_hash = @prm_password_hash
注意,您不在数据库中存储密码(例如"123"),而是哈希值(例如"A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7A27AE3"
)