Secure Coding: Sicherere Passwörter mit Salt, Pepper und Hashing

Seite 2: Die wichtigsten Java-Sicherheitsbibliotheken im Ăśberblick

Inhaltsverzeichnis

Die Java Cryptography Architecture (JCA) ist eine API innerhalb des Java Development Kits (JDK), die eine standardisierte Schnittstelle fĂĽr kryptografische Operationen bereitstellt. Ihr Hauptziel ist es, eine flexible, erweiterbare und sichere Plattform fĂĽr verschiedene kryptografische Anwendungen zu schaffen, ohne dass sich Entwickler um die Implementierungsdetails oder spezifische Algorithmen kĂĽmmern mĂĽssen.

Die JCA bietet eine Vielzahl von Funktionen, die für die sichere Verarbeitung und Verwaltung von kryptografischen Operationen erforderlich sind. Dazu gehört die Berechnung kryptografischer Hash-Werte mit Algorithmen wie SHA-256 oder MD5. Zudem stellt sie Mechanismen für symmetrische und asymmetrische Verschlüsselung bereit, beispielsweise mit AES, DES, RSA oder ECC. Digitale Signaturen lassen sich mit Algorithmen wie DSA oder ECDSA erstellen und verifizieren. Auch die Generierung, Speicherung und Verwaltung von kryptografischen Schlüsseln gehören zum Funktionsumfang. Sichere Pseudozufallszahlen lassen sich mit SecureRandom erzeugen, während die Berechnung von Message Authentication Codes (MACs) die Integrität von Nachrichten gewährleistet.

Die Architektur verfolgt mehrere wichtige Ziele, um eine sichere und effiziente Kryptografie in Java zu ermöglichen. Entwickler können kryptografische Funktionen nutzen, ohne sich um die konkrete Implementierung eines Algorithmus kümmern zu müssen, da diese durch Security Provider bereitgestellt werden. Die JCA ermöglicht das einfache Hinzufügen neuer Algorithmen durch das Registrieren neuer Security Provider. Der kryptografische Code lässt sich auf verschiedenen Java-Plattformen ohne Änderungen nutzen. Durch das zentrale Management kryptografischer Funktionen wird sichergestellt, dass nur verifizierte und sichere Implementierungen zum Einsatz kommen. Entwicklern steht eine konsistente API bereit, um verschiedene kryptografische Algorithmen in ihren Anwendungen einzusetzen.

Die JCA ist ein essenzieller Bestandteil der Java-Sicherheitsarchitektur und bildet die Grundlage für eine sichere und flexible Nutzung kryptografischer Mechanismen in Java-Anwendungen. Sie stellt sicher, dass moderne Sicherheitsanforderungen erfüllt werden, während sie gleichzeitig eine modulare und erweiterbare Struktur bietet.

Die Java Cryptography Extension (JCE) ist eine Erweiterung der JCA, die speziell für starke Verschlüsselung entwickelt wurde. Sie ergänzt JCA um erweiterte symmetrische Verschlüsselungs-, Schlüsselverwaltungs- und Message-Authentication-Code-(MAC)-Funktionen. JCE bietet unter anderem Mechanismen für symmetrische Verschlüsselung mit Algorithmen wie AES, DES oder Blowfish, asymmetrische Verschlüsselung mit RSA oder Elliptic Curve Cryptography (ECC) sowie die Berechnung von MACs zum Sicherstellen der Datenintegrität. Darüber hinaus umfasst sie die Verwaltung und Speicherung kryptografischer Schlüssel in Key Stores und unterstützt sichere Zufallszahlengeneratoren.

Während der Einsatz starker Verschlüsselung aufgrund von Exportbeschränkungen früher durch eine separate Unlimited Strength Policy aktiviert werden musste, ist diese seit Java 9 standardmäßig verfügbar. Im Java Development Kit (JDK) sind inzwischen mehrere Implementierungen JCA und der JCE enthalten. Diese werden als Security Provider bezeichnet und stellen verschiedene kryptografische Algorithmen und Dienste bereit.

Um alle auf einem System aktiv verfĂĽgbaren Provider und deren Algorithmen aufzulisten, kann man wie folgt vorgehen:

public class ListAllProviders {
 public static void main(String[] args) {
   for (Provider provider : Security.getProviders()) {
     System.out.println("Provider: " + provider.getName());
   }
 }
}

Ausgabe auf der Konsole:

Provider: SUN
Provider: SunRsaSign
Provider: SunEC
Provider: SunJSSE
Provider: SunJCE
Provider: SunJGSS
Provider: SunSASL
Provider: XMLDSig
Provider: SunPCSC
Provider: JdkLDAP
Provider: JdkSASL
Provider: Apple
Provider: SunPKCS11

Begrenzt man die Ausgabe auf den Provider SUN und den Typ SecureRandom liefert die Konsole folgende Ausgabe:

Provider: SUN
Algorithmus: SHA1PRNG
Algorithmus: NativePRNGBlocking
Algorithmus: NativePRNG
Algorithmus: NativePRNGNonBlocking
Algorithmus: DRBG

Hierbei handelt es sich um die Liste der auf diesem System zur Verfügung stehenden Algorithmen, mit denen sich SecureRandom betreiben lässt.

Zu den standardmäßig in JDK 21 enthaltenen Providern, die eine Reihe kryptografischer Funktionen abdecken, gehören unter anderem:

  • SUN: Bietet grundlegende kryptografische Funktionen wie Message Digests (z. B. SHA-256), digitale Signaturen (DSA, RSA, etc.), SchlĂĽsselpaargeneratoren und sichere Zufallszahlengeneratoren.
  • SunRsaSign: Spezialisiert auf RSA-Algorithmen fĂĽr digitale Signaturen und SchlĂĽsselmanagement.
  • SunJCE: Stellt symmetrische VerschlĂĽsselungsalgorithmen (z. B. AES, DES), SchlĂĽsselvereinbarungsprotokolle und Message Authentication Codes bereit.
  • SunEC: Implementiert Elliptic Curve Cryptography fĂĽr SchlĂĽsselgenerierung, VerschlĂĽsselung und digitale Signaturen.
  • SunJSSE: Bietet die Java Secure Socket Extension (JSSE) fĂĽr SSL/TLS-Kommunikation.
  • SunPKCS11: Ermöglicht die Integration von PKCS#11-kompatiblen Hardware-Sicherheitsmodulen (HSMs) und Token.

Ferner können Entwickler bei Bedarf externe Provider wie BouncyCastle integrieren. Um zum Beispiel BouncyCastle als Security Provider in JCA/JCE hinzuzufügen, muss die Bibliothek zunächst in das Projekt eingebunden werden. Dies kann über Maven mit org.bouncycastle:bcprov-jdk21:1.76 oder durch manuelles Hinzufügen der JAR-Datei erfolgen. Anschließend wird BouncyCastle in der Security-Provider-Liste registriert:

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;
public class BouncyCastleIntegration {
    public static void main(String[] args) {
        Security.addProvider(new BouncyCastleProvider());
        System.out.println("BouncyCastle Provider hinzugefĂĽgt: " 
                     + Security.getProvider("BC"));
    }
}

Nach der Registrierung lassen sich die erweiterten Algorithmen und Funktionen von BouncyCastle in der JCA/JCE-Architektur nutzen, um Zugriff auf weitere Algorithmen oder spezielle Funktionen zu erhalten. Es ist wichtig zu beachten, dass die Verfügbarkeit und der Umfang der Algorithmen je nach Provider variieren können. Die JCA-Architektur ermöglicht es jedoch, verschiedene Provider nahtlos zu integrieren und bei Bedarf zu erweitern.

FĂĽr detaillierte Informationen zu den verfĂĽgbaren Providern und ihren unterstĂĽtzten Algorithmen in dem jeweils verwendeten JDK empfiehlt es sich, die offizielle Dokumentation des JDK zu konsultieren.