Можно ли получить открытый текстовый пароль?

У меня есть хостинг, размещенный на более чем 20 серверах Plesk, версия 11. Как и в предыдущих версиях, пароли не были зашифрованы, поэтому, если мне нужно было разработать некоторые инструменты для управления учетными записями хостинга, я просто взял пароли в виде открытого текста из База данных. но так как теперь пароли зашифрованы, есть ли способ расшифровать пароли? через API или любым другим способом, чтобы я мог интегрировать управление хостингом на основе php с plesk 11?

4 ответа

Решение

Код, предоставленный Джулио, бесполезен, вот скрипт Python, который на самом деле работает. Требуется PyCrypto (python-crypto). Предполагается, что секретный ключ Plesk хранится в /etc/psa/private/secret_key, Просто запустите его и передайте зашифрованные пароли в качестве аргументов:

./deplesk.py '$AES-128-CBC$T82uDt6NSdytfhjQaOIKGg==$CMJ6FIdAD8zJ0PgwQ3DosA=='

Автор сценария:

#!/usr/bin/env python
import sys
import base64
from Crypto.Cipher import AES

key = open('/etc/psa/private/secret_key', 'rb').read()

for pw in sys.argv[1:]:
    lead, typ, iv, ct = pw.split('$')
    iv = base64.b64decode(iv)
    ct = base64.b64decode(ct)
    assert typ == 'AES-128-CBC'
    plain = AES.new(key, mode=AES.MODE_CBC, IV=iv).decrypt(ct).rstrip(b'\0')
    print(plain.decode('utf8'))

Почему бы просто не выяснить, какой алгоритм хэширования использует Plesk, и воспроизвести эту функциональность в своем PHP-приложении? Вам не требуется незашифрованная версия пароля для аутентификации на нем, и вы никогда не захотите хранить пароль в открытом виде или с обратимым шифрованием.

Теоретически, если программа может получить пароль шифрования, да, вы можете вернуть пароль в виде простого текста.
РЕДАКТИРОВАТЬ: добавлен код расшифровки.

function decrypt_password($pass,$key)
{

$base64encoded_ciphertext = $pass;

$res_non = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($base64encoded_ciphertext), ‘ecb’);

$decrypted = $res_non;
$dec_s2 = strlen($decrypted);

$padding = ord($decrypted[$dec_s2-1]);
$decrypted = substr($decrypted, 0, -$padding);

return  $decrypted;
}

Мне нужно было, чтобы это было написано на PHP, поэтому я напрямую портировал версию @freebobbytables. Действует очарование. Протестировано с PHP 8.0.

      #!/usr/bin/env php    
<?php    
$passwords = array_slice($argv, 1);    
$key = file_get_contents('/etc/psa/private/secret_key');    
    
foreach($passwords as $password) {    
  list($lead, $type, $iv, $ciphertext) = explode('$', $password);    
  $iv = base64_decode($iv);    
    
  assert($type === 'AES-128-CBC');    
  $plain = openssl_decrypt($ciphertext, 'aes-128-cbc', $key, OPENSSL_ZERO_PADDING, $iv);    
  echo utf8_decode($plain) . PHP_EOL;    
}    
Другие вопросы по тегам