명령줄을 통해 openssl이 PHP와 같은 비밀번호를 암호화하도록 만드는 방법

명령줄을 통해 openssl이 PHP와 같은 비밀번호를 암호화하도록 만드는 방법

이 PHP 스크립트(encrypt.php)가 있습니다.

<?php
    function encrypt($pure_string, $encryption_key, $encryptionMethod = "AES-256-CBC")
    {
        $iv = "3571984260";
        $encrypted_string = openssl_encrypt($pure_string, $encryptionMethod, $encryption_key, false, $iv);
        return $encrypted_string;
    }

    echo encrypt ("$argv[1]", 'mysecret');
?>

작동하지만 openssl cli를 통해 동일한 결과를 얻으려고 합니다(필요합니다).

하지만 이것은:

echo '12345' | openssl enc -aes-256-cbc -iv "3571984260" -k mysecret -a

다음과 같은 결과가 생성되지 않습니다.

php encrypt.php 12345

실제로 쉘 버전은 실행될 때마다 생성된 문자열을 변경하는 반면, PHP 버전은 항상 동일한 문자열을 생성합니다. PHP 스크립트와 동일한 결과를 얻으려면 openssl cli를 사용해야 합니다.

내가 뭘 잘못했나요?

답변1

찾았어요!

php에서는 변수 ivkey변수를 문자열로 사용하므로 opensslCLI는 앞으로 설명할 것처럼 공백과 개행 문자가 없는 문자열의 16진수 버전을 기대합니다.

먼저 다음을 사용하여 iv를 변환하고 문자열을 16진수로 전달해야 합니다.

IV에 해당하는 16진수를 결정합니다.

hexiv=$(echo $(echo -n '3571984260' | od -A n -t x1) | tr -d " ")

16진수에 해당하는 값을 결정합니다 mysecret.

hexpass=$(echo $(echo -n 'mysecret' | od -A n -t x1) | tr -d " ")

이제 한 가지 더, php의 패스는 openssl cli의 패스가 아니라 KEY입니다:

echo -n '12345' | openssl enc -aes-256-cbc -iv "$hexiv" -K "$hexpass" -a

이제 PHP 스크립트와 똑같이 작동합니다!

중요: 대문자를 사용해야 합니다 -K. 그렇지 않으면 결과 문자열이 동일하지 않습니다.

관련 정보