使用Encrypto比较数据库和用户输入中的加密密码

时间:2012-02-24 19:47:37

标签: c# linq linq-to-sql encryption codeplex

如何比较用户输入中插入数据库的加密密码?我注意到,当我测试我的程序时,我创建了一个帐户,他们都有相同的密码,但他们有不同的加密,我怎么知道用户输入是否与数据库中的输入相同? 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));

2 个答案:

答案 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 codeHasher.CompareStringToHash),您将看到从存储的哈希中恢复随机盐,然后用于根据输入的密码计算新哈希值。

答案 1 :(得分:0)

我不是特别了解Encrypto,但一般原则是这样的:你“密封”密码,然后对其进行加密,并将其存储到数据库中。当有人登录时,你重做同样的事情:盐,加密,然后,与存储在数据库中的其他哈希进行比较。

两个相同密码可能产生不同哈希值的原因是盐;在加密密码之前更改密码,这样只查看哈希值会使得更难以计算出散列机制。 salt可以始终相同(安全性差),用户名的功能,或者与数据库中加密密码一起存储的另一个随机字符串的功能。

同样,我不知道Encrypto,但是当您想要与用户输入密码进行比较时,只需使用与数据库中生成哈希相同的逻辑。

相关问题