可以获取明文密码吗?

可以获取明文密码吗?

我在 20 多台 Plesk 服务器上托管托管服务,版本 11。与以前的版本一样,密码未加密,因此如果我必须设计一些工具来管理托管帐户,我只需从数据库中获取明文密码即可。但是由于现在密码已加密,有什么方法可以解密密码吗?通过 API 还是任何其他方式,以便我可以将基于 php 的托管管理与 plesk 11 集成?

答案1

Giulio 提供的代码没什么用,这里有一个可以真正起作用的 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'))

答案2

为什么不直接弄清楚 Plesk 使用的哈希算法,然后在您的 PHP 应用程序中复制该功能呢?您不需要密码的未加密版本来进行身份验证,而且您永远不会真正想要以明文或可逆加密的形式存储密码。

答案3

理论上来说,如果程序能够得到加密密码,是的,就可以取回明文密码。
编辑:添加了解密代码。

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;
}

答案4

我需要用 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;    
}    

相关内容