Я получу право на вопрос,
У нас есть этот блок кода 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 …
Все значения совпадают перед этой конкретной частью.
Это просто та функция хеширования, которая не дает мне последовательных результатов.
Любая помощь приветствуется, ура.
редактировать — Если это не очевидно, я пытаюсь понять, почему эти два значения не совпадают, какую кодировку / декодирование и т. Д. Я неправильно понимаю или делаю неправильно.
Это полный код 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);}
Благодарю.
Других решений пока нет …