OWASP-Kategorie: MASVS-CRYPTO: Kryptografie
Übersicht
Ein Pseudozufallszahlengenerator (PRNG) ist ein Algorithmus, der vorhersehbaren Zahlenfolgen basierend auf einem Startwert, der Seed genannt wird. A Eine von PRNG generierte Zahlenfolge hat ungefähr dieselben Eigenschaften wie eine eine echte Zufallszahl, ist aber schneller und rechenintensiver zu erstellen.
Mit anderen Worten: PRNGs haben höhere Zusicherungen als schwache Zufallsgeneratoren (z.B.
java.math.Random
) hinsichtlich der Gleichmäßigkeit der Entropieverteilung, die emulieren,
wirklich zufällige Zahlensequenzen. Die Erzeugung von wirklich zufälligen Zahlen erfordert
spezialisierten Geräten und liegt häufig
außerhalb des normalen Entwicklungsbereichs. Dieses
Das Dokument befasst sich nicht mit der Generierung von Zahlen, sondern nur
PRNGs, da sie die verwendete Standardmethode sind.
Sicherheitslücken bei schwachen PRNGs treten auf, wenn Entwickler einen regulären PRNG für kryptografische Zwecke anstelle eines kryptografisch sicheren PRNG (CSPRNG) verwenden. CSPRNGs haben strengere Anforderungen und wenn der Seed-Wert unbekannt ist, müssen sie einem Angreifer nur einen unerheblichen Vorteil bei der Unterscheidung aus einer tatsächlichen Zufallssequenz stammen.
Angreifer können die generierte Zahlensequenz auch erraten, wenn vorhersehbare Startwerte – z. B. solche, die vom Entwickler hartcodiert wurden – zum Initialisieren eines PRNG oder CSPRNG verwendet werden, da der Angreifer den Startwert erraten und so die vom PRNG generierte Ausgabe vorhersagen kann.
Positiv beeinflussen
Wenn ein nicht kryptografisch sicherer PRNG in einem Sicherheitskontext wie der Authentifizierung verwendet wird, kann ein Angreifer möglicherweise die zufällig generierten Zahlen erraten und so Zugriff auf privilegierte Daten oder Funktionen erhalten.
Abwehrmaßnahmen
Allgemein
- Verwenden Sie
java.security.SecureRandom
, wenn es Sicherheitsrisiken gibt. - Verwenden Sie für alle anderen Fälle
java.util.Random
. Math.random
niemals verwenden.
java.security.SecureRandom
Aus Sicherheitsgründen empfohlen. Wenn die Linux-Kernelversion 5.17 oder höher ist oder das Blockieren des Threads akzeptabel ist, warten Sie, bis genügend Entropie angesammelt wurde, bevor Sie die Zufallszahlen generieren (d. h. /dev/random
verwenden). Rufen Sie dazu getInstanceStrong()
auf:
Kotlin
val rand = SecureRandom.getInstanceStrong()
Java
SecureRandom rand = SecureRandom.getInstanceStrong();
Andernfalls sollte bei Linux-Kernelversionen vor 5.17, wenn das Blockieren des Threads beim Generieren von Zufallszahlen nicht zulässig ist, der SecureRandom
-Konstruktor direkt aufgerufen werden:
Kotlin
import java.security.SecureRandom
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = SecureRandom()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
// Use rand_int for security & authentication
}
}
Java
import java.security.SecureRandom;
public class generateRandom {
public static void main(String args[])
{
// Create instance of SecureRandom class
SecureRandom rand = new SecureRandom();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
// Use rand_int for security & authentication
}
}
SecureRandom
erhält den Standard-Seed von /dev/urandom
und wird automatisch verwendet, wenn das Objekt erstellt oder abgerufen wird. Daher muss der PRNG nicht explizit initialisiert werden. Generell wird eine deterministische Verwendung von SecureRandom
nicht empfohlen, insbesondere wenn dadurch ein Startwert hartcodiert wird, der von jedem sichtbar ist, der die App dekompiliert. Entwickler, die reproduzierbare pseudozufällige Ausgabe generieren möchten, sollten geeignetere Primitive wie HMAC, HKDF und SHAKE verwenden.
java.util.Random
Vermeiden Sie sie für Sicherheits-/Authentifizierungszwecke, für andere Zwecke ist ihre Verwendung akzeptabel.
Kotlin
import java.util.Random
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = Random()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
}
}
Java
import java.util.Random;
public class generateRandom {
public static void main(String args[])
{
// Create instance of Random class
Random rand = new Random();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
}
}
Ressourcen
- java.security.SecureRandom
- java.util.Random
- Math.random
- Vorhersehbare Seed-Rate (CWE)
- Kryptografisch schwacher PRNG CWE
- Java Secure Random
- Java Random und SecureRandom im Vergleich
- SecureRandom verwenden
- Python-PRNG-Sicherheitsinformationen
- OWASP-Kurzübersicht zum kryptografischen Speicher
- CVE-2013-6386: Schwache PRNG-Sicherheitslücke in Drupal
- CVE-2006-3419: Schwache PRNG-Sicherheitslücke in Tor
- CVE-2008-4102: Vorhersehbarer Seed in Joomla
- Zufalls-Patch für den Linux-Kernel