【问题标题】:Decrypt method from encryption function加密函数中的解密方法
【发布时间】:2013-02-13 09:55:54
【问题描述】:

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

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

【问题讨论】:

  • 您没有使用 MD5 加密任何内容。您正在生成一个不可逆的哈希。您应该通过生成给定密码的哈希值来比较密码,并将其与存储的哈希值进行比较。
  • 扭转这种情况的唯一方法是猜测正确的密码。顺便说一句,这不是一个好的密码哈希,原因有两个:1)没有盐 2)MD5 很快。您应该改用 PBKDF2、bcrypt 或 scrypt。
  • @RanhiruCooray 不,我没有。当我将新的加密密码与旧密码进行比较时,即已经加密存储在数据库中,如果密码匹配,它不会返回 true。这 ?周围变成了一个矩形?
  • 顺便说一下,您通常不希望将哈希字节直接转换为 UTF-8 字符串。如果你想要一个字符串表示,坚持例如基数 64 (Convert.ToBase64String)。这可能就是您得到“矩形”而比较失败的原因。
  • 此外,我会使用加盐方法使密码更安全。没有它,很容易获得密码。

标签: c# asp.net password-hash


【解决方案1】:

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

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

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

【讨论】:

  • 但是您通常可以通过猜测许多候选密码来恢复它,这在实践中效果很好。
  • 因此,当我将新的加密密码与旧密码进行比较时,如果密码匹配,它不会返回 true。这 ?改为问号周围的矩形
  • 从技术上讲,您并没有反转散列,而是导致了冲突。最后,当然,对于大多数实际目的来说都是一样的。这就是为什么您要存储加盐哈希并使用 PBKDF2 之类的东西。
  • @AndreLoker 谢谢,但我无法更改所有用户的密码。我想将新密码与旧密码进行比较..如何实现?
  • 通过比较哈希值。您生成旧密码的哈希并生成新密码的哈希。然后您只需将 Base64Strings(哈希)与 ==Equals-方法进行比较。
【解决方案2】:

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

【讨论】:

  • 请不要再叫它“加密”了。
  • 散列。您正在创建密码的哈希值。
  • 无意冒犯,很容易混淆条款。
  • @coder 伙计,我难道没有那么大的意义..?自己试试,编码后的密码和你从数据库得到的密码不匹配。
【解决方案3】:

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

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


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

【讨论】:

    猜你喜欢
    • 2016-01-10
    • 2012-02-27
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多