2012-04-22 2 views
0

해시 방법에 소금을 저장할 방법이 있습니까? 나는 그것을 어떻게하는지 모른다?해시 값 저장

감사합니다.

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); 
    } 
+0

'byte []'에 저장할 수 있습니다. 실제 질문은 무엇입니까? –

+0

학생 개체에 새 필드 소금을 만들면altalt()를 생성 할 때 필드에 소금을 넣으시겠습니까? – Prescott

+0

미안 해요 아직도 메신저를 잃었습니다 –

답변

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); 
} 
+0

감사합니다 Lordcheeto (btw cheetos는 훌륭합니다!) 가능한 답변으로 내 질문을 업데이트했습니다. –

+0

datamember가 이미 바이트 []이면 당신은'byte [] salt = GenerateSalt();'가 필요하다고 생각하지 않습니까? –

+0

@KirstyWhite 내가 말할 수있는 한, 그것은 옳았다. 그래, 나는 그것에 많은 생각을하지 않았다. – lordcheeto