C # переведенная функция хеширования не работает?

Я получу право на вопрос,

У нас есть этот блок кода C #

using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, passwordSaltBytes, iterationCount))
{
pbkdf2Bytes = pbkdf2.GetBytes(derivedLength + iterationCountBytes.Length);
}

Возвращает байтовый массив, первый индекс имеет значение 252

Мы пытаемся сделать то же самое в PHP:

$key = hash_pbkdf2("SHA1", $password, $password.$salt, $iterationCount, 48);

Первый индекс 102 …

Все значения совпадают перед этой конкретной частью.

Это просто та функция хеширования, которая не дает мне последовательных результатов.

Любая помощь приветствуется, ура.

редактировать — Если это не очевидно, я пытаюсь понять, почему эти два значения не совпадают, какую кодировку / декодирование и т. Д. Я неправильно понимаю или делаю неправильно.

0

Решение

Это полный код C #. Как вы можете видеть, есть некоторые ненужные циклы и т. Д., Но причины, по которым это не сработало, 2:

  1. Как кто-то указал, байты в PHP не выводят необработанные данные по умолчанию, и, следовательно, хэш (и, следовательно, как таковой) его байтов не был идентичен хешу сценария C #.
  2. Ранее я думал (как и другие отмечали), что я должен пройти в $salt как это без какой-либо кодировки или преобразования. Но при ближайшем рассмотрении фактического кода C # … мы можем увидеть во 2-м for i цикл, который они на самом деле добавляются saltBytes на passwordBytesсоздавая что-то похожее на $password.$salt в PHP

Объединение двух вышеперечисленных вопросов:

  • Отправка $password.$salt вместо одного, а затем установить $raw_output Параметр true, выводит тот же хеш, что и те же байты, что и C #.

        byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
    byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
    byte[] iterationCountBytes = BitConverter.GetBytes(iterationCount);
    int derivedLength = passwordBytes.Length + saltBytes.Length;
    byte[] passwordSaltBytes = new byte[derivedLength];
    byte[] pbkdf2Bytes;
    string encryptedString;for (int i = 0; i < passwordBytes.Length; i++)
    {
    passwordSaltBytes[i] = passwordBytes[i];
    }for (int i = 0; i < saltBytes.Length; i++)
    {
    passwordSaltBytes[passwordBytes.Length + i] = saltBytes[i];
    }
    
    using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, passwordSaltBytes, iterationCount))
    {
    pbkdf2Bytes = pbkdf2.GetBytes(derivedLength + iterationCountBytes.Length);}
    

Благодарю.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]