如何比较用户输入中插入数据库的加密密码?我注意到,当我测试我的程序时,我创建了一个帐户,他们都有相同的密码,但他们有不同的加密,我怎么知道用户输入是否与数据库中的输入相同? Encrypto这样做吗?或加密有一种独特的方式来确定哪个是哪个?
我是否在此代码中使用Encrypto?
var hasher = new Hasher();
hasher.SaltSize = 16;
//Encrypts The password
var encryptedPassword = hasher.Encrypt(txtPass.Text);
Account newUser = new Account();
System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding();
newUser.accnt_User = txtUser.Text;
newUser.accnt_Position = txtPosition.Text;
newUser.accnt_Pass = new System.Data.Linq.Binary(encoding.GetBytes(encryptedPassword));
答案 0 :(得分:2)
两个相同的密码可能导致不同的哈希值,因为加密会在对密码进行哈希处理之前将随机盐附加到密码的末尾。
在codeplex上查看source code for Hasher.cs,了解他们是如何做到这一点的。它们基本上使用salt来执行哈希,然后将salt附加到哈希的末尾。这是您存储在数据库中的内容。
当用户设置密码或新用户注册时,您将密码并将其存储在DB
中var hasher = new Hasher();
hasher.SaltSize = 16;
var hashedPasswordToStoreInDB = hasher.Encrypt(passwordToSet);
稍后当他们登录并输入密码时,您将用户键入的密码与从此处检索到的先前散列版本进行比较
var hasher = new Hasher();
hasher.SaltSize = 16;
bool areEqual = hasher.CompareStringToHash(enteredPassword, hashFromDatabase);
同样,如果您look at the source code(Hasher.CompareStringToHash
),您将看到从存储的哈希中恢复随机盐,然后用于根据输入的密码计算新哈希值。
答案 1 :(得分:0)
我不是特别了解Encrypto,但一般原则是这样的:你“密封”密码,然后对其进行加密,并将其存储到数据库中。当有人登录时,你重做同样的事情:盐,加密,然后,与存储在数据库中的其他哈希进行比较。
两个相同密码可能产生不同哈希值的原因是盐;在加密密码之前更改密码,这样只查看哈希值会使得更难以计算出散列机制。 salt可以始终相同(安全性差),用户名的功能,或者与数据库中加密密码一起存储的另一个随机字符串的功能。
同样,我不知道Encrypto,但是当您想要与用户输入密码进行比较时,只需使用与数据库中生成哈希相同的逻辑。