2012-02-24 34 views
0

如何比较我从用户输入插入到数据库中的加密密码?我注意到在测试我的程序时,我创建了一个帐号,它们都具有相同的密码,但它们具有不同的加密,我怎么知道用户输入是否与数据库中的输入相同? Encrypto是这样做的吗?或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

它是做你想做的?我没有看到你指出了你正在使用什么类型的加密,更不用说生成密钥和盐了,你知道加密密码不安全吗? – 2012-02-24 19:50:59

+0

我使用这个http://encrypto.codeplex.com/ – KyelJmD 2012-02-24 19:52:26

+0

看看http://thecodemechanic.wordpress.com/2011/06/07/introduction-to-strong-cryptography-p1-0-hash-功能 - 美国爱国者/ – 2012-02-24 20:02:44

回答

2

两个相同的密码会导致不同的散列,因为Encrypto在散列它之前将一个随机盐附加到密码的末尾。

在codeplex上检查出source code for Hasher.cs看他们是如何做到这一点的。他们基本上使用salt来完成散列,然后将salt附加到散列的末尾。这是你在数据库中存储的内容。

当用户设置自己的密码或新用户注册,你散列密码,并将其存储在数据库中

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),你会看到随机盐是从存储的哈希回收,然后用于计算从一个新的哈希输入密码。

+0

例如,如果我这样做var encryptedPassword = hasher.Encrypt(passwodfield.Text);我会把var enryptedPassword放在数据库中吗?然后如果我想登录,我会检索它然后使用布尔areEqual = hasher.CompareStringToHash(enterePassword,queryResult)? – KyelJmD 2012-02-25 02:41:19

+0

是的。我编辑了我的答案,以便更清楚地了解这一点。 – 2012-02-25 08:39:40

0

我不知道Encrypto特别,但总的原则是这样的:你的“盐”的口令,然后加密,并将其存储到数据库中。当有人登录时,您重做相同的事情:盐,加密,然后,与存储在数据库中的其他哈希进行比较。

为什么两个相同的密码可能产生不同的哈希是盐;你在加密密码之前改变密码,以便查看哈希值只会让你很难确定你的哈希机制。 salt可以始终是相同的(安全性较差),用户名的功能或者随同加密密码一起存储在数据库中的另一个随机字符串的功能。

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

相关问题