Можно ли получить открытый текстовый пароль?
У меня есть хостинг, размещенный на более чем 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;
}