2011-08-19 88 views
0

在比较密码之前,我必须做解密。我以前没有用过这个,谁能告诉我解密代码应该如何。谢谢在c中解密#

public string Encript(string password) 
     { 
      System.Security.Cryptography.MD5CryptoServiceProvider objCript = 
       new System.Security.Cryptography.MD5CryptoServiceProvider(); 
      byte[] bs = System.Text.Encoding.UTF8.GetBytes(password); 
      bs = objCript.ComputeHash(bs); 
      System.Text.StringBuilder s = new System.Text.StringBuilder(); 

      foreach (byte b in bs) 
      { 
       s.Append(b.ToString("x2").ToLower()); 
      } 
      password = s.ToString(); 
      return password; 
     } 

回答

0

就像其他用户以前说过的,MD5是单向散列算法。您无法解密哈希以检索原始密码。您可以做的最好的方法是“猜测”密码,使用MD5对其进行哈希处理,并将其与哈希值进行比较。这是一种强力方法,通常需要很长时间。如果在生成哈希时使用了盐,则需要更多时间。

如果你真的想找出原来的信息,你可以使用rainbow tables。这基本上是一个包含大量预计算散列的数据库,这会降低您的暴力攻击的总时间。但如果使用了盐,那么你在这里运气很差。

关于不良密码,哈希,盐,彩虹表等的好文章。可以在这里找到:

Bad passwords are not fun and good entropy is always important: demystifying security fallacies

你实际上并没有试图闯入别人的网站,现在是你吗?

0

你不能(容易)解密MD5。使用基于密钥的加密(除了简单的XOR加密之外,无法想象我的头顶上)

4

MD5算法不是密码算法,而是哈希生成器。哈希码应该是单向函数,因此没有“解密”。对于您的问题:您应该将密码保存在数据库MD5哈希中,所以只需比较哈希值!

+0

你应该确保没有人能够访问这些数据库数据,并且你也使用了一些“salt”(请问一些Unix(或者它是Linux?)家伙) – Carsten

+0

@CKoenig是的,这很重要,因为MD5是不是那么“单向”,因为它应该以这种简单形式:) – Matten

2

不要试图解密密码!

将加密的密码和使用的盐存储在某处。然后,当用户输入密码时,用相同的散列函数和盐对用户输入进行加密,并比较加密的值。

编辑:This article描述了通用的认证方法。

+0

提及盐+1。 – Tim

0

还有如何与给定的哈希使用MD5CryptoServiceProvider比较给定的字符串(比如用户密码)(说存储在数据库中的哈希密码为Matten建议)在MSDN上这里全长例如:

MD5CryptoServiceProvider Class

(事实上,你的代码看起来它从示例的一部分的。)

0

其实,没有解密。

你在这里做的是得到密码的MD5散列,而不是解密它。基本上,没有办法从密码中取回密码(至少不容易)。

MD5散列的一个用途是将散列存储在数据库中,而不是存储用户的密码。然后,当您收到来自用户的散列时,您将根据它计算散列并将其与已存储的密码进行比较。

向应用程序'salt'应用密码是一种很好的做法。这样,一个系统上的“密码”的散列与另一个系统上的“密码”的散列不同。看看这个问题举一个例子:MD5 hash with salt for keeping password in DB in C#