Есть один проект, над которым я работал phpseclib (для php5) и мы используем код ниже, чтобы подписать зашифрованную строку и отправить ее с запросом во внутренний API для процессов проверки.
function GetSignature($message) {
$rsa = new Crypt_RSA();
$sPath = PRIVATE_KEY_FILE; //defined elsewhere
$sKey = file_get_contents($sPath);
$rsa->LoadKey($sKey);
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
return $rsa->sign($message);
};
Для строки, которая содержит метку времени, соединенную с URL (например, 1490239371+https: // апи-домен / апи / конечная точка), который будет генерировать строку, как показано ниже. Эта строка отправляется в заголовке запроса, а строка ниже является выводом во внутреннем журнале консоли API.
Rsh1dv5ZGaPjCb6pgEsMrXwZbAeVgxVK / + 5d5bxu7BfDzaILl ++ / пи / WxDP4H2qJ7Ayp6QnYXGckIIYX9l9fKOJoShOZOkB19RxaNdBL5vLjKk409XVRY / GKGz3kHmZmTcyBYDPQaT / VFOQTd7 + o0d1mBY4EbHadI3f + kahHz4U =
В новом проекте я пытаюсь воссоздать это, потому что нам нужно использовать тот же внутренний API. Более новый проект использует composer (и laravel), поэтому добавление в него phpseclib версия 2.0. Константы были изменены на константы класса, но, кроме того, кажется, что методы идентичны. Ниже приведен код, который я добавил для репликации предыдущего кода в другой кодовой базе.
use phpseclib\Crypt\RSA as Crypt_RSA;
class EncyptionController {
public static function GetSignature($message) {
$rsa = new Crypt_RSA();
$path = config('app.encryption_key_path') . '/certs/private.pem';
$rsa->loadKey(file_get_contents($path));
$rsa->setSignatureMode(Crypt_RSA::SIGNATURE_PKCS1);
return $rsa->sign($message);
}
С более новым кодом строка того же формата выдает зашифрованную строку, содержащую символы Юникода. Приведенная ниже строка появляется во внутреннем журнале консоли API (при регистрации значения, полученного в заголовках запроса).
= ˭ \ u0003uʂ \ u000e_ \ u0013 \ u000bd) W8 \ u0018q
Регистрация в журнале Laravels показывает его с символами Unicode (без закодированных объектов — я открыл его в Notepad ++):
= ŽšîË’uÊ,_d) wË8ƒ»ñ’¤úqýÁ <þ:?!?
А затем внутренний API дешифрует закодированную строку с помощью открытого ключа. Для более новой кодовой базы это не удается. Внутренний API реализован в Nginx / NodeJS и использует крипто- И его verifier.verify () метод.
На основе комментарий от Альваро Гонсалес, выяснилось, что версия 2.0 знак() Метод возвращает необработанный двоичный хеш. я могу использовать base64_encode () в base-64 закодируйте его, но строка немного короче (88 символов), чем строки, созданные в версии 1.0 (172 символа).
return base64_encode($rsa->sign($message));
строка версии 1.0 — длиной 172 символа:
Rsh1dv5ZGaPjCb6pgEsMrXwZbAeVgxVK / + 5d5bxu7BfDzaILl ++ / пи / WxDP4H2qJ7Ayp6QnYXGckIIYX9l9fKOJoShOZOkB19RxaNdBL5vLjKk409XVRY / GKGz3kHmZmTcyBYDPQaT / VFOQTd7 + o0d1mBY4EbHadI3f + kahHz4U =»
«Rsh1dv5ZGaPjCb6pgEsMrXwZbAeVgxVK / + 5d5bxu7BfDzaILl ++ / пи / WxDP4H2qJ7Ayp6QnYXGckIIYX9l9fKOJoShOZOkB19RxaNdBL5vLjKk409XVRY / GKGz3kHmZmTcyBYDPQaT / VFOQTd7 + o0d1mBY4EbHadI3f + kahHz4U =
строка версии 2.0 — длина 88 символов:
MYT / MSb9UOuDDQ1RV893Ix7xh21IRHINs6o1PnhdhffgTAIeX4le1rfd + EzoPPJN9pvvwirm3CAbkeubGjXgWQ ==
Есть ли способ установить длину подписанной строки?
В версии 2.0 это RSA (), а не Crypt_RSA (). http://phpseclib.sourceforge.net/2.0.html конкретизирует.
Во всяком случае, в base64, декодируя два ваших зашифрованных текста и затем получая длину каждого … первого (полученного с помощью phpseclib-php5), я получаю 256 байтов или 2048 бит. Второй (созданный phpseclib 2.0) составляет 64 байта 512 бит.
Я думаю, что вы используете разные ключи разной длины для каждого из них, и это определенно повлияет на длину.
Других решений пока нет …