2010-02-24 2 views
3

У меня есть метод создания хешированного пароля. Однако он падает на соль. CopyTo (pwd, 0); Говорит, что целевой байт [] слишком мал. Как решить проблему?Проблема с копией байта [] в другой байт []

public static byte[] CreateHashedPassword(string password, byte[] salt) 
     { 
      SHA1 sha1 = SHA1.Create(); 
      byte[] pwd = CustomHelpers.StringToByteArray(password); 
      salt.CopyTo(pwd, 0); 
      sha1.ComputeHash(pwd); 

      return pwd;    
     } 
+3

Вы действительно намеревались перезаписать часть байтов, сгенерированных из SHA пароля солью, или вы намеревались вставить соль до этих байтов? –

+0

Мои намерения - добавить соль к началу пароля, прежде чем объединить их. – Jova

ответ

9

Вам нужно создать более длинный массив байтов содержит как соль и пароль:

byte[] result = new byte[salt.Length + password.Length]; 
    salt.CopyTo(result, 0); 
    password.CopyTo(result, salt.Length); 
+0

Это не должно быть случайным, вам нужно знать, что это такое, чтобы проверять пароли на хешированный и соленый пароль. –

+1

Зак: Это должно быть случайным, но вы должны сохранить его копию. Но теперь я изменил свой ответ, когда понял, что он пытался сделать (вставьте байты в начале массива). –

+0

Из того, что я понимаю, это не обязательно быть случайным, поскольку цель соли - победить атаки радужного стола. Даже если плохие парни знают, что такое соль, им все же приходится вручную вычислять хэши паролей. –

0

Насколько велика соль? Намерены ли вы добавить это к паролю?

Вот как добавить его в начало пароля:

byte[] pwdAndSalt = new byte[pwd.Length + salt.Length]; 
for (int i = 0; i < pwdAndSalt.Length; i++) 
{ 
    if (i < salt.Length) 
    { 
     pwdAndSalt[i] = salt[i]; 
    } 
    else 
    { 
     pwdAndSalt[i] = pwd[i - salt.Length]; 
    } 
} 
1

Может быть что-то вроде этого?

public static byte[] CreateHashedPassword(string password, byte[] salt) 
{ 
    SHA1 sha1 = SHA1.Create(); 
    byte[] pwd = CustomHelpers.StringToByteArray(password); 
    byte[] pwdPlusSalt = new byte[salt.Length + pwd.Length]; 
    salt.CopyTo(pwdPlusSalt, 0); 
    pwd.CopyTo(pwdPlusSalt, salt.Length); 

    return sha1.ComputeHash(pwdPlusSalt); 
} 
+0

Спасибо, Джеффри, именно так выглядит мой код после добавления того, что предложил Марк. – Jova

Смежные вопросы