Skip to main content

V6.2.7 Algorithms

Requirement:#

Verify that encrypted data is authenticated via signatures, authenticated cipher modes, or HMAC to ensure that ciphertext is not altered by an unauthorized party.

Explanation:#

Данное требование подчеркивает необходимость проверки целостности и подлинности зашифрованных данных. Это достигается с помощью HMAC (Hash-based Message Authentication Code) для обеспечения того, что шифротекст остается неизменным и не был подделан неавторизованными сторонами.

Remediation:#

Рассмотрим несколько реальных примеров того, как можно реализовать это требование:

Signatures#

Подписи обеспечивают способ проверки целостности и подлинности зашифрованных данных. Они предполагают использование алгоритмов с асимметричными ключами, когда отправитель подписывает данные своим закрытым ключом, а получатель может проверить подпись с помощью соответствующего открытого ключа.

Example in Python (using cryptography library)
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.asymmetric import rsa
# Generate sender's key pair
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
public_key = private_key.public_key()
# Encrypt the data
plaintext = b"Sensitive information"
ciphertext = public_key.encrypt(
plaintext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
# Sign the encrypted data
signature = private_key.sign(
ciphertext,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
# Verify the signature
try:
public_key.verify(
signature,
ciphertext,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("Signature is valid. Data is authentic and unaltered.")
except:
print("Signature is invalid. Data may have been tampered with.")

В этом примере данные шифруются с помощью открытого ключа получателя. Затем отправитель подписывает шифрованный текст с помощью своего закрытого ключа. Получатель может проверить подпись с помощью открытого ключа отправителя, чтобы обеспечить целостность и подлинность зашифрованных данных.

Authenticated Cipher Modes#

Authenticated cipher modes, такие как AES-GCM (Galois/Counter Mode), обеспечивают как конфиденциальность, так и подлинность. Они генерируют метку аутентификации вместе с шифротекстом, которая может быть использована для проверки целостности расшифрованных данных.

Example in Java (using javax.crypto.Cipher with AES-GCM)
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.GCMParameterSpec;
import java.security.SecureRandom;
// Generate a random secret key
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
SecretKey secretKey = keyGen.generateKey();
// Encrypt the data using AES-GCM
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
SecureRandom random = new SecureRandom();
byte[] iv = new byte[12];
random.nextBytes(iv);
GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, gcmSpec);
byte[] ciphertext = cipher.doFinal(plaintext);
// Retrieve the authentication tag
byte[] tag = cipher.getParameters().getParameterSpec(GCMParameterSpec.class).getIV();
// Decrypt the data
cipher.init(Cipher.DECRYPT_MODE, secretKey, gcmSpec);
byte[] decrypted = cipher.doFinal(ciphertext);
// Verify the integrity using the authentication tag
if (MessageDigest.isEqual(tag, iv)) {
System.out.println("Data is authentic and unaltered.");
} else {
System.out.println("Data may have been tampered with.");
}

В этом примере данные шифруются с использованием режима AES-GCM, который генерирует аутентификационную метку вместе с шифротекстом. При расшифровке аутентификационная метка сравнивается с ожидаемым значением для обеспечения целостности расшифрованных данных.

HMAC (Hash-based Message Authentication Code)#

HMAC - это механизм проверки целостности и подлинности данных с использованием общего секретного ключа и криптографической хэш-функции. Он генерирует хэш-значение фиксированного размера, которое добавляется к данным, а получатель может проверить целостность путем повторного вычисления HMAC и сравнения его с полученным хэш-значением.

Example in C#
sing System.Security.Cryptography;
byte[] plaintext = Encoding.UTF8.GetBytes("Sensitive information");
// Generate a random secret key
byte[] key = new byte[32];
using (var rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(key);
}
// Compute the HMAC
using (var hmac = new HMACSHA256(key))
{
byte[] hash = hmac.ComputeHash(plaintext);
// Append the HMAC to the data
byte[] authenticatedData = new byte[plaintext.Length + hash.Length];
Array.Copy(plaintext, 0, authenticatedData, 0, plaintext.Length);
Array.Copy(hash, 0, authenticatedData, plaintext.Length, hash.Length);
// Verify the integrity
byte[] receivedHash = new byte[hmac.HashSize / 8];
byte[] receivedData = new byte[authenticatedData.Length - receivedHash.Length];
Array.Copy(authenticatedData, 0, receivedData, 0, receivedData.Length);
Array.Copy(authenticatedData, receivedData.Length, receivedHash, 0, receivedHash.Length);
if (hmac.ComputeHash(receivedData).SequenceEqual(receivedHash))
{
Console.WriteLine("Data is authentic and unaltered.");
}
else
{
Console.WriteLine("Data may have been tampered with.");
}
}

В этом примере алгоритм HMACSHA256 используется для вычисления HMAC открытого текста. Затем HMAC добавляется к данным, и во время проверки получатель повторно вычисляет HMAC и сравнивает его с полученным хэш-значением для проверки целостности.

Используя подписи, аутентифицированные режимы шифрования или HMAC, вы можете гарантировать, что зашифрованные данные остаются неизменными и не были подделаны неавторизованными сторонами, обеспечивая целостность и подлинность ваших криптографических операций.

Additional:#

CWE - CWE-326: Недостаточная надежность шифрования (4.10) (mitre.org)