Como fazer openssl encriptar senhas como php via linha de comando

0

Eu tenho este script 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');
?>

Funciona, mas estou tentando alcançar o mesmo resultado via openssl cli (eu preciso).

Mas isso:

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

Não produz os mesmos resultados que:

php encrypt.php 12345

Na verdade, a versão do shell está alterando a string gerada para cada execução, e a versão do php está sempre gerando o mesmo. Eu preciso obter os mesmos resultados que o script php usando openssl cli.

O que estou fazendo de errado?

    
por Luciano Andress Martini 19.07.2016 / 20:41

1 resposta

2

Eu descobri!

O php usa iv e key variables como strings, e a openssl CLI precisa da versão hexadecimal das strings, sem espaços e novas linhas como mostrarei.

Primeiro, preciso converter as cadeias iv e pass para hexadecimal usando:

Determine o equivalente hexadecimal IV:

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

Determine o equivalente hexadecimal mysecret :

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

Agora mais uma coisa que o passe para php não é o passe para o openssl cli mas o KEY:

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

E agora está funcionando exatamente como o script php!

Importante: eu precisava usar -K em maiúsculas ou a string gerada não é a mesma.

    
por 19.07.2016 / 21:32

Tags