Inadequate Encryption Strength Using Weak Keys in java.security
Package
Using weak key sizes for cryptographic algorithms like RSA and DSA can compromise the security of your encryption and digital signatures. Here's a brief overview of the risks associated with weak key sizes for these algorithms:
RSA (Rivest-Shamir-Adleman): RSA is widely used for both encryption and digital signatures. Weak key sizes in RSA can be vulnerable to factorization attacks, such as the famous RSA-129 challenge, which was factored in 1994 after 17 years of effort. Using small key sizes makes it easier for attackers to factor the modulus and recover the private key.
It's generally recommended to use RSA key sizes of 2048 bits or more for security in the present day, with 3072 bits or higher being increasingly preferred for long-term security.
DSA (Digital Signature Algorithm): DSA is used for digital signatures and relies on the discrete logarithm problem. Using weak key sizes in DSA can make it susceptible to attacks that involve solving the discrete logarithm problem, like the GNFS (General Number Field Sieve) algorithm.
For DSA, key sizes of 2048 bits or more are recommended for modern security. Note that DSA is not as commonly used as RSA or ECC for new applications, and ECDSA (Elliptic Curve Digital Signature Algorithm) is often preferred due to its efficiency and strong security properties.
Example
import java.security.*;
public class KeyPairGeneratorRSA {
public static void main(String[] args) {
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
} catch (NoSuchAlgorithmException e) {
System.err.println("RSA algorithm not available.");
}
}
}
Remediation
Its recommended to increase the key size to at least 2048 for DSA and RSA algorithms.
import java.security.*;
public class KeyPairGeneratorRSA {
public static void main(String[] args) {
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
} catch (NoSuchAlgorithmException e) {
System.err.println("RSA algorithm not available.");
}
}
}
False Positives
In the case of a false positive the rule can be suppressed. Simply add a
trailing or preceding comment line with either the rule ID (JAV003
) or
rule category name (inadequate_encryption_strength
).
- Using rule ID
- Using category name
import java.security.*;
public class KeyPairGeneratorRSA {
public static void main(String[] args) {
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
// suppress: JAV003
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
} catch (NoSuchAlgorithmException e) {
System.err.println("RSA algorithm not available.");
}
}
}
import java.security.*;
public class KeyPairGeneratorRSA {
public static void main(String[] args) {
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
// suppress: inadequate_encryption_strength
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
} catch (NoSuchAlgorithmException e) {
System.err.println("RSA algorithm not available.");
}
}
}