Расшифруйте зашифрованный сессионный ключ PBKDF2 в PHP 7.2 - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужно обновить сайт, за которым я присматриваю, до PHP 7.2.На этапе тестирования я обнаружил, что один из плагинов на сайте использовал библиотеку mcrypt, которая больше не доступна в PHP 7.2.

По сути, этот плагин получает зашифрованные данные PBKDF2 из системы тикетов (Tessitura).), который возвращает ключ сеанса пользователя, а также отметку времени и зашифрованную строку.

На панели управления мне были предоставлены данные для дешифрования этого ключа сеанса, такие как пароль, соль, ключ аутентификации / ключ HMAC,BlockSize, PaddingMode, EncryptionKeyIterations, EncryptionKeyLength и HMACLength

Изображение предоставленных полей

Я пытался решить, как расшифровать данные, но, признаюсь, яизо всех сил.C

Кто-нибудь подскажите, как использовать php 7.2 для достижения этой цели?Я нашел некоторые функции в пакете openssl, которые выглядят так, как будто они могут быть верным путем, но все они используют различную терминологию к информации, которую мне дали, и я не могу понять, с чего начать, что идет, куда или какие настройкииспользовать

Заранее спасибо всем, кто может решить эту проблему !!

1 Ответ

0 голосов
/ 16 апреля 2019

Как сказал Роб Нейпир, PBKDF2 - это то, что система использует для хеширования пароля, передаваемого в процесс шифрования.Сайт фактически использует шифрование aes-256-cbc.Этот процесс шифрования может включать пароль.

После того, как информация зашифрована, эта полезная нагрузка подписывается ключом HMAC.

Вы можете использовать библиотеку openSSL для выполнения всего этого в php 7 и выше.Вот пример кода, который создает класс для обработки шифрования / дешифрования, например:


$crypto = new AesCryptoClass('YOUR_PASSPHRASE_HERE',
                        'YOUR_HMAC_KEY_HERE',
                        'YOUR_SALT_HERE');
class AesCryptoClass {

    // These should not change
    private $hmacLength = 32;
    private $iterations = 1000;
    private $keyLength = 32;
    private $blockSize = 16;
    private $cipher = 'aes-256-cbc';

    function __construct($password,$hmacKey,$salt)
        {
            $this->password = $password;
            $this->hmacKey  = $hmacKey;
            $this->salt     = $salt;
        }

    function encrypt($plainText)
        {
            $iv = openssl_random_pseudo_bytes(16); 

            $encryptedBytes = $this->encryptInner($iv, $plainText);

            $encryptedMessage = $iv . $encryptedBytes;

            $mac = $this->hashMessage($encryptedMessage);

            $secureMessage = $mac . $encryptedMessage;

            $encryptedText = base64_encode($secureMessage);

            return $encryptedText;
        }

    function decrypt($encryptedText)
        {
            $secureMessage = base64_decode($encryptedText);

            $mac = substr($secureMessage, 0, $this->hmacLength);

            $encryptedMessage = substr($secureMessage, $this->hmacLength);

            $newMac = $this->hashMessage($encryptedMessage);

            if (strcmp($mac, $newMac) !== 0) {
                return "";
            }

            $iv = substr($encryptedMessage,0, $this->blockSize);

            $encryptedBytes = substr($encryptedMessage, $this->blockSize);

            $plainText = $this->decryptInner($iv, $encryptedBytes);

            return $plainText;
        }

    function encryptInner($iv, $plainText)
        {
            $encryptionKey = openssl_pbkdf2($this->password, $this->salt, $this->keyLength, $this->iterations);
            return openssl_encrypt($plainText, $this->cipher, $encryptionKey, OPENSSL_RAW_DATA, $iv);
        }

    function decryptInner($iv, $encryptedBytes)
        {
            $encryptionKey = openssl_pbkdf2($this->password, $this->salt, $this->keyLength, $this->iterations);
            return openssl_decrypt($encryptedBytes, $this->cipher, $encryptionKey, OPENSSL_RAW_DATA, $iv);
        }

    function hashMessage($encryptedMessage)
        {
            return pack("H*", hash_hmac("sha256", $encryptedMessage, $this->hmacKey));
        }
}

Этот код и описание процесса также включены сюда внизу вики: https://bitbucket.org/TN_WebShare/webpro-session-sharing-sample/wiki/Session%20Key%20Encryption%20and%20Decryption

...