2013-02-13 40 views
0

我有一个用于加密的密码,并将其存储到数据库中,如下的方法:解密方法

public static string Md5Encrypted(string password) 
     { 
      byte[] pass = Encoding.UTF8.GetBytes(password); 
      MD5 md5 = new MD5CryptoServiceProvider(); 
      string strPassword = Encoding.UTF8.GetString(md5.ComputeHash(pass)); 
      return strPassword; 
     } 

现在我想的是decrypt,我从中数据库获取密码的方法在存储它时通过上述方法进行加密。我不知道该怎么做。任何人都可以帮助我吗?

+2

你没有用MD5加密任何东西。你正在生成一个不可逆的散列。您应该通过为给定密码生成散列并将其与存储的散列进行比较来比较密码。 – 2013-02-13 09:59:29

+0

扭转这种情况的唯一方法是猜测正确的密码。这不是一个好的密码哈希btw有两个原因:1)没有盐2)MD5很快。您应该使用PBKDF2,bcrypt或scrypt。 – CodesInChaos 2013-02-13 10:01:25

+0

@RanhiruCooray不,我没有。当我比较新的加密密码和旧密码时,即已经存储在数据库中的加密密码时,如果密码匹配,则不会返回true。该?变成了一个矩形? – Dev 2013-02-13 10:06:01

回答

3

MD5是一个散列函数(不是加密),是不可逆的。也就是说,你不能计算给定散列的原始值。

更新:我推荐本文介绍如何安全地存储密码散列。还有一个C#实现。

http://crackstation.net/hashing-security.htm

+0

但是,您通常可以通过猜测许多候选密码来恢复它,这在实践中效果很好。 – CodesInChaos 2013-02-13 10:02:07

+0

因此,当我比较新的加密密码和旧密码时,如果密码匹配,它不会返回true。该?被改为一个围绕问号的矩形 – Dev 2013-02-13 10:04:11

+0

从技术上讲,你不是在颠倒哈希,而是造成了碰撞。当然,最终它对于大多数实际用途都是一样的。这就是为什么你要存储盐渍散列并使用像PBKDF2这样的东西。 – 2013-02-13 10:04:21

0

MD5散列函数是不可逆的,不能被解密,如果要检查登录时用户名和密码,然后做..

1.While registering a new user, Hash the password and store it in database. 

2.During login,Hash the password entered by the user 

3.Now,Compare the password entered(Hashed) with password stored in database(Hashed) 

4.If both of them are same then allow user to login else display an error 
+2

请停止称它为“加密”。 – 2013-02-13 10:11:59

+0

@AndreLoker然后它叫什么.. – coder 2013-02-13 10:12:50

+0

哈希。您正在创建密码的散列。 – 2013-02-13 10:13:30

0

您不能解密这一点,因为哈希是一种单向函数 - 您不能将哈希值变回原始值。

由于它看起来像你正在处理密码,因此我认为这是某种登录机制,这可能(可能)确定。你需要做的是散列密码(如你所做的那样),并在用户在你的网站上注册时存储散列值。当用户返回到您的网站时,您将输入的密码,哈希值(使用相同的方法),并将哈希值与您存储的值进行比较。如果两个哈希匹配,则输入正确的密码。


有一个问题,哈希,在相同的输入值总是产生相同的散列值(否则为登录上述机制将无法正常工作)。不幸的是,这意味着为例如a dictionary of common passwords生成哈希值是一件小事。如果您的数据库受到攻击,攻击者可以将您存储的所有哈希密码与先前计算的值进行比较,如果他获得匹配,则Bazinga!他已经掌握了你的数据。
为了防止这种情况发生,当您执行初始哈希操作时,您可以执行的操作是同时生成一些额外的随机数据,这些数据会随着密码被散列而混入其中。这被称为(或不常见的现时)。在这一点上,我将引导你去blowdart的Beginning ASP.NET Security(Amazon UK | Amazon US),它讨论了所有这些东西 - 哈希,盐渍和'正确'加密。