【问题标题】:Store hash value存储哈希值
【发布时间】:2012-04-24 20:09:23
【问题描述】:

有没有办法为这个哈希方法存储盐?不知道怎么弄?

谢谢。

    public void AddStudent(Student student)
    { 
        student.StudentID = (++eCount).ToString();
        student.Salt = GenerateSalt();
        byte[] passwordHash = Hash(student.Password, student.Salt);
        student.Password = Convert.ToBase64String(passwordHash);
        student.TimeAdded = DateTime.Now;
        students.Add(student);
    }

【问题讨论】:

  • 您可以将其存储在byte[] 中。真正的问题是什么?
  • 在你的学生对象上创建一个新的字段盐,然后当你生成alt()的时候,把盐放在字段中?
  • 抱歉我还是迷路了
  • 我是否只是将 Salt 作为数据成员放入 Student 中?然后说类似byte[] passwordHash = Hash(student.Password, GenerateSalt(student.Salt));
  • 是的,你可以这样做。盐不必保密。

标签: c# linq authentication hash salt


【解决方案1】:

这应该符合您的要求。不确定这些学生的存储位置,但也可能需要更改。

[DataMember(Name = "StudentID")]
public string StudentID { get; set; }
[DataMember(Name = "FirstName")]
public string FirstName { get; set; }
[DataMember(Name = "LastName")]
public string LastName { get; set; }
[DataMember(Name = "Password")]
public string Password;
[DataMember(Name = "Salt")]
public byte[] Salt;

protected RNGCryptoServiceProvider random = new RNGCryptoServiceProvider();

public byte[] GenerateSalt()
{
    byte[] salt = new byte[10];
    random.GetNonZeroBytes(salt);
    return salt;
} 

public static byte[] Hash(string value, byte[] salt)
{
    return Hash(Encoding.UTF8.GetBytes(value), salt);
}

public static byte[] Hash(byte[] value, byte[] salt)
{
    byte[] saltedValue = value.Concat(salt).ToArray();

    return new SHA256Managed().ComputeHash(saltedValue);
}

public void AddStudent(Student student)
{
    byte[] salt = GenerateSalt();

    student.StudentID = (++eCount).ToString();
    byte[] passwordHash = Hash(student.Password, salt);
    student.Salt = salt;
    student.Password = Convert.ToBase64String(passwordHash);
    student.TimeAdded = DateTime.Now;
    students.Add(student);
}

【讨论】:

  • 感谢 Lordcheeto(顺便说一句,cheetos 太棒了!)我已经用可能的答案更新了我的问题,它看起来正确吗?
  • 如果数据成员已经是一个字节[],我认为你不需要byte[] salt = GenerateSalt();
  • @KirstyWhite 据我所知,它看起来不错。是的,我只是没有考虑太多。
  • 你花了几秒钟却花了我几个小时哈哈,但是我猜每个人都按照自己的节奏学习。现在开始尝试将我的哈希值与学生密码进行比较。
  • @KirstyWhite 哦,注意到可能有问题:byte[] passwordHash = Hash(student.Password, GenerateSalt());。您将希望从学生或其他人那里获取密码,除非您将旧的、不安全的密码转换为加盐哈希。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 2010-10-11
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2017-01-22
相关资源
最近更新 更多