Измените пароли пользователей Filezilla с помощью PHP SHA512 и Salt - PullRequest
1 голос
/ 10 мая 2019

Мы пытаемся сопоставить пароли пользователей нашего Filezilla Server 0.9.6 с теми, которые пользователь выбирает для входа на наш сайт.Все поиски в Google указывают на старые решения, которые реализуют MD5, но в более новых версиях используются SHA512 и Salt.Приведенный ниже код успешно обновляет файл XML сервера, но после перезапуска Filezilla новые пароли не работают.

Кто-нибудь сталкивался с этим и может указать, где этот код неверен?

Мой код С https://forum.filezilla -project.org / viewtopic.php? T = 39934

<?php
$password = "myNewPassword";

$seed = str_split("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~");
shuffle($seed);
$rand = '';
foreach (array_rand($seed, 64) as $k) {
    $rand .= $seed[$k];
}
$salt_raw = utf8_encode($rand);
$salt_html = htmlentities($salt_raw);
$password = utf8_encode($password);
$salted_password = $password . $salt_raw;
$encoded_password = strtoupper(hash('SHA512', $salted_password));

// For Filezilla
$FzPass = $encoded_password;
$FzSalt = $salt_html;

$xmlFile = 'C:\path-to\FileZilla Server.xml';
$xml = simplexml_load_file($xmlFile);
$Pass = $xml->xpath("//User[@Name='TheUserName']//Option[@Name='Pass']");
$Salt = $xml->xpath("//User[@Name='TheUserName']//Option[@Name='Salt']");

$Pass[0][0] = $FzPass;
$Salt[0][0] = $FzSalt;

$xml->formatOutput = true;
$saved = $xml->asXML($xmlFile);
chdir( 'C:\FileZilla Server' );
exec( '"C:\FileZilla Server\FileZilla Server.exe" /reload-config' );

До выполнения PHP Filezilla Server.xml

<?xml version="1.0" ?>
<FileZillaServer>
    <Users>
        <User Name="TheUserName">
            <Option Name="Pass">1ED89AFBA4FD8EF177EAAF21E6641C33FC870860D5F399CD9B0A79632B0F2B08B235DB7258DB2B6EB58402AF29A4C8491CC8F82ED9D2E74EABA8F7B240D0615F</Option>
            <Option Name="Salt">-Z5c@tci:e?E4E@H@(cq)/W1zDMs#F&gt;XsYd$M)0t#{/s,tc@]GJYf@{@T.&amp;O*5sF</Option>
            <Option Name="Group"></Option>
            <Option Name="Bypass server userlimit">1</Option>
            <Option Name="User Limit">0</Option>
            <Option Name="IP Limit">0</Option>
            <Option Name="Enabled">1</Option>
            <Option Name="ForceSsl">0</Option>
        </User>
    </Users>
</FileZillaServer>

После выполнения PHP

<?xml version="1.0" ?>
<FileZillaServer>
        <User Name="producer">
            <Option Name="Pass">57AECC6BBCCC8EE5A73F0E362E2434DBF617EC2C85404205D881B1B7A2D303405789F8B42DFE61EDD7CF197700B66307E998054615C8A9A1CA5A9988029F0EAD</Option>
            <Option Name="Salt">P,]mk&amp;amp;4N;v3`#&amp;lt;e8S?oj[U=Ja$}Q6~:\Z1{HuB&amp;gt;bnI/&amp;quot;M-pDh.qFylKfd0|LgT*G</Option>
            <Option Name="Group"/>
            <Option Name="Bypass server userlimit">1</Option>
            <Option Name="User Limit">0</Option>
            <Option Name="IP Limit">0</Option>
            <Option Name="Enabled">1</Option>
            <Option Name="ForceSsl">0</Option>
        </User>
</FileZillaServer>

1 Ответ

2 голосов
/ 10 мая 2019

SimpleXML будет автоматически кодировать * сущности XML, поэтому нет необходимости делать это в вашем PHP-коде с htmlentities(). Кроме того, я обновил ваш код, добавив в него правильный генератор случайных солей. Попробуйте!

<?php
$password = "myNewPassword";
$salt = "";
while (strlen($salt) !== 64) {
    $byte = ord(openssl_random_pseudo_bytes(1));
    if ($byte > 31 && $byte < 127) {
        $salt .= chr($byte);
    }
}

$hashed_password = strtoupper(hash('SHA512', $password . $salt));

$xmlFile = 'server.xml';
$xml = simplexml_load_file($xmlFile);
$Pass = $xml->xpath("//User[@Name='TheUserName']//Option[@Name='Pass']");
$Salt = $xml->xpath("//User[@Name='TheUserName']//Option[@Name='Salt']");

$Pass[0][0] = $hashed_password;
$Salt[0][0] = $salt;

$xml->formatOutput = true;
$saved = $xml->asXML($xmlFile);

* Существуют специальные символы (&, <, >, "), которые необходимо кодировать, чтобы не путать с частью разметки (не всегда , но проще просто всегда их кодировать.) Они кодируются как &amp;, &lt;, &gt; и &quot;, соответственно. Поскольку в закодированном значении есть специальный символ, вы можете увидеть, как происходит двойное кодирование, если поискать такие вещи, как &amp;lt;, как мы видим в вашем примере XML.

...