Skip to main content

Non-encrypted confidential information - Hexadecimal

Need

Protection of confidential information through encryption

Context

  • Usage of PHP for server-side scripting and web development
  • Usage of PHP for server-side scripting and web development

Description

Non compliant code

<?php
$confidentialInformation = "Hello, World!";
$hexadecimalEncodedInformation = bin2hex($confidentialInformation);
echo $hexadecimalEncodedInformation;
?>

The above PHP code is a simple example of how confidential information can be encoded into hexadecimal. The variable $confidentialInformation contains the string "Hello, World!" which is then converted into hexadecimal format using the bin2hex() function. The encoded information is then stored in the variable $hexadecimalEncodedInformation.

The vulnerability here is that the confidential information, although encoded in hexadecimal, is not encrypted. This means that it can be easily decoded by an attacker who intercepts the information. For example, the attacker could use a simple online tool or write a script to convert the hexadecimal back into plain text, revealing the confidential information.

In the context of a Laravel backend application, this could be a serious issue if sensitive data such as user passwords or personal details are being encoded in this way and transmitted over an insecure connection. An attacker could potentially intercept and decode this information, leading to a breach of privacy or even identity theft.

While encoding can help obfuscate the data, it should not be relied upon for securing confidential information as it does not provide any real protection against malicious actors. Instead, sensitive data should always be encrypted using a strong encryption algorithm before being transmitted or stored.

Steps

  • Replace the bin2hex function with a secure encryption function. PHP provides several encryption functions such as openssl_encrypt.
  • Generate a secure key for the encryption. The key should be kept secret and not be hard-coded into the application.
  • Use the secure key to encrypt the confidential information before storing or transmitting it.
  • Ensure that the encrypted information is decrypted only when necessary and only in a secure manner.

Compliant code

<?php
$confidentialInformation = "Hello, World!";
$method = 'AES-256-CBC';
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));
$encryptedInformation = openssl_encrypt($confidentialInformation, $method, $key, OPENSSL_RAW_DATA, $iv);
$hexadecimalEncodedInformation = bin2hex($encryptedInformation);
echo $hexadecimalEncodedInformation;
?>

The above code fixes the vulnerability by replacing the bin2hex function with the openssl_encrypt function, which is a secure encryption function provided by PHP.

The openssl_encrypt function takes five parameters: the data to encrypt, the encryption method, the encryption key, options, and an initialization vector (iv).

The encryption method used in this case is 'AES-256-CBC', which is a strong encryption algorithm.

The encryption key and the iv are generated using the openssl_random_pseudo_bytes function. This function generates a string of pseudo-random bytes, which is suitable for creating a secure key and iv.

The openssl_encrypt function returns the encrypted data, which is then encoded in hexadecimal using the bin2hex function.

The encrypted and encoded data is then echoed out.

This way, even if an attacker is able to view the hexadecimal encoded information, they would not be able to decode it into plain text without the encryption key and the iv.

The encryption key and the iv should be kept secret and not be hard-coded into the application. They should be stored in a secure manner, such as in a secure database or a secure configuration file.

The encrypted information should be decrypted only when necessary and only in a secure manner. The decryption should be done using the openssl_decrypt function with the same encryption method, key, and iv.

References