【问题标题】:Simple ASP.NET password hashing class troubles简单的 ASP.NET 密码哈希类问题
【发布时间】:2013-11-26 16:15:52
【问题描述】:

我正在尝试为我正在完成的大学项目应用一些安全性。这种安全性有点让人一目了然,所以我很想放弃,将密码保存为纯文本或转换为 base64,并做一些对用户更直观的事情。

在我放弃之前,我要问一下。这是我第一次尝试在这里提出任何问题,所以请温柔一点。

我认为实现这个 MSDN 代码不会太难。 http://msdn.microsoft.com/en-us/library/aa545602%28v=cs.70%29.aspx

事实证明,确实如此。我收到了错误

System.FormatException:输入字符串的格式不正确。

代码

binarySaltValue[0] = byte.Parse( salt.Substring( 0, 2 ), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture.NumberFormat );

说实话,我并不完全理解这段代码。

  1. SaltValueSize 应该是什么?提供的代码不提供它,任何参考也不提供。它也是大写的,所以它是一个对象吗?还是某个对象中的某个字段?
  2. 变量“hash”没有在任何地方定义,所以我只是用新的 MD5CryptoServiceProvider() 填充它。这是一个错误吗?
  3. 如果我没看错的话,字符串“salt”应该包含二进制文件,但在运行时它没有,它有乱码,同时所有崩溃的行都试图从“salt”解析二进制文件?为什么?

如果有人能解决这个问题或提供一个防白痴的异步哈希类,我将不胜感激。

(为我的随机用户名道歉,我不知道这是怎么发生的)

【问题讨论】:

  • 您的特定错误可能是变量salt 包含非数字字符,因此对于 NumberStyle 参数 (System.Globalization.NumberStyles.HexNumber),salt 的格式不正确。

标签: c# asp.net hash passwords salt


【解决方案1】:

这是一种基本方法(无盐),至少可以帮助您入门。它只是“散列”进来的字符串。

    private string GetHashedString(string _PW)
    {
        string _HashedPW = "";
        SHA512 sha = new SHA512CryptoServiceProvider();
        byte[] result;
        StringBuilder strBuilder = new StringBuilder();


        sha.ComputeHash(ASCIIEncoding.ASCII.GetBytes(_PW));
        result = sha.Hash;

        for (int i = 0; i < result.Length; i++)
        {
            strBuilder.Append(result[i].ToString("x2"));
        }

        _HashedPW = strBuilder.ToString();
        return _HashedPW;
    }

【讨论】:

  • 你是对的。我为盐实现了一个非常简单的“随机文本”生成器。我在明文的末尾添加了一个随机盐,通过 SHA256 将其扔掉(我没有空间容纳 512,但我稍后会)。
  • 太棒了! - 很高兴它有帮助!
  • 如何再次取消哈希以检查密码?
  • 你没有!如果您需要检查用户是否输入了正确的密码,您只需使用用于在用户输入中存储密码的相同加密方法。如果 2 个加密值匹配,则它们输入相同的输入(希望不是“password1234”)。取消散列某人密码的另一个原因是用户忘记了密码。虽然过去这在某种程度上是一种正常的做法,但现在您只需验证用户的合法性并允许他们重置密码 - 通常通过发送到帐户电子邮件地址的链接。
猜你喜欢
  • 2012-05-24
  • 2013-11-26
  • 2011-06-12
  • 1970-01-01
  • 2014-11-19
  • 2018-02-27
  • 1970-01-01
  • 2012-09-06
  • 2011-12-03
相关资源
最近更新 更多