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从数据库中获取的密码在存储时通过上述方法加密的方法。我不知道怎么做。任何人都可以帮助我吗?

4

3 回答 3

3

MD5 是一个散列函数(不是加密)并且是不可逆的。也就是说,您无法根据给定的哈希计算原始值。

更新:我推荐这篇描述如何安全存储密码哈希的文章。还有一个 C# 实现。

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

于 2013-02-13T09:59:09.277 回答
0

您无法对此进行解密,因为散列是一种单向函数 - 您无法获取散列值并将其转回原始值。

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


散列存在一个问题,即相同的输入值总是产生相同的散列值(否则上述登录机制将不起作用)。不幸的是,这意味着为通用密码字典生成哈希值是一项微不足道的练习。如果您的数据库遭到破坏,攻击者可以将您存储的所有哈希密码与他之前计算的值进行比较,如果他得到匹配,那么 Bazinga!他进入了你的数据。
为了防止这种情况,您在进行初始散列时可以做的是同时生成额外的随机数据位,这些数据在散列时与密码混合。这叫做(或者不太常见的随机数)。与其复制一些代码来执行此操作,在这一点上,我将指导您阅读 blowdart的《Beginning ASP.NET Security ( Amazon UK | Amazon US ) 一书》,其中讨论了所有这些内容——散列、加盐和“适当的'加密。

于 2013-02-13T10:27:23.933 回答
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
于 2013-02-13T10:11:18.033 回答