Tenho 2 scripts Bash. O primeiro pega 2 strings como argumentos e cria uma variável env com o nome da 1ª string e define seu valor para o valor da 2ª string criptografada com openssl (v3.4.2). O 2º pega 1 string como argumento e gera o valor descriptografado da variável de ambiente cujo nome é o valor da string passada como argumento.
setit.sh
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Usage: $0 <variable_name> <string_to_encrypt>"
exit 1
fi
VAR_NAME=$1
STRING_TO_ENCRYPT=$2
# Generate a random salt and passphrase
SALT=$(openssl rand -hex 8)
PASSPHRASE=$(openssl rand -hex 12)
# Encrypt the string
ENCRYPTED=$(echo -n "$STRING_TO_ENCRYPT" | openssl enc -aes-256-cbc -a -salt -pbkdf2 -pass pass:"$PASSPHRASE" -S "$SALT")
# Combine salt, passphrase, and encrypted string
RESULT="${SALT}:${PASSPHRASE}:${ENCRYPTED}"
# Set the environment variable
export "$VAR_NAME=$RESULT"
echo "Environment variable $VAR_NAME has been set with the encrypted value."
Exemplo de uso
source ./setit.sh MY_VAR secret_value
pegue.sh
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 <variable_name>"
exit 1
fi
VAR_NAME=$1
# Check if the environment variable exists
if [ -z "${!VAR_NAME}" ]; then
echo "Error: Environment variable $VAR_NAME does not exist."
exit 1
fi
# Get the value of the environment variable
ENCRYPTED_VALUE="${!VAR_NAME}\n"
echo "$VAR_NAME = $ENCRYPTED_VALUE"
# Extract salt, passphrase, and encrypted string
IFS=':' read -r SALT PASSPHRASE ENCRYPTED <<< "$ENCRYPTED_VALUE"
# Decrypt the string
DECRYPTED=$(echo -n "$ENCRYPTED" | openssl enc -aes-256-cbc -d -a -pbkdf2 -pass pass:"$PASSPHRASE" -S "$SALT")
# Check if decryption was successful
if [ $? -eq 0 ]; then
echo "Decrypted value of $VAR_NAME:"
echo "$DECRYPTED"
else
echo "Error: Decryption failed. The encrypted value may be corrupted or tampered with."
exit 1
fi
Exemplo de uso
./getit.sh MY_VAR
O primeiro script parece funcionar como esperado, mas quando executo o segundo script para descriptografar o valor, recebo o seguinte erro:
bad decrypt 0031185FF87F0000:error:1C80006B:Provider routines:ossl_cipher_generic_block_final:wrong final block length:providers/implementations/ciphers/ciphercommon.c:444: Erro: Falha na descriptografia. O valor criptografado pode estar corrompido ou adulterado.
A wrong final blocklength
parte me diz que pode ser um problema de preenchimento, mas não tenho certeza.