2016-06-06 2 views
-1

Я использовал следующий код, чтобы получить мои производные паролей с помощью SHA1:Почему PasswordDeriveBytes и Rfc2898DeriveBytes дают разные результаты?

string passPhrase = "[email protected]";   
string saltValue = "[email protected]";   
string hashAlgorithm = "SHA1";    
int passwordIterations = 2;  

PasswordDeriveBytes password = 
    new PasswordDeriveBytes (passPhrase, saltValueBytes, hashAlgorithm, passwordIterations); 

Тогда я получаю байты, выполнив:

var bytes = password.GetByes(32); 

Я видел, что я должен использовать вместо Rfc2898DeriveBytes. Так что я теперь заменить его:

Rfc2898DeriveBytes password1 = new Rfc2898DeriveBytes(passPhrase, saltValueBytes, passwordIterations); 

Но когда я делаю:

var bytes = password.GetBytes(32); 

я не получаю то же значение. Любая подсказка?

+3

Хорошо, почему бы вы * ожидать * получить одинаковые значения, когда вы используете два разных алгоритма для получения паролей? –

+0

Это не то же самое? Я читал, что Rfc2898DeriveBytes использует SHA1 по умолчанию. – VAAA

+0

Использует HMACSHA1. Я не знаю достаточно о деталях, чтобы узнать, будет ли это так же, но меня это не особенно удивляет, что это не так. –

ответ

3

Rfc2898DeriveBytes использует PBKDF2, а PasswordDeriveBytes использует модифицированную версию PBKDF1. Они несовместимы друг с другом.

Учитывая, что это функция MACing, вы также не можете преобразовывать их из одного в другой.

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

+1

Это хорошая причина всегда включать индикатор версии. – zaph

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