Skip to main content

V6.3.1 Random Values

Requirement:#

Verify that all random numbers, random file names, random GUIDs, and random strings are generated using the cryptographic module's approved cryptographically secure random number generator when these random values are intended to be not guessable by an attacker.

Explanation:#

Π”Π°Π½Π½ΠΎΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ относится ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ случайных чисСл, случайных ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ², случайных GUID ΠΈ случайных строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ³Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌΠΈ. Для выполнСния этого трСбования Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ криптографичСски Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ случайных чисСл (CSPRNG), прСдоставляСмый криптографичСским ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ.

CSPRNG ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ случайных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ статистичСски нСпрСдсказуСмы ΠΈ устойчивы ΠΊ криптографичСским Π°Ρ‚Π°ΠΊΠ°ΠΌ. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ источники энтропии, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Π΅ события ΠΈΠ»ΠΈ ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΠΎΡΡ‚ΡŒ, прСдоставляСмая систСмой, для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ высококачСствСнных случайных чисСл.

Remediation:#

Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ трСбования Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языках программирования.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ трСбования с использованиСм языка программирования Python ΠΈ модуля 'secrets':

Python (using the 'secrets' module)
import secrets
## Generate a cryptographically secure random number
random_number = secrets.randbelow(100)
## Generate a cryptographically secure random file name
random_file_name = secrets.token_hex(16) + '.txt'
## Generate a cryptographically secure random GUID
random_guid = secrets.token_hex(16)
## Generate a cryptographically secure random string
random_string = secrets.token_urlsafe(16)
print(random_number)
print(random_file_name)
print(random_guid)
print(random_string)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ трСбования с использованиСм языка программирования Java ΠΈ класса java.security.SecureRandom:

Java (using the java.security.SecureRandom class)
import java.security.SecureRandom;
SecureRandom random = new SecureRandom();
// Generate a cryptographically secure random number
int randomNumber = random.nextInt(100);
// Generate a cryptographically secure random file name
String randomFileName = Long.toHexString(random.nextLong()) + ".txt";
// Generate a cryptographically secure random GUID
byte[] randomGuidBytes = new byte[16];
random.nextBytes(randomGuidBytes);
String randomGuid = javax.xml.bind.DatatypeConverter.printHexBinary(randomGuidBytes);
// Generate a cryptographically secure random string
byte[] randomStringBytes = new byte[16];
random.nextBytes(randomStringBytes);
String randomString = java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(randomStringBytes);
System.out.println(randomNumber);
System.out.println(randomFileName);
System.out.println(randomGuid);
System.out.println(randomString);

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ трСбования с использованиСм языка программирования C# ΠΈ класса System.Security.Cryptography.RandomNumberGenerator:

C# (using the System.Security.Cryptography.RandomNumberGenerator class)
using System.Security.Cryptography;
// Generate a cryptographically secure random number
byte[] randomNumberBytes = new byte[4];
using (var rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(randomNumberBytes);
}
int randomNumber = BitConverter.ToInt32(randomNumberBytes, 0) % 100;
// Generate a cryptographically secure random file name
byte[] randomFileNameBytes = new byte[8];
using (var rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(randomFileNameBytes);
}
string randomFileName = BitConverter.ToString(randomFileNameBytes).Replace("-", "") + ".txt";
// Generate a cryptographically secure random GUID
byte[] randomGuidBytes = new byte[16];
using (var rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(randomGuidBytes);
}
Guid randomGuid = new Guid(randomGuidBytes);
// Generate a cryptographically secure random string
byte[] randomStringBytes = new byte[16];
using (var rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(randomStringBytes);
}
string randomString = Convert.ToBase64String(randomStringBytes).TrimEnd('=').Replace('+', '-').Replace('/', '_');
Console.WriteLine(randomNumber);
Console.WriteLine(randomFileName);
Console.WriteLine(randomGuid);
Console.WriteLine(randomString);

Π’ этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… криптографичСскиС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ('secrets' Π² Python, 'SecureRandom' Π² Java, 'RNGCryptoServiceProvider' Π² C#) ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ бСзопасныС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ случайных чисСл, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π½Π΅ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΊ Π°Ρ‚Π°ΠΊΠ°ΠΌ Π½Π° ΡƒΠ³Π°Π΄Ρ‹Π²Π°Π½ΠΈΠ΅.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ бСзопасныС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ случайных чисСл ΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½Π½Ρ‹Ρ… криптографичСских ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ случайныС числа, ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ², GUID ΠΈ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‡Π΅Π½ΡŒ устойчивы ΠΊ ΡƒΠ³Π°Π΄Ρ‹Π²Π°Π½ΠΈΡŽ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌΠΈ.