Расшифровать данные hex2bin с разными результатами из одного и того же вводаPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Расшифровать данные hex2bin с разными результатами из одного и того же ввода

Сообщение Anonymous »

Привет!
Я пытаюсь перенести свое приложение с Yii2 (PHP 7.4) на Laravel 12 (PHP 8.4), а также хочу перейти с MySQL 5.7 на Postgres.
В старом приложении я шифровал данные PII и сохранял их в базе данных следующим образом:

Код: Выделить всё

$data = \Yii::$app->security->encryptByPassword(serialize($pii), env('PII_ENCRYPTION_PASSWORD'));
$this->data['pii'] = bin2hex($data);
— это столбец json в MySQL 5.7.
Теперь я хочу расшифровать данные, потому что хочу извлечь некоторые из них для статистики.
В моем приложении Yii2 я делаю это следующим образом:

Код: Выделить всё

$pii = unserialize(Yii::$app->security->decryptByPassword(hex2bin($data), env('PII_ENCRYPTION_PASSWORD')));
В laravel я попытался скопировать весь соответствующий код из \yii\base\Security::decryptByPassword и добился этого с помощью настроек отладки, таких как $keySize. Поскольку это не сработало, я обнаружил, что вывод hex2bin в разных приложениях отличается.
Возможно ли это для разных версий PHP? Есть ли в моем коде yii2 невидимые символы?
Мой текущий код выглядит так:

Код: Выделить всё

class Yii2Decryptor
{
protected string $cipher = 'AES-256-CBC';

protected string $kdfHash = 'sha256';

protected string $macHash = 'sha256';

protected int $derivationIterations = 100000;

protected string $authKeyInfo = 'AuthorizationKey';

protected int $keySize = 16;

protected int $blockSize = 16;

public function decrypt(string $hexData, string $password): ?string
{
$data = hex2bin($hexData);

$keySalt = $this->byteSubstr($data, 0, $this->keySize);

$key = hash_pbkdf2($this->kdfHash, $password, $keySalt, $this->derivationIterations, $this->keySize, true);

$authKey = hash_hkdf($this->kdfHash, $key, $this->keySize, $this->authKeyInfo, $keySalt);
dump($hexData, $data, $keySalt, $key, $authKey); // $data is already different. Next line $data is `false`
$data = $this->validateData($this->byteSubstr($data, $this->keySize), $authKey);
if ($data === false) {
return null;
}

$iv = $this->byteSubstr($data, 0, $this->blockSize);
$encrypted = $this->byteSubstr($data, $this->blockSize);

$decrypted = openssl_decrypt($encrypted, $this->cipher, $key, OPENSSL_RAW_DATA, $iv);

return $decrypted === false ? null : $decrypted;
}

private function byteSubstr(string $data, int $start, ?int $length = null): string
{
if ($length === null) {
$length = $this->byteLength($data);
}

return mb_substr($data, $start, $length, '8bit');
}

private function byteLength(string $data): int
{
return mb_strlen($data, '8bit');
}

protected function validateData(string $data, string $key): false|string
{
$test = hash_hmac($this->macHash, '', '');
$hasLength = $this->byteLength($test);
if ($this->byteLength($data) >= $hasLength) {
$hash = $this->byteSubstr($data, 0, $hasLength);
$pureData = $this->byteSubstr($data, $hasLength);
$calculatedHash = hash_hmac($this->macHash, $pureData, $key);
if (hash_equals($hash, $calculatedHash)) {
return $pureData;
}
}

return false;
}

}
Тот факт, что вывод hex2bin уже отличается, сводит меня с ума...


Подробнее здесь: https://stackoverflow.com/questions/798 ... same-input
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»